From patchwork Tue Sep 1 09:05:18 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dario Binacchi X-Patchwork-Id: 4827 Return-Path: X-Original-To: linux-amarula@patchwork.amarulasolutions.com Delivered-To: linux-amarula@patchwork.amarulasolutions.com Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by ganimede.amarulasolutions.com (Postfix) with ESMTPS id 16A9240D07 for ; Tue, 1 Sep 2026 11:09:35 +0200 (CEST) Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-495529a93f9sf41273495e9.3 for ; Tue, 01 Sep 2026 02:09:35 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1788253774; cv=pass; d=google.com; s=arc-20260327; b=UPJ2ONmUwAj9PPhnEyGMdlB1hXO7czESLCjvpUNeZkouZN6vf06/f9bE7sw1ibfwyM m9psr2uJCrIA2CeLIXt+8GEN9qCJkYhST27LM39tmPkCVhKmawrxvSY9EXG5tVNZf1+F B5itxREzlH8TTdyPLRtsy21o0yfG41ASSv6g/NY09vxwsNjKnpcwCiwzZZ14nMERNV9V wkcMp1xNjDubLbo2KrScZvIqAz2c+fiejt3+ATQduwdXXrh+sliqMvoJs9iis6rD33uL HdwEBuUNfJfRjWQz+SZxitTUtLjXzIl4mFwNtNHemB1c8lUTkGwG6gTA+WLi3hTPEkDW Dadg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=list-unsubscribe:list-archive:list-help:list-post:list-id :mailing-list:precedence:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=L71kepUGTpOKBQqxtu7eLReVKkXSz3R8qLwFPbuo09Y=; fh=cbOoee7BnSB+4Rx6QukHiFGfb0Z4qg+TzfFPPwefMNY=; b=cGBABdTuRQhWTpyykIoH54InfVj2kWT5UvBJVfdPmzNOg23z+uClbDXkC5xQbKnX87 Jib9D2/bws8uYJFXN8ijv6nb3gJK7R/n4fcEFMCEbwtVR3gKf93FS+xzExc1LPfvsiRH pnsDVEht8CRZ1AeSE95i+KFwGZph4SmJmEp6Zw70ZEwSmdV/PUO5OAsee0YShs0v2KuL MaaAQwsp4me9e4SyB2OIg97j6gFFoigS7ITkPa0QIU9TH/7nf33DRbWT87Opmld52NzP wnIVblI5AvRH53Ayvd+W9e/ws5hdTzWQuX+gGOi820PTQHrwIS89Lx/HfhcKED1AlbPB qFZA==; darn=patchwork.amarulasolutions.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=BoLUcQz3; spf=pass (google.com: domain of dario.binacchi@amarulasolutions.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=dario.binacchi@amarulasolutions.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=amarulasolutions.com; dara=neutral header.i=@amarulasolutions.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; t=1788253774; x=1788858574; darn=patchwork.amarulasolutions.com; h=list-unsubscribe:list-archive:list-help:list-post:list-id :mailing-list:precedence:content-type :x-original-authentication-results:x-original-sender:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from:from:to :cc:subject:date:message-id:reply-to:content-type; bh=L71kepUGTpOKBQqxtu7eLReVKkXSz3R8qLwFPbuo09Y=; b=Q572P3eCNS/30+geurR+HQSIpJvwpGz6/2TphhXppABZA8uIxOXnEVWBoBU1tsg2ff BLvJNPa01cka5aCCeoxhKBEFx1hg6enrz2w7omeElvAgDl9cvHY0QD4SMEMytFz8RT65 DSEPJfdARWGj4QlGeBvIr6eYEw0JaLanOB/Uk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788253774; x=1788858574; h=list-unsubscribe:list-archive:list-help:list-post :x-spam-checked-in-group:list-id:mailing-list:precedence :content-type:x-original-authentication-results:x-original-sender :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:x-gm-gg:x-beenthere:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=L71kepUGTpOKBQqxtu7eLReVKkXSz3R8qLwFPbuo09Y=; b=LtbGDcPjI7C+Ok//EM77cgD98UU4xnzvQVp/r5l+3O9yt9Wb0JmmXWQAOxJsSDZ5T6 MS46kUuE/cqhgAVQBfYX5jIQ6/Qan9zqo4uMhikxdNBCOqIwpkIB24JMVsuoe/3K9yWW zjbqCYWOILMu9t6FmYGDANuL7pIIrzBSfxvoezS3VvJ8j/UkrxlI5VM4Q2VmEYC7YL5f xd18hpiHtKuCBieGtsVfOefnDHv4Oi1Gub2+102naavPyN2Nzid/YGZAUAVAeC2JVMqb HDwYtSrfCQbjNI24K/lsHCvELjI2xZe4bjYnkdMl/06HmZKWinlSqTYEomBPPa1Rk9kb 9X7Q== X-Forwarded-Encrypted: i=2; AHgh+Rq2b9qXMWuF7sbCtkEf4dJaAma5q958JvPnVWnkUGwtRbRtKTgQ5FX7vdo00SXw+896JB14eHOkAjU0iCLF@patchwork.amarulasolutions.com X-Gm-Message-State: AFuF++lbkkCX6f61LsN0SgOdlNnytSrI+klF+KNfvkqygOVTeE6iSN45 RCIln/MM/QsGRheNPRktdG9CazglIaDJmGLaR1dAvt7fzIQOGaxTFYa3JjikXZViRbkTow== X-Received: by 2002:a05:600c:8b86:b0:493:f5bf:4dc6 with SMTP id 5b1f17b1804b1-49b91c2777emr572348445e9.7.1788253774614; Tue, 01 Sep 2026 02:09:34 -0700 (PDT) X-BeenThere: linux-amarula@amarulasolutions.com; h="ATskLdc9ny3SZjhv10gXupEpH45tzaxDf89a5lPNjMg/CyIy/g==" Received: by 2002:a05:600c:1991:b0:49b:d9b:b1bf with SMTP id 5b1f17b1804b1-49b1cf7970fls39739505e9.0.-pod-prod-04-eu; Tue, 01 Sep 2026 02:09:32 -0700 (PDT) X-Received: by 2002:a05:600c:4453:b0:499:8777:ccba with SMTP id 5b1f17b1804b1-49b91c486abmr442829055e9.12.1788253772417; Tue, 01 Sep 2026 02:09:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1788253772; cv=none; d=google.com; s=arc-20260327; b=fJ8/aUt+cypmHGV7X23Zu7UegOKkkHdxpmpBFzvPhRYrK7tO2OUc9CCKvvoWb31D8X jko/+LC6kK9YpxnBupoO3iYNhXgz73yy5xKrXGgNq04xwa8ISr+VbNoLs+XZucmMJYqQ 8adNDu/s3CJeVB6VzNDbKBUKKoB0IN6Yre0DX0DWtgpLoD04SRPMDxvqt+yf8SgXl/hx Xtfom/l3OLKMaZzkfMDiQvncO4Ll2ZCSH8Z4llal7vO6WqhXliTXg9GDMqH4oFhiXChq PxVznbwT95YTAFngMF7xU01pOo9i72CLnijYn9N1rTDC6Da5N/QZazAZPCoWFHDfup5l XPug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=awL7EJRIIWZmZbuML6Yj4uYN8A8XYeaOTFa5cFWKueY=; fh=zuTFvgUbDA4p+duRUtqF1kHsKgia+Oibpqem6QzXfB0=; b=Ge7kNrGiNEUuBZ2H1dZ3mWekLiNzF4Jy/rh3d5Qofq4AtjxpHcXvF6nLVnVi7NrlEQ abgaDaDDyVR6K54kQdFbbuZKRBgEOmyELK9gWwKptRz+j2vNWi3QizxZnfV+oqlNpaF2 o4B3qdp6TNZWRP5mvd1tYkhJCBFMDp7xFoLQ4JcTgQ236nTwefqmTvTL/z27fC9k8INI cI4nt3OLGD+uzTa8khr4HhIVl0JQMN+nCRGZ1f1nvo4Znu0yGOdoPw0g2Xuj5yhL3oJS khRgoUXVl30K4YpSw0GeZKKBYuXqdD87T7Ss5N5RzxPreIhSWXywTteoiko5PCq9Gqv1 kITA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=BoLUcQz3; spf=pass (google.com: domain of dario.binacchi@amarulasolutions.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=dario.binacchi@amarulasolutions.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=amarulasolutions.com; dara=neutral header.i=@amarulasolutions.com Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) by mx.google.com with SMTPS id 5b1f17b1804b1-49b9509adebsor14990605e9.11.2026.09.01.02.09.31 for (Google Transport Security); Tue, 01 Sep 2026 02:09:31 -0700 (PDT) Received-SPF: pass (google.com: domain of dario.binacchi@amarulasolutions.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; X-Gm-Gg: AR+sD1363hJnnS33LWl2pmpjxlq1/rmyhTEXqOxp1fsjCw0tanqEWVnbH0dKoQKKIMB /lw3l8eh+5pWURXbyjdjZB48sWaKsqA1suyLf0hkruWSp2AoSp84d9ygencUyVxRQMcgyK85aj9 4zlftqeTnzR2zgL91SNLjKcBCIV9gqI8ynVD7p69RduEOCywyWl30/wx0H9JxabnOwfVK4z2W/7 N3jiiRBaRPTBURXNJU8wsfaESAQ+mMxHd7PT9b1mXSG/4CXHyVnRORuNQ6ruIoWkS3GU6Ckjgv3 TuRreZm1ppD6NRiUKZtXqN2Dc3eLXYSWhF6Y8V8TI/+UajUIHGGd0pbts8QhmHhMFX2YgJxxKDi xmBCQjHlTq86DyeXZ2bkchOgyRc1Yt4Dta1oUkl4YNv2xzxxXMB64htV4GISVesYSyKZfW0lIV7 H5kbjrtNSBJGSEksq7DdtBa1swBvDJ3QGoF+JAaQVDOer0Qw3pvEsWMLRNWKtfGmDsmVr37+0TV WSrp5j9Lgj4PhwckgQaDhtE4Kg9lFurZMsAicSbT7SWzQxUVfS0EJEBxr/GXWJFTyvSiwJTapbs g/6Mz92nP6qzZFUbPseqtr1Q/ajnUkpHDhIFyM9/7sW/ocsqPLoOGVM= X-Received: by 2002:a05:600c:19c8:b0:49b:c8e:a211 with SMTP id 5b1f17b1804b1-49b91c20bfamr497636215e9.5.1788253771241; Tue, 01 Sep 2026 02:09:31 -0700 (PDT) Received: from dario-ThinkPad-P14s-Gen-5.amarulasolutions.com (host-87-9-102-148.retail.telecomitalia.it. [87.9.102.148]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-48442c425cesm3825273f8f.6.2026.09.01.02.09.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 01 Sep 2026 02:09:30 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: linux-amarula@amarulasolutions.com, Dario Binacchi , Abel Vesa , Brian Masney , Fabio Estevam , Frank Li , Jerome Brunet , Peng Fan , Pengutronix Kernel Team , Sascha Hauer , Stephen Boyd , imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-clk@vger.kernel.org Subject: [PATCH v11 2/2] clk: imx: pll14xx: support spread spectrum clock generation Date: Tue, 1 Sep 2026 11:05:18 +0200 Message-ID: <20260901090912.585681-3-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260901090912.585681-1-dario.binacchi@amarulasolutions.com> References: <20260901090912.585681-1-dario.binacchi@amarulasolutions.com> MIME-Version: 1.0 X-Original-Sender: dario.binacchi@amarulasolutions.com X-Original-Authentication-Results: mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=BoLUcQz3; spf=pass (google.com: domain of dario.binacchi@amarulasolutions.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=dario.binacchi@amarulasolutions.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=amarulasolutions.com; dara=neutral header.i=@amarulasolutions.com Content-Type: text/plain; charset="UTF-8" Precedence: list Mailing-list: list linux-amarula@amarulasolutions.com; contact linux-amarula+owners@amarulasolutions.com List-ID: X-Spam-Checked-In-Group: linux-amarula@amarulasolutions.com X-Google-Group-Id: 476853432473 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , Add support for spread spectrum clock (SSC) generation to the pll14xx driver. Tested on the video PLL of i.MX8MN and i.MX8MP based boards. Signed-off-by: Dario Binacchi --- Changes in v11: - Drop the dt-bindings/clock/clock.h include and use the enum clk_ssc_method values from clk-provider.h, as clk-scmi-oem.c does. - Disable SSC and clear the modulation fields in SSCG_CTRL when no spread method is configured, so that a setup left enabled by the bootloader is not kept active. - Skip the SSC setup instead of dividing by zero when modfreq_hz is zero or mfr truncates to zero. - Reject mfr and mrr values that do not fit the MFREQ_CTL and MRAT_CTL register fields instead of letting FIELD_PREP silently truncate them. This also prevents the 10000 * mfr multiplication from overflowing. - Compute the mfr divisor in 64-bit arithmetic, as the 32-bit product could wrap with out of range modfreq_hz values. Changes in v10: - Drop 'Reviewed-by' tag of Peng Fan. - Adapt the driver to the new infrastructure. Implement the set_spread_spectrum() and get the modulation parameters from struct clk_spread_spectrum. Changes in v9: - Add 'Reviewed-by' tag of Peng Fan. drivers/clk/imx/clk-pll14xx.c | 79 +++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/drivers/clk/imx/clk-pll14xx.c b/drivers/clk/imx/clk-pll14xx.c index b6f1cc9f5700..0c2b812ba20c 100644 --- a/drivers/clk/imx/clk-pll14xx.c +++ b/drivers/clk/imx/clk-pll14xx.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -22,6 +23,8 @@ #define GNRL_CTL 0x0 #define DIV_CTL0 0x4 #define DIV_CTL1 0x8 +#define SSCG_CTRL 0xc + #define LOCK_STATUS BIT(31) #define LOCK_SEL_MASK BIT(29) #define CLKE_MASK BIT(11) @@ -33,6 +36,13 @@ #define KDIV_MASK GENMASK(15, 0) #define KDIV_MIN SHRT_MIN #define KDIV_MAX SHRT_MAX +#define SSCG_ENABLE BIT(31) +#define MFREQ_CTL_MASK GENMASK(19, 12) +#define MRAT_CTL_MASK GENMASK(9, 4) +#define SEL_PF_DOWN_SPREAD 0 +#define SEL_PF_UP_SPREAD 1 +#define SEL_PF_CENTER_SPREAD 2 +#define SEL_PF_MASK GENMASK(1, 0) #define LOCK_TIMEOUT_US 10000 @@ -44,6 +54,7 @@ struct clk_pll14xx { int rate_count; s16 delta_k; spinlock_t lock; + struct clk_spread_spectrum ss_conf; }; #define to_clk_pll14xx(_hw) container_of(_hw, struct clk_pll14xx, hw) @@ -366,6 +377,58 @@ static int clk_pll1416x_set_rate(struct clk_hw *hw, unsigned long drate, return 0; } +static void __clk_pll1443x_set_spread_spectrum(struct clk_hw *hw, + unsigned long parent_rate, + unsigned int pdiv, + unsigned int mdiv) +{ + struct clk_pll14xx *pll = to_clk_pll14xx(hw); + struct clk_spread_spectrum *conf = &pll->ss_conf; + u32 sscg_ctrl, mfr, mrr, sel_pf; + + sscg_ctrl = readl_relaxed(pll->base + SSCG_CTRL); + sscg_ctrl &= ~(SSCG_ENABLE | MFREQ_CTL_MASK | MRAT_CTL_MASK | SEL_PF_MASK); + + switch (conf->method) { + case CLK_SPREAD_CENTER: + sel_pf = SEL_PF_CENTER_SPREAD; + break; + case CLK_SPREAD_UP: + sel_pf = SEL_PF_UP_SPREAD; + break; + case CLK_SPREAD_DOWN: + sel_pf = SEL_PF_DOWN_SPREAD; + break; + default: + /* No spread: disable modulation and clear any stale state */ + goto out; + } + + if (!conf->modfreq_hz) + goto out; + + mfr = div64_u64(parent_rate, (u64)conf->modfreq_hz * pdiv * BIT(5)); + if (!mfr || mfr > FIELD_MAX(MFREQ_CTL_MASK)) { + pr_warn("%s: SSC disabled, modulation frequency (%u Hz) out of range\n", + clk_hw_get_name(hw), conf->modfreq_hz); + goto out; + } + + mrr = (conf->spread_bp * mdiv * BIT(6)) / (10000 * mfr); + if (!mrr || mrr > FIELD_MAX(MRAT_CTL_MASK)) { + pr_warn("%s: SSC disabled, spread (%u permyriad) out of range\n", + clk_hw_get_name(hw), conf->spread_bp); + goto out; + } + + sscg_ctrl |= SSCG_ENABLE | FIELD_PREP(MFREQ_CTL_MASK, mfr) | + FIELD_PREP(MRAT_CTL_MASK, mrr) | + FIELD_PREP(SEL_PF_MASK, sel_pf); + +out: + writel_relaxed(sscg_ctrl, pll->base + SSCG_CTRL); +} + static int clk_pll1443x_set_rate(struct clk_hw *hw, unsigned long drate, unsigned long prate) { @@ -390,6 +453,9 @@ static int clk_pll1443x_set_rate(struct clk_hw *hw, unsigned long drate, writel_relaxed(FIELD_PREP(KDIV_MASK, rate.kdiv), pll->base + DIV_CTL1); + __clk_pll1443x_set_spread_spectrum(hw, prate, rate.pdiv, + rate.mdiv); + spin_unlock_irqrestore(&pll->lock, flags); return 0; @@ -411,6 +477,8 @@ static int clk_pll1443x_set_rate(struct clk_hw *hw, unsigned long drate, writel_relaxed(FIELD_PREP(KDIV_MASK, rate.kdiv), pll->base + DIV_CTL1); + __clk_pll1443x_set_spread_spectrum(hw, prate, rate.pdiv, rate.mdiv); + spin_unlock_irqrestore(&pll->lock, flags); /* @@ -437,6 +505,16 @@ static int clk_pll1443x_set_rate(struct clk_hw *hw, unsigned long drate, return 0; } +static int clk_pll1443x_set_spread_spectrum(struct clk_hw *hw, + const struct clk_spread_spectrum *ss_conf) +{ + struct clk_pll14xx *pll = to_clk_pll14xx(hw); + + memcpy(&pll->ss_conf, ss_conf, sizeof(pll->ss_conf)); + + return 0; +} + static int clk_pll14xx_prepare(struct clk_hw *hw) { struct clk_pll14xx *pll = to_clk_pll14xx(hw); @@ -509,6 +587,7 @@ static const struct clk_ops clk_pll1443x_ops = { .recalc_rate = clk_pll14xx_recalc_rate, .determine_rate = clk_pll1443x_determine_rate, .set_rate = clk_pll1443x_set_rate, + .set_spread_spectrum = clk_pll1443x_set_spread_spectrum, }; struct clk_hw *imx_dev_clk_hw_pll14xx(struct device *dev, const char *name,