From patchwork Thu Dec 21 11:38:38 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Ceclan, Dumitru" X-Patchwork-Id: 13501752 Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.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 15B196DCF5; Thu, 21 Dec 2023 11:38:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nmjIcpmY" Received: by mail-wr1-f45.google.com with SMTP id ffacd0b85a97d-33664b4e038so585241f8f.3; Thu, 21 Dec 2023 03:38:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1703158738; x=1703763538; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=RMm8zv9Z35kfc5G03goO2WZtkIVh50f0pyRY4VXxFeA=; b=nmjIcpmY4vP3OaJqBqelA1npWI3OBtwTdaOEJxXZW41XxFPAVE0lx9x5kEz0kULPqw QcDlHZHylDnHrPxL2+h8+gp0/hMJhvR0WPBhskFx6gKBcC7UrdfSryRfIxJZzzPOa+RN hSiJH6nHsHRsC/AWxGSdJ3f4mr/L4ZYAFFxfULtuUvk362MflygkCBY/K4TWkpEXkVxj 99M0zlnyVxGQAXagTCi5q/+VTAmO1q4xgWMX7Wp66sE9S9Xs0KF0gzkoVmDUCIRYDfZB mqAmQwkJ4Mfxy/Umm2q0C1rj5IqekpkGqXy6WEBUJiRtVffr/1008k2iGKcfBTruOJT8 D1aQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1703158738; x=1703763538; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RMm8zv9Z35kfc5G03goO2WZtkIVh50f0pyRY4VXxFeA=; b=EwYpiTApwS7QM6uXPBe7i0e1Q4an/1dtK//xaRVbUlAKRXGxMCUYD3/+zHFq263Sm9 GkVSwXGg1kG75CUICpYod52AeI67ts+7QD4l6spY5E9nOkgiQc6O66joH40fp8kKO8f2 D6mH3EJKxCUQFe9GgUlE7tZRW2Ip2kaauuDApJwLGcnTVGc74SxPJrmdOVOjzEjl3SdW WpsuIcfqnSAN/STdY72AxFkTNY4T1+BcZsuvOkO8/OEf93toQFBYaJcjuPPq4e6R+5LZ gh3AngAmkt3WiuRKK9L4GRMkJXrtkV1jyeKvQIl8DGc7m969AKCQEqkEofxMtXF4Ibua iIfA== X-Gm-Message-State: AOJu0Yw5PP2xeDYHIAByVKHS5Qe1FFfTH0uSAiYnIC2ZUMtERUduB3nd YsTTAdCfLdt7t2dig5fk1k48+JmL9Qx8bw== X-Google-Smtp-Source: AGHT+IFy0iFzXTrN/MFkPuGfj8NQK+drRNF0WfZNeM/uI4dYSLRZnJ1ONSZgUXaEJzGtQpkG4QfWSw== X-Received: by 2002:a05:600c:a297:b0:40c:6138:981a with SMTP id hu23-20020a05600ca29700b0040c6138981amr592707wmb.38.1703158737974; Thu, 21 Dec 2023 03:38:57 -0800 (PST) Received: from HYB-hhAwRlzzMZb.ad.analog.com ([213.157.161.11]) by smtp.gmail.com with ESMTPSA id fl25-20020a05600c0b9900b0040b3e26872dsm10940404wmb.8.2023.12.21.03.38.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Dec 2023 03:38:57 -0800 (PST) From: Dumitru Ceclan To: Cc: Lars-Peter Clausen , Jonathan Cameron , Rob Herring , Krzysztof Kozlowski , Conor Dooley , linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Ceclan Dumitru , Dumitru Ceclan Subject: [PATCH 1/3] dt-bindings: iio: hmc425a: add entry for LTC6373 Date: Thu, 21 Dec 2023 13:38:38 +0200 Message-ID: <20231221113842.25957-2-mitrutzceclan@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20231221113842.25957-1-mitrutzceclan@gmail.com> References: <20231221113842.25957-1-mitrutzceclan@gmail.com> Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 The LTC6373 is a silicon, 3-bit Fully-Differential digital instrumentation amplifier that supports the following programmable gains (Vout/Vin): G = 0.25, 0.5, 1, 2, 4, 8, 16 + Shutdown. Signed-off-by: Dumitru Ceclan --- .../bindings/iio/amplifiers/adi,hmc425a.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Documentation/devicetree/bindings/iio/amplifiers/adi,hmc425a.yaml b/Documentation/devicetree/bindings/iio/amplifiers/adi,hmc425a.yaml index 67de9d4e3a1d..8e7d99823059 100644 --- a/Documentation/devicetree/bindings/iio/amplifiers/adi,hmc425a.yaml +++ b/Documentation/devicetree/bindings/iio/amplifiers/adi,hmc425a.yaml @@ -21,6 +21,8 @@ description: | HMC540S 1 dB LSB Silicon MMIC 4-Bit Digital Positive Control Attenuator, 0.1 - 8 GHz https://www.analog.com/media/en/technical-documentation/data-sheets/hmc540s.pdf + LTC6373 is a 3-Bit precision instrumentation amplifier with fully differential outputs + https://www.analog.com/media/en/technical-documentation/data-sheets/ltc6373.pdf properties: compatible: @@ -28,6 +30,7 @@ properties: - adi,adrf5740 - adi,hmc425a - adi,hmc540s + - adi,ltc6373 vcc-supply: true @@ -38,6 +41,19 @@ properties: minItems: 6 maxItems: 6 +allOf: + - if: + properties: + compatible: + contains: + const: adi,ltc6373 + + then: + properties: + ctrl-gpios: + minItems: 3 + maxItems: 3 + required: - compatible - ctrl-gpios From patchwork Thu Dec 21 11:38:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Ceclan, Dumitru" X-Patchwork-Id: 13501753 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 023C76E5AA; Thu, 21 Dec 2023 11:39:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="RrfjNQd1" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-40c339d2b88so6921845e9.3; Thu, 21 Dec 2023 03:39:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1703158740; x=1703763540; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Z0/TYd/8rVyUf11DYs46AxL5K7um2W7Rvs+jbNKoDFo=; b=RrfjNQd1SkcvXtE8VJGpTfLSkXtz/D2tysmfAO/6CKmaTuSBthNBspJJodJz3xgG1A XRjqaXBEwb2rzWAaSNMySg6J2G6yQx3WETeqwK9cevu69FbMr93t9oy8rfPa89Eg42GT R3szgWVoHhw6mwHrKaORKTKH5v0lTedAOEAWyrSftIRbN7KU3wp93XC5/JnzLgW4OtDj Wx0nV/6r7sPH16E3cMxUjV202VJrKhtydA1Qd8rZnzJDLdMtXjIACGN8uEBJ1Yldz2NB dvRW/NWVFnoZcJ/kWfVZOQ8j29XbkowMW811ZQZCq4A6ChUcwAq5wS5MTqY+yCw2aBYU H30g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1703158740; x=1703763540; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Z0/TYd/8rVyUf11DYs46AxL5K7um2W7Rvs+jbNKoDFo=; b=h05q/E9F/u760tr6cw6MpWGb/kH2+21rO12JHiooBZy97/aqVxzsQYeQnR/hcqZL4J vUsQjLdbTCXFRSxPY9jo3rrfurqxXAWt/hNh3QCp8C4qLLeYN+nY/tq+96zx88vJuaFn lOBgi7cww0j0rURO3D91IzsRRXkq2hvHTsUb6aS6dJsswtDrs8P6DOxr5goEfYt9ge2O j/yO1ZJUjGQsaT0jmvDoy5ncamgg0mHHTXP9lGcbv0Xrv8zka2Oh9+mpj94RSsTv7ESH 16bAMft7eWDxdF+B7dIhHboW2OvRPLm1F5B6bFSHloDjZ0A1gBYJVzPow1zWhEG6ZUtL 4crQ== X-Gm-Message-State: AOJu0YyuMhYD2ZzslRMiuenf3B9Fvu7qvtbM+tIv9K8PEijFooUvoYj0 4MxVXmZYg6Baq9E7soa+mGs= X-Google-Smtp-Source: AGHT+IFr1yaSw8trK5frteAEEJccS+RNZHpn7HuXmQ69F3+1PucV4dhn84sD+bN4J/nDvZmxj5IsHg== X-Received: by 2002:a05:600c:1548:b0:40c:2e1c:8f93 with SMTP id f8-20020a05600c154800b0040c2e1c8f93mr659929wmg.179.1703158739869; Thu, 21 Dec 2023 03:38:59 -0800 (PST) Received: from HYB-hhAwRlzzMZb.ad.analog.com ([213.157.161.11]) by smtp.gmail.com with ESMTPSA id fl25-20020a05600c0b9900b0040b3e26872dsm10940404wmb.8.2023.12.21.03.38.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Dec 2023 03:38:59 -0800 (PST) From: Dumitru Ceclan To: Cc: Lars-Peter Clausen , Jonathan Cameron , Rob Herring , Krzysztof Kozlowski , Conor Dooley , linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Ceclan Dumitru , Dumitru Ceclan Subject: [PATCH 2/3] iio: amplifiers: hmc425a: move conversion logic Date: Thu, 21 Dec 2023 13:38:39 +0200 Message-ID: <20231221113842.25957-3-mitrutzceclan@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20231221113842.25957-1-mitrutzceclan@gmail.com> References: <20231221113842.25957-1-mitrutzceclan@gmail.com> Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Move gain-dB<->code conversion logic from read_raw and write_raw to hmc425a_gain_dB_to_code() and hmc425a_code_to_gain_dB(). Signed-off-by: Dumitru Ceclan --- drivers/iio/amplifiers/hmc425a.c | 100 ++++++++++++++++++------------- 1 file changed, 57 insertions(+), 43 deletions(-) diff --git a/drivers/iio/amplifiers/hmc425a.c b/drivers/iio/amplifiers/hmc425a.c index ed4d72922696..b5fd19403d15 100644 --- a/drivers/iio/amplifiers/hmc425a.c +++ b/drivers/iio/amplifiers/hmc425a.c @@ -56,35 +56,70 @@ static int hmc425a_write(struct iio_dev *indio_dev, u32 value) return 0; } +static int hmc425a_gain_dB_to_code(struct hmc425a_state *st, int val, int val2, int *code) +{ + struct hmc425a_chip_info *inf = st->chip_info; + int gain, temp; + + if (val < 0) + gain = (val * 1000) - (val2 / 1000); + else + gain = (val * 1000) + (val2 / 1000); + + if (gain > inf->gain_max || gain < inf->gain_min) + return -EINVAL; + + switch (st->type) { + case ID_HMC425A: + *code = ~((abs(gain) / 500) & 0x3F); + break; + case ID_HMC540S: + *code = ~((abs(gain) / 1000) & 0xF); + break; + case ID_ADRF5740: + temp = (abs(gain) / 2000) & 0xF; + *code = temp & BIT(3) ? temp | BIT(2) : temp; + break; + } + return 0; +} + +static int hmc425a_code_to_gain_dB(struct hmc425a_state *st, int *val, int *val2) +{ + int code, gain; + + code = st->gain; + switch (st->type) { + case ID_HMC425A: + gain = ~code * -500; + break; + case ID_HMC540S: + gain = ~code * -1000; + break; + case ID_ADRF5740: + code = code & BIT(3) ? code & ~BIT(2) : code; + gain = code * -2000; + break; + } + + *val = gain / 1000; + *val2 = (gain % 1000) * 1000; + return 0; +} + static int hmc425a_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long m) { struct hmc425a_state *st = iio_priv(indio_dev); - int code, gain = 0; int ret; mutex_lock(&st->lock); switch (m) { case IIO_CHAN_INFO_HARDWAREGAIN: - code = st->gain; - - switch (st->type) { - case ID_HMC425A: - gain = ~code * -500; - break; - case ID_HMC540S: - gain = ~code * -1000; - break; - case ID_ADRF5740: - code = code & BIT(3) ? code & ~BIT(2) : code; - gain = code * -2000; + ret = hmc425a_code_to_gain_dB(st, val, val2); + if (ret) break; - } - - *val = gain / 1000; - *val2 = (gain % 1000) * 1000; - ret = IIO_VAL_INT_PLUS_MICRO_DB; break; default: @@ -100,36 +135,15 @@ static int hmc425a_write_raw(struct iio_dev *indio_dev, int val2, long mask) { struct hmc425a_state *st = iio_priv(indio_dev); - struct hmc425a_chip_info *inf = st->chip_info; - int code = 0, gain; - int ret; - - if (val < 0) - gain = (val * 1000) - (val2 / 1000); - else - gain = (val * 1000) + (val2 / 1000); - - if (gain > inf->gain_max || gain < inf->gain_min) - return -EINVAL; - - switch (st->type) { - case ID_HMC425A: - code = ~((abs(gain) / 500) & 0x3F); - break; - case ID_HMC540S: - code = ~((abs(gain) / 1000) & 0xF); - break; - case ID_ADRF5740: - code = (abs(gain) / 2000) & 0xF; - code = code & BIT(3) ? code | BIT(2) : code; - break; - } + int code = 0, ret; mutex_lock(&st->lock); switch (mask) { case IIO_CHAN_INFO_HARDWAREGAIN: + ret = hmc425a_gain_dB_to_code(st, val, val2, &code); + if (ret) + break; st->gain = code; - ret = hmc425a_write(indio_dev, st->gain); break; default: From patchwork Thu Dec 21 11:38:40 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Ceclan, Dumitru" X-Patchwork-Id: 13501754 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (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 B8A0D697B4; Thu, 21 Dec 2023 11:39:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="fQT4GPr9" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-40c256ffdbcso7700565e9.2; Thu, 21 Dec 2023 03:39:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1703158742; x=1703763542; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=LqSYpHf1/FbLuBZDQt+DqkeQkv3UvQKwqCA0rndeeF4=; b=fQT4GPr9wLSx2P0fqOn404yk/LHkRPPK3vjTLmJngYLWa5a/faoCjekYdgXbgmY3/s QQegiVEO57FcMuH2PYsWj8zIanLTrbtXFD02oV24cKhtv2bmrdMExaVGEXku9QtGyOkK mKSi0RH1Q44udAYTw3vdCoflQLX3himhU75l7uEf+AMwA1YQkXBcE5cEDjDzY7GB3F14 Tqndbg3QpGCCmvZbKv8eumVBsdn6gYaIGEFLFAplt7Rkw8WOT8LYaK0I5nhuHXiJoFjL zJZC/QxhtzM8iJI7m8/TgFDEOvN4mZR7lEHc6OgauO4aKuc+Zzv74CTWsdy5RXSNv3jF UlLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1703158742; x=1703763542; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=LqSYpHf1/FbLuBZDQt+DqkeQkv3UvQKwqCA0rndeeF4=; b=ogDULhXD/FQ/Bu0XceYshpDKLN2pxRzUHxb2Zr5xaCe5a0Uscflk/4OWg0IYIhcLoj rC172ykisT9ILlVHPYvSsSj9mlLxhOsPSa3+wRMrJ+P2bVnSteFD2nfJs5FskeK40HWZ xWDpFQzspvir8+03TjGn390YkPjHDZhA4MtHJzjcvh92Q0hi7/poQM0Muaanj7JUULtw 9ufjtCO2oY5H9dZbc0Q57xqBBpF5l4RZyv6bOs0q+nfTdQmAcL41npnQh64IrH4Lha5v KWBrYxvxP9zg/S/lbx3yWaLwfK4TC21jz6ecByuvbanVA2+5y0snwxlJfpiF9JLkAWcA AGvA== X-Gm-Message-State: AOJu0Ywk27hO1Bq1I14Dn0CgaN2uUZXLZYmnKtct2a6J0u+XZlkRIuc/ lQJLthH3ZAI8riuWH3ci2XM= X-Google-Smtp-Source: AGHT+IHqmtlPObdCHfV3z7QJW2WeL5kq4RokaiCmAhU3UYEhZcm3ufXs0xWkSt8lJn8YhSZsTaqHSw== X-Received: by 2002:a05:600c:4592:b0:40b:5e21:d360 with SMTP id r18-20020a05600c459200b0040b5e21d360mr682155wmo.105.1703158741723; Thu, 21 Dec 2023 03:39:01 -0800 (PST) Received: from HYB-hhAwRlzzMZb.ad.analog.com ([213.157.161.11]) by smtp.gmail.com with ESMTPSA id fl25-20020a05600c0b9900b0040b3e26872dsm10940404wmb.8.2023.12.21.03.39.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Dec 2023 03:39:01 -0800 (PST) From: Dumitru Ceclan To: Cc: Lars-Peter Clausen , Jonathan Cameron , Rob Herring , Krzysztof Kozlowski , Conor Dooley , linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Ceclan Dumitru , Dumitru Ceclan Subject: [PATCH 3/3] iio: amplifiers: hmc425a: add support for LTC6373 Instrumentation Amplifier Date: Thu, 21 Dec 2023 13:38:40 +0200 Message-ID: <20231221113842.25957-4-mitrutzceclan@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20231221113842.25957-1-mitrutzceclan@gmail.com> References: <20231221113842.25957-1-mitrutzceclan@gmail.com> Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 This adds support for LTC6373 36 V Fully-Differential Programmable-Gain Instrumentation Amplifier with 25 pA Input Bias Current. The user can program the gain to one of seven available settings through a 3-bit parallel interface (A2 to A0). Signed-off-by: Dumitru Ceclan --- drivers/iio/amplifiers/hmc425a.c | 78 +++++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 2 deletions(-) diff --git a/drivers/iio/amplifiers/hmc425a.c b/drivers/iio/amplifiers/hmc425a.c index b5fd19403d15..27fdc32a0457 100644 --- a/drivers/iio/amplifiers/hmc425a.c +++ b/drivers/iio/amplifiers/hmc425a.c @@ -2,9 +2,10 @@ /* * HMC425A and similar Gain Amplifiers * - * Copyright 2020 Analog Devices Inc. + * Copyright 2020, 2023 Analog Devices Inc. */ +#include #include #include #include @@ -20,10 +21,23 @@ #include #include +/* + * The LTC6373 amplifier supports configuring gain using GPIO's with the following + * values (OUTPUT_V / INPUT_V): 0(shutdown), 0.25, 0.5, 1, 2, 4, 8, 16 + * + * Except for the shutdown value, all can be converted to dB using 20 * log10(x) + * From here, it is observed that all values are multiples of the '2' gain setting, + * with the correspondent of 6.020dB. + */ +#define LTC6373_CONVERSION_CONSTANT 6020 +#define LTC6373_CONVERSION_MASK GENMASK(2, 0) +#define LTC6373_SHUTDOWN GENMASK(2, 0) + enum hmc425a_type { ID_HMC425A, ID_HMC540S, - ID_ADRF5740 + ID_ADRF5740, + ID_LTC6373, }; struct hmc425a_chip_info { @@ -42,6 +56,8 @@ struct hmc425a_state { struct gpio_descs *gpios; enum hmc425a_type type; u32 gain; + bool enabled; + }; static int hmc425a_write(struct iio_dev *indio_dev, u32 value) @@ -80,6 +96,17 @@ static int hmc425a_gain_dB_to_code(struct hmc425a_state *st, int val, int val2, temp = (abs(gain) / 2000) & 0xF; *code = temp & BIT(3) ? temp | BIT(2) : temp; break; + case ID_LTC6373: + if (!st->enabled) + return -EPERM; + + /* add half of the value for rounding */ + temp = LTC6373_CONVERSION_CONSTANT / 2; + if (val < 0) + temp *= -1; + *code = ~((gain + temp) / LTC6373_CONVERSION_CONSTANT + 3) + & LTC6373_CONVERSION_MASK; + break; } return 0; } @@ -100,6 +127,12 @@ static int hmc425a_code_to_gain_dB(struct hmc425a_state *st, int *val, int *val2 code = code & BIT(3) ? code & ~BIT(2) : code; gain = code * -2000; break; + case ID_LTC6373: + if (!st->enabled) + return -EPERM; + gain = ((~code & LTC6373_CONVERSION_MASK) - 3) * + LTC6373_CONVERSION_CONSTANT; + break; } *val = gain / 1000; @@ -122,6 +155,10 @@ static int hmc425a_read_raw(struct iio_dev *indio_dev, break; ret = IIO_VAL_INT_PLUS_MICRO_DB; break; + case IIO_CHAN_INFO_ENABLE: + *val = st->enabled; + ret = IIO_VAL_INT; + break; default: ret = -EINVAL; } @@ -146,6 +183,17 @@ static int hmc425a_write_raw(struct iio_dev *indio_dev, st->gain = code; ret = hmc425a_write(indio_dev, st->gain); break; + case IIO_CHAN_INFO_ENABLE: + switch (st->type) { + case ID_LTC6373: + code = (val) ? st->gain : LTC6373_SHUTDOWN; + st->enabled = val; + ret = hmc425a_write(indio_dev, code); + break; + default: + ret = -EINVAL; + } + break; default: ret = -EINVAL; } @@ -161,6 +209,8 @@ static int hmc425a_write_raw_get_fmt(struct iio_dev *indio_dev, switch (mask) { case IIO_CHAN_INFO_HARDWAREGAIN: return IIO_VAL_INT_PLUS_MICRO_DB; + case IIO_CHAN_INFO_ENABLE: + return IIO_VAL_INT; default: return -EINVAL; } @@ -181,15 +231,30 @@ static const struct iio_info hmc425a_info = { .info_mask_separate = BIT(IIO_CHAN_INFO_HARDWAREGAIN), \ } +#define LTC6373_CHAN(_channel) \ +{ \ + .type = IIO_VOLTAGE, \ + .output = 1, \ + .indexed = 1, \ + .channel = _channel, \ + .info_mask_separate = BIT(IIO_CHAN_INFO_HARDWAREGAIN) | \ + BIT(IIO_CHAN_INFO_ENABLE), \ +} + static const struct iio_chan_spec hmc425a_channels[] = { HMC425A_CHAN(0), }; +static const struct iio_chan_spec ltc6373_channels[] = { + LTC6373_CHAN(0), +}; + /* Match table for of_platform binding */ static const struct of_device_id hmc425a_of_match[] = { { .compatible = "adi,hmc425a", .data = (void *)ID_HMC425A }, { .compatible = "adi,hmc540s", .data = (void *)ID_HMC540S }, { .compatible = "adi,adrf5740", .data = (void *)ID_ADRF5740 }, + { .compatible = "adi,ltc6373", .data = (void *)ID_LTC6373 }, {}, }; MODULE_DEVICE_TABLE(of, hmc425a_of_match); @@ -222,6 +287,15 @@ static struct hmc425a_chip_info hmc425a_chip_info_tbl[] = { .gain_max = 0, .default_gain = 0xF, /* set default gain -22.0db*/ }, + [ID_LTC6373] = { + .name = "ltc6373", + .channels = ltc6373_channels, + .num_channels = ARRAY_SIZE(ltc6373_channels), + .num_gpios = 3, + .gain_min = -12041, /* gain setting x0.25*/ + .gain_max = 24082, /* gain setting x16 */ + .default_gain = LTC6373_SHUTDOWN, + }, }; static int hmc425a_probe(struct platform_device *pdev)