From nobody Fri Oct 3 08:50:31 2025 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9DA95309DDF; Wed, 3 Sep 2025 12:48:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756903691; cv=none; b=ZYsKaU83XbQDTpMh4TgGfKQ7WPkqQd+xs2OyeAifCtkfwj0mw1dBD0y5DqIPMzdoqKlXW3WDcp1w/wJwfb+w3PzyN7ZawAkKfY/ot1aUfnJ5sETN1ythq2izyVfyFhJSe7nBXKEZp/CHP5J8pZxTykh0N8TttDmY2oGgJRGdEsI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756903691; c=relaxed/simple; bh=W4Ta+ycjb4QCLgW02FiMWVfiz5MCgzdDYWA7YCly94w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PF0DdVJPwsgH9rd1mJULpSwfVuTRcKtegvlVd3DnTa0GtOH61S0Bcd/Ci6rj3tua4uPIsKjIkT7N0BQyXhOy+empOu9X4BEq6K70p7wUSoR/j4Vh+XsyjRHSkjSVuu0hmhy3+buBBa/mdOMO76QvI1ynRi5i7GaIKgPqCMeuAgg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=oEn+P8eU; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="oEn+P8eU" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 458FF4E40C0A; Wed, 3 Sep 2025 12:48:08 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 1E6ED606C3; Wed, 3 Sep 2025 12:48:08 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 031EA1C22C3F8; Wed, 3 Sep 2025 14:48:04 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1756903686; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=0wxZt/suAs12evWL3lnT9+Z1yeWU0cypzlWRzlgafgY=; b=oEn+P8eUGsBESsg/56v4rbCZsIviEdBIhoCdgmr/qkSZR8gDDQZvm6aGdAc0GG7pGB2Pjt +Rddl84zplPWl4wzW6JGryHtbreCd71fc1GVQhuyvem0I0BjCjkBML9JogBIfJQbRsMm9j 9L8w3ukRyRFzaatPkECaheWuRWzY1H75jHCaIoTVyJ5fp41cnGlEbpNWZPxo/Jqzzr7oNU uMYjjOMMopj9P4Yu9d0cdjs+RrSrw3HO54dvtxriRZLm5QwsdwuvGYQaq9NX+kSTRTdhFe tudDhOIA1uqO90sE7l1CFJKu5NvIXlu7AP9ctpPOyXO0nOavH39ZXRG2C58v/A== From: =?utf-8?q?Beno=C3=AEt_Monin?= Date: Wed, 03 Sep 2025 14:47:23 +0200 Subject: [PATCH 16/19] clk: eyeq: add two PLL types 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: <20250903-clk-eyeq7-v1-16-3f5024b5d6e2@bootlin.com> References: <20250903-clk-eyeq7-v1-0-3f5024b5d6e2@bootlin.com> In-Reply-To: <20250903-clk-eyeq7-v1-0-3f5024b5d6e2@bootlin.com> To: Vladimir Kondratiev , Gregory CLEMENT , =?utf-8?q?Th=C3=A9o_Lebrun?= , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thomas Bogendoerfer , Michael Turquette , Stephen Boyd , Philipp Zabel Cc: Thomas Petazzoni , linux-mips@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org, Tawfik Bayouk , Sari Khoury , =?utf-8?q?Beno=C3=AEt_Monin?= X-Mailer: b4 0.14.2 X-Last-TLS-Session-Version: TLSv1.3 Add the handling of the two types of PLL found in the eyeQ7H OLB. The JFRACR PLL have similar properties as the FRACG PLL, but its configuration is spread on three registers instead of two. The AINTP PLL does not support spread spectrum and uses a single register. Signed-off-by: Beno=C3=AEt Monin --- drivers/clk/clk-eyeq.c | 117 +++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 117 insertions(+) diff --git a/drivers/clk/clk-eyeq.c b/drivers/clk/clk-eyeq.c index 07a205fefd93eed8f9c2c6b88fbf5b8b6a39a92c..cf745671d86a5fc770ec3599561= eb3468e13bd58 100644 --- a/drivers/clk/clk-eyeq.c +++ b/drivers/clk/clk-eyeq.c @@ -70,8 +70,44 @@ #define FRACG_PCSR1_DOWN_SPREAD BIT(11) #define FRACG_PCSR1_FRAC_IN GENMASK(31, 12) =20 +#define JFRACR_PCSR0_BYPASS BIT(0) +#define JFRACR_PCSR0_PLL_EN BIT(1) +#define JFRACR_PCSR0_FOUTVCO_EN BIT(2) +#define JFRACR_PCSR0_FOUTPOSTDIV_EN BIT(3) +#define JFRACR_PCSR0_POST_DIV1 GENMASK(6, 4) +#define JFRACR_PCSR0_POST_DIV2 GENMASK(9, 7) +#define JFRACR_PCSR0_REF_DIV GENMASK(15, 10) +#define JFRACR_PCSR0_FB_DIV GENMASK(27, 16) +#define JFRACR_PCSR0_VCO_SEL GENMASK(29, 28) +#define JFRACR_PCSR0_PLL_LOCKED GENMASK(31, 30) + +#define JFRACR_PCSR1_FRAC_IN GENMASK(23, 0) +#define JFRACR_PCSR1_FOUT4PHASE_EN BIT(24) +#define JFRACR_PCSR1_DAC_EN BIT(25) +#define JFRACR_PCSR1_DSM_EN BIT(26) +/* Bits 31..27 are reserved */ +#define JFRACR_PCSR2_RESET BIT(0) +#define JFRACR_PCSR2_DIS_SSCG BIT(1) +#define JFRACR_PCSR2_DOWN_SPREAD BIT(2) +#define JFRACR_PCSR2_SSGC_DIV GENMASK(7, 4) +#define JFRACR_PCSR2_SPREAD GENMASK(12, 8) +/* Bits 31..13 are reserved */ + +#define AINTP_PCSR_BYPASS BIT(0) +#define AINTP_PCSR_PLL_EN BIT(1) +#define AINTP_PCSR_FOUTVCO_EN BIT(2) +#define AINTP_PCSR_FOUTPOSTDIV_EN BIT(3) +#define AINTP_PCSR_POST_DIV1 GENMASK(6, 4) +#define AINTP_PCSR_POST_DIV2 GENMASK(9, 7) +#define AINTP_PCSR_REF_DIV GENMASK(15, 10) +#define AINTP_PCSR_FB_DIV GENMASK(27, 16) +#define AINTP_PCSR_VCO_SEL GENMASK(29, 28) +#define AINTP_PCSR_PLL_LOCKED GENMASK(31, 30) + enum eqc_pll_type { EQC_PLL_FRACG, + EQC_PLL_JFRACR, + EQC_PLL_AINTP, }; =20 struct eqc_pll { @@ -236,12 +272,93 @@ static int eqc_pll_parse_fracg(void __iomem *base, un= signed long *mult, return 0; } =20 +static int eqc_pll_parse_jfracr(void __iomem *base, unsigned long *mult, + unsigned long *div, unsigned long *acc) +{ + u64 val; + u32 r0, r1, r2; + u32 spread; + + val =3D readq(base); + r0 =3D val; + r1 =3D val >> 32; + r2 =3D readl(base + 8); + + if (r0 & JFRACR_PCSR0_BYPASS) { + *mult =3D 1; + *div =3D 1; + *acc =3D 0; + return 0; + } + + if (!(r0 & JFRACR_PCSR0_PLL_LOCKED)) + return -EINVAL; + + *mult =3D FIELD_GET(JFRACR_PCSR0_FB_DIV, r0); + *div =3D FIELD_GET(JFRACR_PCSR0_REF_DIV, r0); + + if (r1 & JFRACR_PCSR1_DSM_EN) { + *div *=3D (1ULL << 20); + *mult =3D *mult * (1ULL << 20) + FIELD_GET(JFRACR_PCSR1_FRAC_IN, r1); + } + + if (!*mult || !*div) + return -EINVAL; + + if (r2 & (JFRACR_PCSR2_RESET | JFRACR_PCSR2_DIS_SSCG)) { + *acc =3D 0; + return 0; + } + + spread =3D FIELD_GET(JFRACR_PCSR2_SPREAD, r2); + *acc =3D spread * 500000; + + if (r2 & JFRACR_PCSR2_DOWN_SPREAD) { + *mult *=3D 2000 - spread; + *div *=3D 2000; + eqc_pll_downshift_factors(mult, div); + } + + return 0; +} + +static int eqc_pll_parse_aintp(void __iomem *base, unsigned long *mult, + unsigned long *div, unsigned long *acc) +{ + u32 r0; + + /* no spread spectrum */ + *acc =3D 0; + + r0 =3D readl(base); + if (r0 & AINTP_PCSR_BYPASS) { + *mult =3D 1; + *div =3D 1; + return 0; + } + + if (!(r0 & AINTP_PCSR_PLL_LOCKED)) + return -EINVAL; + + *mult =3D FIELD_GET(AINTP_PCSR_FB_DIV, r0); + *div =3D FIELD_GET(AINTP_PCSR_REF_DIV, r0); + + if (!*mult || !*div) + return -EINVAL; + + return 0; +} + static int eqc_parse_one_pll(void __iomem *base, enum eqc_pll_type type, u= nsigned long *mult, unsigned long *div, unsigned long *acc) { switch (type) { case EQC_PLL_FRACG: return eqc_pll_parse_fracg(base, mult, div, acc); + case EQC_PLL_JFRACR: + return eqc_pll_parse_jfracr(base, mult, div, acc); + case EQC_PLL_AINTP: + return eqc_pll_parse_aintp(base, mult, div, acc); } return -EINVAL; } --=20 2.51.0