From nobody Mon Oct 6 06:27:12 2025 Received: from mail-ot1-f53.google.com (mail-ot1-f53.google.com [209.85.210.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 05671241C8C for ; Thu, 24 Jul 2025 23:26:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753399564; cv=none; b=ggOhIEWXZ1OADNlJHxZug5Nz+OJ6NBtwuRma8k2W5wD/5EMXvZX+1K7rCuCdwFXcNj7s+4Mpt42LaRsPSsSMGPj5bCUutuPbwp3GxSki0E/18ngtRYym+jWvCXVHQnMbL9kW7lB9ovPj6SPRfaE9RJ7F0hvmGc++60c4q3I1m/M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753399564; c=relaxed/simple; bh=fmzrk3rncQ2eQJPl7/ykSHqygcx2eIUuyWJF71tkk88=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CwGiyhBMw3txoyqSyld/rhYUS3uonA8ee0U5/otYQ8X5RS9plc7R/oEkWIkjYMCOZQVCNM8k3XeTkVA5jBL04etbOQTFv5Q0dAOax+pSNc7Ss4YHgODQYM48AeVDDZNiPi/CeW13OxuFTNEE/oK0ze25AEf0Mg27V9zm3gEMNbk= 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=TZSTRtdQ; arc=none smtp.client-ip=209.85.210.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="TZSTRtdQ" Received: by mail-ot1-f53.google.com with SMTP id 46e09a7af769-73e58d51060so367228a34.0 for ; Thu, 24 Jul 2025 16:26:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1753399562; x=1754004362; 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=xlq3slX2bsUlFc85XSNMVLB7rlXT9FRFe+4IGTFjGSM=; b=TZSTRtdQKFHFSJoUdjKep2Xy1DFakfvjK0C8VCYAeJUqCLJLHX0023CnANwrRx/4BQ wDTAqzUGAKBRGropeOFzCoPgu/wpwX2Pk6V2aiYM01VIiB3kREMvufdfFHp5PN7Lx2v1 ICjtWiN1AJLAM2qNbD+0HKW+aAllgTDuS4mT7RJHSwHPb8LYLh4xW3H0Ebs1KTRq3He5 Yq493ZmY3NO8c3E8SpfdLv/4icPtohqyBOoMXhFpZSXflmulTL7tZvFRTeHkDf3gCw0W 1Hizejj6shyG8hjknzFQiSM0RCatmm54K6T+4eY8zmXaHi9F1jkBkURuuggW4UgModX8 c4GA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753399562; x=1754004362; 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=xlq3slX2bsUlFc85XSNMVLB7rlXT9FRFe+4IGTFjGSM=; b=nyZ2pBl9BgLKT1z8Cna5bmEllry077a0jZgQvkTrxPz5hcV5cMlOBMQO0mwMLVxd80 sCbmLVUaBDvZWe2UpuBDNL1AMQ7o2jrgbcPWNY6ocEA4XJl6F/RlD/y7TgTHg2tfJccu wSRLBvQetMR6lvPEysKHdhyjWgno3CRfa1zjeOpBA7spg6Bxc71A+4alUJ8UJaGIks0V el2bOzAXNBCxPLQd9MHUQIpTiLyRUdpxVZEPftQFDPulZBcbLnk5irLFdnawDKCpinnA 9e14fFOx2/2KBH1bFkrv9DKHz88aYubbACCksF8AXSBnaJ7+6zORv0jBwBfTXCv3I8nW +Q3g== X-Forwarded-Encrypted: i=1; AJvYcCUdrvIU+nkxYsY/OcwilN5R+09zALd2otk49+Ne7arN5SSiNVEFpSO1/YLZelfsTZgpie2oHg8/6P2f3Js=@vger.kernel.org X-Gm-Message-State: AOJu0YxH449N2J32OnDRw9VcksHZjFIfyWqiEj2JbzGt/H7Z+Xv/rAOV JpQ7Ku68uE/V1Zo7oDXpToSMKflKPZuNSUpZA0TIchuunmQ/hi+n5ylKWlSmwUvsudA= X-Gm-Gg: ASbGncvZ9A75ti4XI2B0EFL8rB0J7abiDwxtCQb7rRA5bGQup+X5VJhKJlWt65XUQ9a S5KA8dLzrBvhqoEQocrpezqYJhGvHls3Kll2f8/aSVEgwJQyO+hzsmj71sdfV9kNtcCulU8x9Mk K5bzzRZT3PUYU3YgcWcPPntk15/vhrL4PhvoAs4JYhi9xkyiTzHyazjTuvAYchL4RqIEjQkp6Hb vnDsWdveYKzQRZeKNCyfFEq5jiM0Y8Jg0CXpoW77aSM2TVYlmil4vUp7DhKFLQmt4yJfPPLm/LE DTXaitu58c+McVvBdCVfYzBvn5h0USC3j5xatoP/I9HilToYW+CxfBR1JE/N+FVyFfEI/TnKICt 6uKYdLnlv+uT2jO0GrhKhYGGL5Q== X-Google-Smtp-Source: AGHT+IGXTeHfeTVdmPBOo1aDwZVmbv/cw0ywKYUGitHn1VBq90zI7BwPKf14+Skvya3y6GRy/CD8LA== X-Received: by 2002:a05:6871:e2:b0:2d5:2955:aa6c with SMTP id 586e51a60fabf-306c72cce28mr5986875fac.31.1753399562041; Thu, 24 Jul 2025 16:26:02 -0700 (PDT) Received: from [127.0.1.1] ([2600:8803:e7e4:1d00:337f:e3bf:e9d2:b3]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-306e3971332sm689626fac.0.2025.07.24.16.26.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Jul 2025 16:26:01 -0700 (PDT) From: David Lechner Date: Thu, 24 Jul 2025 18:25:24 -0500 Subject: [PATCH 3/4] iio: adc: ad7124: add external clock 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: <20250724-iio-adc-ad7124-proper-clock-support-v1-3-88f35db2fcaf@baylibre.com> References: <20250724-iio-adc-ad7124-proper-clock-support-v1-0-88f35db2fcaf@baylibre.com> In-Reply-To: <20250724-iio-adc-ad7124-proper-clock-support-v1-0-88f35db2fcaf@baylibre.com> To: Michael Hennerich , Jonathan Cameron , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, David Lechner X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3341; i=dlechner@baylibre.com; h=from:subject:message-id; bh=fmzrk3rncQ2eQJPl7/ykSHqygcx2eIUuyWJF71tkk88=; b=owEBbQGS/pANAwAKAcLMIAH/AY/AAcsmYgBogsD5s1McE7kRUhIIogZWzaUMIjXrjyhzmcgAj +M7x5Yx7F6JATMEAAEKAB0WIQTsGNmeYg6D1pzYaJjCzCAB/wGPwAUCaILA+QAKCRDCzCAB/wGP wPVkCACawH5RuJizqdWBRyp6wOto4jBK0NiQjllUY5OLK3zasHiNJXwem8MGPlOgbBwgpkC7vE+ fQKJx3KYe66Y1dzsa40poFOtsAuKTMFt180/U5o+K5mFYrmIxy444hQKs2NRj0hg2EJSfVxBSr8 kEskDVwdm6WDeYef+E6Fw2eePTtA7VTg1rdYs1yeDhGxl9GDPcHmEnYTynSr54Va7Qy5gSQiQXt +xbVWxpg3BeKIBwuPerIwB+sFSvoZpzJh4bJl702OgzM5mPVqbrXTHnhjwR6zFRkv3/rzbtJl/b vnbHxDtn05ZIgnL7ZlkKY5FsNfVtIuQgWDlJ8A+AVAmPnCTC X-Developer-Key: i=dlechner@baylibre.com; a=openpgp; fpr=8A73D82A6A1F509907F373881F8AF88C82F77C03 Add support for an external clock source to the AD7124 ADC driver. Previously, the driver only supported using the internal clock and had bad devicetree bindings that used a fake clock to essentially select the power mode. This is preserved for backwards compatibility. If the clock is not named "mclk", then we know that the devicetree is using the correct bindings and we can configure the chip to use an external clock source rather than internal. Also drop a redundant comment when configuring the register fields instead of adding more. Signed-off-by: David Lechner --- drivers/iio/adc/ad7124.c | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/drivers/iio/adc/ad7124.c b/drivers/iio/adc/ad7124.c index f587574e8a24040540a470e13fed412ec9c81971..b0b03f838eed730347a3afcd759= be7c1a8ab201e 100644 --- a/drivers/iio/adc/ad7124.c +++ b/drivers/iio/adc/ad7124.c @@ -18,6 +18,7 @@ #include #include #include +#include =20 #include #include @@ -44,6 +45,11 @@ #define AD7124_STATUS_POR_FLAG BIT(4) =20 /* AD7124_ADC_CONTROL */ +#define AD7124_ADC_CONTROL_CLK_SEL GENMASK(1, 0) +#define AD7124_ADC_CONTROL_CLK_SEL_INT 0 +#define AD7124_ADC_CONTROL_CLK_SEL_INT_OUT 1 +#define AD7124_ADC_CONTROL_CLK_SEL_EXT 2 +#define AD7124_ADC_CONTROL_CLK_SEL_EXT_DIV4 3 #define AD7124_ADC_CONTROL_MODE GENMASK(5, 2) #define AD7124_ADC_CONTROL_MODE_CONTINUOUS 0 #define AD7124_ADC_CONTROL_MODE_SINGLE 1 @@ -1112,7 +1118,7 @@ static int ad7124_parse_channel_config(struct iio_dev= *indio_dev, static int ad7124_setup(struct ad7124_state *st) { struct device *dev =3D &st->sd.spi->dev; - unsigned int power_mode; + unsigned int power_mode, clk_sel; struct clk *mclk; int i, ret; =20 @@ -1155,9 +1161,41 @@ static int ad7124_setup(struct ad7124_state *st) if (ret) return dev_err_probe(dev, ret, "Failed to set mclk rate\n"); } + + clk_sel =3D AD7124_ADC_CONTROL_CLK_SEL_INT; + } else { + struct clk *clk; + + clk =3D devm_clk_get_optional_enabled(dev, NULL); + if (IS_ERR(clk)) + return dev_err_probe(dev, PTR_ERR(clk), "Failed to get external clock\n= "); + + if (clk) { + unsigned long clk_hz; + + clk_hz =3D clk_get_rate(clk); + if (!clk_hz) + return dev_err_probe(dev, -EINVAL, "Failed to get external clock rate\= n"); + + /* + * The external clock may be 4x the nominal clock rate, + * in which case the ADC needs to be configured to + * divide it by 4. Using MEGA is a bit arbitrary, but + * the expected clock rates are either 614.4 kHz or + * 2.4576 MHz, so this should work. + */ + if (clk_hz > MEGA) + clk_sel =3D AD7124_ADC_CONTROL_CLK_SEL_EXT_DIV4; + else + clk_sel =3D AD7124_ADC_CONTROL_CLK_SEL_EXT; + } else { + clk_sel =3D AD7124_ADC_CONTROL_CLK_SEL_INT; + } } =20 - /* Set the power mode */ + st->adc_control &=3D ~AD7124_ADC_CONTROL_CLK_SEL; + st->adc_control |=3D FIELD_PREP(AD7124_ADC_CONTROL_CLK_SEL, clk_sel); + st->adc_control &=3D ~AD7124_ADC_CONTROL_POWER_MODE; st->adc_control |=3D FIELD_PREP(AD7124_ADC_CONTROL_POWER_MODE, power_mode= ); =20 --=20 2.43.0