From nobody Sat Sep 26 07:15:40 2026 Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (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 019B84E80C0 for ; Thu, 3 Sep 2026 15:38:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788449938; cv=none; b=feAdAW3h6Trt6a8Xyo62TGeOXDYcxDqGyY/IHD1SeiiZL3LOFFGPXvFxSb6bCPKQVkdKw1LCPEL2YeUQTdtMmOtyKXRB1jVRRxzVWrvH/+svQ3ovFPPklkOuw7ZeNpK5gE/RPoch78HDj3iHYT3oAjwRidjsR7dresMHzNNqUYo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788449938; c=relaxed/simple; bh=jqDxNsidN6eFRCeVQqRvHX95xR+s3cpiy6Fu25B0d+o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FuN3LuO8MgTwVilUn6tYQeml4EEi01OUL5KiT4qth/TA4qDJtgaSSt0xlJltRBydnETBYHChtUmu6VKfueYL2u65dTmPp3i08fMv2/j601FlGuSg7tZYnbybkZpyI0Q1R+gjRiLbEppopywn1fNeQBfb7PmZ0sMPuG4WhNXsEyM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=amarulasolutions.com; spf=pass smtp.mailfrom=amarulasolutions.com; dkim=pass (1024-bit key) header.d=amarulasolutions.com header.i=@amarulasolutions.com header.b=JdV9mzTB; arc=none smtp.client-ip=209.85.128.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=amarulasolutions.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=amarulasolutions.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amarulasolutions.com header.i=@amarulasolutions.com header.b="JdV9mzTB" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-4980fe6b3beso8868735e9.0 for ; Thu, 03 Sep 2026 08:38:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; t=1788449934; x=1789054734; 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:content-type; bh=0o+HCmOQx9XAtsX24zUFSwjZJzmYz+uo9CE80R3VvZQ=; b=JdV9mzTBhXYIdoynAn+8gdWXTkhRVbDmtOwIskA9NCWA77NXqLJgwzVNySVtHP/AVQ J64nMACeQhtuUrGShc3Lf93A2o3owTNzjgJnDPG7Qvg+Zc26D1CJzz346YfEyH6SCQXI dPrNGouOGUuKSSReJ28U9P5D8KBerz0At3Vfo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788449934; x=1789054734; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=0o+HCmOQx9XAtsX24zUFSwjZJzmYz+uo9CE80R3VvZQ=; b=MQuLdzk8nl9fqlptQK1zCnm5lfz+Y7S80p7Sk/9bCy9E7C4Qp4cP10z5/wzyKG5lE3 0C4IYnmEgt2i/Cp3VJZyTUoIsvfyfI2rR9llXYTNZcLz/p/zDh6xHXBRzkoVqv1ZBBGf GvAoH2TT86XLiKErS+bsAcdQs7z6sxAl4l7C1pOKtQhWV/ks73YolH9cYTbAs+MP5B7k +Y4i9yB36D58hkLdQ/w3PtNEf58Jk+6p7Zu2o8oD65+fE6o53Y4J0txkcN03wMc3WIMD /5QJNs8U6PP4R0+6YdDa6pZwN8Si3hvXKzm7JyJiJXMaW4zIls0mveuLEgYen/zTzqEn JqsA== X-Gm-Message-State: AFuF++kNW7YHd943Lf6AQ9osq0HwOBJOdrIx8WjnIUh7RtVMZV93NGvL isZBx/lDBuuQO/+ccBd5Wu+WwMpS7mSP9ogGTqEQ5sXkXOkCiEP42+YczsUe4FOC7Uw+XIvIJzA 075yRrfU= X-Gm-Gg: AYBFou2tD4eJOCPfBkDKIru0+TcueBiCtCxlGv+GgE1jBRi79O39EIlyj4IOz9U5S21 LAXFwQ22cg7wUfrVxGKd7+FDjSA3RVRbaIHSPX1rDuZ0fWjsKTZvbHz1xXVZUboF2Berdxgksxs lu6KQGdZUpa2I/XoDIrL+T3i6N5Cp2RbpbdmEcvry9z97//LhlxUBORj+Bj1GnS1Ni/wDyKy8gv o/oBkrB//KFbNt5mG2z386+qLqx6SG0feelHH4JBhcFmfq09yy/R3NlabpJSxKbgsEcNtiTuHBH w2uIWmySWi37KUII/s9kTEs1+jznAA/kdpA/Q9g5aa2XQPNAFZEWPs3QZhCgBupletxAq07UHvd kxTswe10ihu/BKHfJevkD9GmHZALfdjmmo2GJGt0N3wBkycWwMZndFpaQzbtQu8XgWZA30LcMTT LWY6vq2q3iF+TKyfpzJ2aM2u6ZghGvP9TMxKnYeVE0XB4YUpzJmpKJN/KVltVXmJCXIJtgqkr6W rK9Tzr4Pb29ocDaqv8Tiujq4+Bj2dr1ktsvaXp/pFo329pju2Pk8J64mDH2fqPkoBOoWpD+YZmx GJ5GTUAyGPbTDQjkVVO0qKHEEOH/CJCH70QRgojxRNxoQwHQHcpjyHnD/oBwqaT2DjE= X-Received: by 2002:a05:600c:46c6:b0:49c:799a:177b with SMTP id 5b1f17b1804b1-49cf1576df1mr45683825e9.2.1788449933923; Thu, 03 Sep 2026 08:38:53 -0700 (PDT) Received: from dario-ThinkPad-P14s-Gen-5.amarulasolutions.com (host-95-245-93-90.retail.telecomitalia.it. [95.245.93.90]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-48448e72df2sm15366301f8f.1.2026.09.03.08.38.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Sep 2026 08:38:53 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: michael@amarulasolutions.com, linux-amarula@amarulasolutions.com, Dario Binacchi , Sashiko , Peng Fan , Brian Masney , Cristian Marussi , Jerome Brunet , Sebin Francis , Stephen Boyd , linux-clk@vger.kernel.org Subject: [PATCH v13 1/4] clk: scmi: fix SSC spread conversion Date: Thu, 3 Sep 2026 17:32:13 +0200 Message-ID: <20260903153836.373267-2-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260903153836.373267-1-dario.binacchi@amarulasolutions.com> References: <20260903153836.373267-1-dario.binacchi@amarulasolutions.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The spread_bp field of struct clk_spread_spectrum holds the modulation depth in permyriad (1/100 of a percent), as documented in clk-provider.h and in the assigned-clock-sscs binding, while the i.MX SCMI OEM extension expects a value in tenths of a percent, as pointed out by Peng Fan. The conversion divides spread_bp by 10000 instead of 10, as reported by Sashiko, so any valid configuration is truncated to 0 and the hardware is silently programmed with no spread at all. Divide by 10 and fix the comment accordingly. Fixes: 77369b1e6a37 ("clk: scmi: Add i.MX95 OEM extension support for SCMI = clock driver") Reported-by: Sashiko Closes: https://lore.kernel.org/r/20260901155657.6A5981F00A3A@smtp.kernel.o= rg Reported-by: Peng Fan Closes: https://lore.kernel.org/r/ZR6PR04MB375776A27E98F140534E8F7FE488B62@= ZR6PR04MB375776.eurprd04.prod.outlook.com Signed-off-by: Dario Binacchi Reviewed-by: Peng Fan --- Changes in v13: - Divide spread_bp by 10 instead of 100 as requested by Peng Fan. - Rename the patch title and reword the description accordingly. - Add the Reported-by/Closes tags for Sashiko and Peng Fan. drivers/clk/clk-scmi-oem.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/clk/clk-scmi-oem.c b/drivers/clk/clk-scmi-oem.c index be11d359b4ec..c1ebbdc6bbc5 100644 --- a/drivers/clk/clk-scmi-oem.c +++ b/drivers/clk/clk-scmi-oem.c @@ -39,12 +39,12 @@ scmi_clk_imx_set_spread_spectrum(struct clk_hw *hw, u32 val; =20 /* - * extConfigValue[7:0] - spread percentage (%) + * extConfigValue[7:0] - spread percentage in tenths of a percent * extConfigValue[23:8] - Modulation Frequency * extConfigValue[24] - Enable/Disable * extConfigValue[31:25] - Reserved */ - val =3D FIELD_PREP(SCMI_CLOCK_IMX_SS_PERCENTAGE_MASK, ss_conf->spread_bp = / 10000); + val =3D FIELD_PREP(SCMI_CLOCK_IMX_SS_PERCENTAGE_MASK, ss_conf->spread_bp = / 10); val |=3D FIELD_PREP(SCMI_CLOCK_IMX_SS_MOD_FREQ_MASK, ss_conf->modfreq_hz); if (ss_conf->method !=3D CLK_SPREAD_NO) val |=3D SCMI_CLOCK_IMX_SS_ENABLE_MASK; --=20 2.43.0 From nobody Sat Sep 26 07:15:40 2026 Received: from mail-wr1-f43.google.com (mail-wr1-f43.google.com [209.85.221.43]) (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 0A24B4E80C3 for ; Thu, 3 Sep 2026 15:38:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788449941; cv=none; b=JRBNLNPoWg/fkAj5y7FwqezDSQNwZy5c9u6h1EfAevnLJoLvxDSr5YFCHHqKkoAsRmSTv0j0DKMyXMiWoiVdLVZP6h+jtTI1sCYzKqCS0Kdj4bfGbzVBVvWmLC15Fkll0FIOtylQznoy6BJck9ukx7Hx99vqXlABukP6Um8gQfU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788449941; c=relaxed/simple; bh=ZU89zNZTonpu3UTAUBirVROwnLH5x3/C32l17m76c3M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aWdrC4FcseQM1cO18bTWrH62BsgifHSm4O0jrWcqt9FEfbTUmWTdbk7NQdDe/b68ELof+/5oL9Lr4/6hJZEyDXTV/mNO7TmdwvwvuOFLaeIa0HdZtWlxsViXzo54lsOTwZlDZXUb3eEFlWaDrd/G1ejHBcHDH9kNbjyJ5jm/p3A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=amarulasolutions.com; spf=pass smtp.mailfrom=amarulasolutions.com; dkim=pass (1024-bit key) header.d=amarulasolutions.com header.i=@amarulasolutions.com header.b=MP9FYoSN; arc=none smtp.client-ip=209.85.221.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=amarulasolutions.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=amarulasolutions.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amarulasolutions.com header.i=@amarulasolutions.com header.b="MP9FYoSN" Received: by mail-wr1-f43.google.com with SMTP id ffacd0b85a97d-485852d03a4so28268f8f.0 for ; Thu, 03 Sep 2026 08:38:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; t=1788449936; x=1789054736; 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:content-type; bh=f1yqnW0S/sSBoLbGGpdBGirLwApxYqu22jjVHzyaFhI=; b=MP9FYoSN+5IA4d3AmgmkLfgU63xttOdhXK3rbf3ew7qo5/pLCRsMk0MQSgMlsbdjxc P7Tn50R7V0sJsu7oWSH5jD+QuD68MCxCkdg1I3460+6zTLsy3+XsdO53jLU87bHdTjtU 6FvHVAE8nwjrfANIYnrI4OzR5XepzEp1bvlEE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788449936; x=1789054736; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=f1yqnW0S/sSBoLbGGpdBGirLwApxYqu22jjVHzyaFhI=; b=j8DFRUVaPi5ROtovmUlMOWPJzKvLBF5nPKUzqx/IRefHwfi8fvmReGEIzDFba3+8YO +0JNBV6xQdWI6/Va7uYVeqaiF/P2t1mR16q3V3sculbSc0MPu+Z80gmH2mhL+3ZUaw89 IfCWPfNGPQ45ogt8JB/el86XxNIHjAe602xT5IJuJ3oIgQlL8AQN+rNAiNzMr9QtbgXh ue+ORrzvcB8yNz5cf0iQCr7hzz5flHV3BWXDuv6sPcUfh/jftd8L7am2i81TOJcFoduO CLFLXdKGWrZ+aZ2WDFhrRq5MiWUuIXP3olibA5TZAjaqV7KCyQqGCEhP4R3A+NfeedzW YXlQ== X-Gm-Message-State: AFuF++mTQpvfUIg0YezHRVjh/PHET9TF+V1FskVvZWQIrec7OJAdDv0z RIs4iYxPGHSn/zw9ZLtv5Rd7U8f3/j6ZhwlvVCLthDNs2i3p4+BfhUDr4xwRomVG8TIiIb+fswr 6zVZjUKM= X-Gm-Gg: AYBFou0SuZR5W0NXyzTsk7vLiaNyrcNlK1I2VJ2L9bOrTl9Bqn72TFNayUU7UQ7sE5R 0P1kLzJUBP65H5epwibwMTkLq3w+dGAqnGplBRB68NLzrSKfBzFsF7l0pnF5Ns6HBlyqfke5KQm 12l83xb3sajX/Mx5KLf7sjv7CSM9YjqV8CZ6nx7h29L2KzcKLAgj0yLznm8EW9ZC2Woe7jS2wNz s2p/s/1qq4p03g7C+65CpamI3SjDRqunVdriKHEYHQ9MlJJludWyGU99+pw28P17/qShBfs/btK wA/zXir0bqyCsay1Q6pjaOn3gXNETqL4CZXQShGou7pcO2t5Eb2Pxf0302hIvwEl82syauyUxQR 9Ozg/bPyZMfvvZvUZlLIknD6Ij85WCoHdbxrDT1J+U4WRoJiXGh4nTE+vvEy/76JhEnbb1Lr050 hGAOxwAvWiiJMKv+L4Si7Kd/jgda048MRnEmcyGejLMdYIALcGmEZLIubULz8rh2WNBGn/VDxVu QGcf7u+5yAyhrMCr2eSfEAzQ6sPtvNEIEPszueJ5eZhWecA1MxjXBykdB7YGMb2JUCHZqlwUjIP MQaGIozSop+k/WdS5M55xIBVp/X24JqSrqdPZkhzvKSpJAr/KcdO6V4= X-Received: by 2002:adf:e3c1:0:b0:485:847f:fd82 with SMTP id ffacd0b85a97d-48586034408mr1988754f8f.8.1788449935865; Thu, 03 Sep 2026 08:38:55 -0700 (PDT) Received: from dario-ThinkPad-P14s-Gen-5.amarulasolutions.com (host-95-245-93-90.retail.telecomitalia.it. [95.245.93.90]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-48448e72df2sm15366301f8f.1.2026.09.03.08.38.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Sep 2026 08:38:55 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: michael@amarulasolutions.com, linux-amarula@amarulasolutions.com, Dario Binacchi , Brian Masney , Jerome Brunet , Stephen Boyd , linux-clk@vger.kernel.org Subject: [PATCH v13 2/4] clk: scmi: reject SSC configuration out of the OEM field range Date: Thu, 3 Sep 2026 17:32:14 +0200 Message-ID: <20260903153836.373267-3-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260903153836.373267-1-dario.binacchi@amarulasolutions.com> References: <20260903153836.373267-1-dario.binacchi@amarulasolutions.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The i.MX SCMI OEM extension stores the spread in an 8-bit field, in tenths of a percent, and the modulation frequency in a 16-bit field. FIELD_PREP() silently truncates values that do not fit in the target field. Moreover, the conversion from permyriad to tenths of a percent turns values below 10 permyriad into zero, which is then passed to the firmware as no spread at all. Reject these cases with a warning instead of silently programming a configuration different from the requested one. Signed-off-by: Dario Binacchi --- Changes in v13: - New patch drivers/clk/clk-scmi-oem.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/clk/clk-scmi-oem.c b/drivers/clk/clk-scmi-oem.c index c1ebbdc6bbc5..4dac608edd4c 100644 --- a/drivers/clk/clk-scmi-oem.c +++ b/drivers/clk/clk-scmi-oem.c @@ -35,6 +35,7 @@ scmi_clk_imx_set_spread_spectrum(struct clk_hw *hw, const struct clk_spread_spectrum *ss_conf) { struct scmi_clk *clk =3D to_scmi_clk(hw); + u32 spread_pm =3D ss_conf->spread_bp / 10; int ret; u32 val; =20 @@ -44,7 +45,19 @@ scmi_clk_imx_set_spread_spectrum(struct clk_hw *hw, * extConfigValue[24] - Enable/Disable * extConfigValue[31:25] - Reserved */ - val =3D FIELD_PREP(SCMI_CLOCK_IMX_SS_PERCENTAGE_MASK, ss_conf->spread_bp = / 10); + if (!spread_pm || spread_pm > FIELD_MAX(SCMI_CLOCK_IMX_SS_PERCENTAGE_MASK= )) { + dev_warn(clk->dev, "%s: spread (%u permyriad) out of range\n", + clk_hw_get_name(hw), ss_conf->spread_bp); + return -EINVAL; + } + + if (ss_conf->modfreq_hz > FIELD_MAX(SCMI_CLOCK_IMX_SS_MOD_FREQ_MASK)) { + dev_warn(clk->dev, "%s: modulation frequency (%u Hz) out of range\n", + clk_hw_get_name(hw), ss_conf->modfreq_hz); + return -EINVAL; + } + + val =3D FIELD_PREP(SCMI_CLOCK_IMX_SS_PERCENTAGE_MASK, spread_pm); val |=3D FIELD_PREP(SCMI_CLOCK_IMX_SS_MOD_FREQ_MASK, ss_conf->modfreq_hz); if (ss_conf->method !=3D CLK_SPREAD_NO) val |=3D SCMI_CLOCK_IMX_SS_ENABLE_MASK; --=20 2.43.0 From nobody Sat Sep 26 07:15:40 2026 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.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 3132D4E8DF7 for ; Thu, 3 Sep 2026 15:38:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788449942; cv=none; b=bwkSEhNyD/QmR899HXYaldxACLeg4defC9MXrjAyHQP8zLHttYKDsGg9AkGHDv/+AGZ0uGFk8vHePC38IY6yC9dPmfNPhliCWRNxTgHv9yEy49vR1YxSkSNBOg5dZNQeABweKbX2TrWRSaHeRz6kMnE3vZF4tZRaOdaqMrmdW8Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788449942; c=relaxed/simple; bh=15hnFVX8Uvkr7PjM1PgJoD/INOFQciMC8zyz7hvP3Mg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=c2++AtJm9+v19+U+BzxzC8JjHjQCLM1Gxf4TAT7fVtEHT058nviJxQawVgXO+4MLp+NNZqPvNK4nxK/kgdnecX8tB7i/J1V+1Ow/YHpE8CIVYIWIUfwKMsnkZrX0Ff5SnnxDIzV/icLK89UZ7lyZA94phQVvj5dqV+dycsXUfY4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=amarulasolutions.com; spf=pass smtp.mailfrom=amarulasolutions.com; dkim=pass (1024-bit key) header.d=amarulasolutions.com header.i=@amarulasolutions.com header.b=EZLK1X4P; arc=none smtp.client-ip=209.85.221.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=amarulasolutions.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=amarulasolutions.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amarulasolutions.com header.i=@amarulasolutions.com header.b="EZLK1X4P" Received: by mail-wr1-f48.google.com with SMTP id ffacd0b85a97d-47f96c5b722so14962f8f.0 for ; Thu, 03 Sep 2026 08:38:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; t=1788449938; x=1789054738; 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:content-type; bh=waRfo/eMT+qYYnkf6SXoDP5wBnkJd2wqce5jm4IDuSY=; b=EZLK1X4PIL8Qvg0C4jJe13or6g+6jpoBkOPPkli+i8a9cURYyS3coEdN4Do5OkmU0E Q+rdgIu3OjOM+9W3OoohuaNS07N2IZ3I6BIoscs/HvkYGUtGb+zcQtKKcxj+uVBgxBFc IZhsIfQxDMRhD2LUZNiHjHwrmol2ag/LRpNro= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788449938; x=1789054738; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=waRfo/eMT+qYYnkf6SXoDP5wBnkJd2wqce5jm4IDuSY=; b=EqeZRlCMCvDXtlhc+opjJOfYc0g79nauMp/D55Qilqxzy5jyjmW00+Kw6pyQt66neu LO4KZQu3wKjbZFYr7TE5G0wt2CGKLOqH3K6fDnhjv4ImDEb8DbpQZuXMvFqpITiFdGgc F+An4MYvbgr0E9LXDSD0AixqmA/HDN1iiNa/EG3PVr46NsKF9LQPRcgu3EnkUXSpwOSh LMVK4GMgDXBfjfbEmi+DqiV5zp3YmDMfhBV6tA25NEZG1sqPeBxj04p2f4HakHa5+YRn PRT+IzZ3q1GJQubpL72odrP8wZTfFv93KSpMjugdEyXMrUuRCreA/heo9Uk6R52TIdw3 jGJg== X-Gm-Message-State: AFuF++mGcR3FDD4LwMVFEBe/K+l5j+Bs9IlGceQ2qi+64Yl4fxeipcme ju6vljJUVcKPwu/90eQFfTGtm88kaB0WJYnZlCM9OPzxBkZmGpH4eJ//bJ/L5FRElEeshsgUWn2 QmUB7i+o= X-Gm-Gg: AYBFou02CDfC+yK8skpyzQYuQMPhok5cMQ40YFzx7aGjhwjpSsknOZhnUSS/px+HZ4G e+jmyC3plI4O4OVh/jpGPzA16IsfcHRXTSOVvCvZyx4dHV2/jvkIUPvK8UeMVNdHl44D5rRMy7l U5wap7J6+/36APBwIwUcCZQ2Iias3YglTC+O8W9XRpcLlJFGsg8l05UNxbgd7JnLzpB5H9NNLgu tRJo7wWBSJ2HOUK0VAVZwE9sK/bcz4XkKxCK+YwI60JnLJCxCfZAlgEFHi5nSYQ75A47GFAaFUh yFNTG9HpCqCufBBb3dk0d60iM2bao/dnPumzFsOAQZknTrnuUAdrhrA5Jyt+H3Wwiwq4A0v9WE/ pHX+af+zA9T8rPzPco0RCyHLiSa8oDbCprNHs3Mj6wG/e+dFNo/TdlWXUyS2vyGjRIe63IjClca Q2rR3jIfAW0zNFQNI1RWZe+i1+MBOeukxgfoPCvkGimm7LzX4pE/+dd+M8Go936TKjNPU8K3Pu2 BmtXlWwnOidYzwcLTzeoMc/EY7vDa+f0T/rrlnXAc8XIPJvlhilYnqsU4emHjMYFZq8PnxIzN3X S6SWvK5q3To1AEDmM1v9J01g0YXYG0f+/WSWZAOG3qwSr6n2j0DWWQcS9xgokDmnt60= X-Received: by 2002:a05:6000:268a:b0:481:5b58:c589 with SMTP id ffacd0b85a97d-48488f0e30emr24641045f8f.10.1788449938221; Thu, 03 Sep 2026 08:38:58 -0700 (PDT) Received: from dario-ThinkPad-P14s-Gen-5.amarulasolutions.com (host-95-245-93-90.retail.telecomitalia.it. [95.245.93.90]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-48448e72df2sm15366301f8f.1.2026.09.03.08.38.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Sep 2026 08:38:56 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: michael@amarulasolutions.com, linux-amarula@amarulasolutions.com, Dario Binacchi , Sashiko , Brian Masney , Jerome Brunet , Peng Fan , Sebin Francis , Stephen Boyd , linux-clk@vger.kernel.org Subject: [PATCH v13 3/4] clk: validate spread spectrum configuration Date: Thu, 3 Sep 2026 17:32:15 +0200 Message-ID: <20260903153836.373267-4-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260903153836.373267-1-dario.binacchi@amarulasolutions.com> References: <20260903153836.373267-1-dario.binacchi@amarulasolutions.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The spread spectrum configuration is passed to the provider's set_spread_spectrum() callback without any validation, as clk-conf.c only skips all-zero triplets from "assigned-clock-sscs". An invalid device tree can hand providers a zero modulation frequency or a spread ratio above 100%, and each provider would have to add the same checks to protect e.g. divisions in its rate computations. The KUnit test data for assigned-clock-sscs uses spread values of 30000 and 40000 permyriad (300% and 400%), which the new check rejects, as reported by Sashiko, so fix them to 300 and 400 (3% and 4%). Also use a realistic 6% value for the initial settings of the skip tests, for consistency. Fixes: c86814e70390 ("clk: Introduce clk_hw_set_spread_spectrum") Reported-by: Sashiko Closes: https://lore.kernel.org/r/20260901155657.6A5981F00A3A@smtp.kernel.o= rg Signed-off-by: Dario Binacchi Reviewed-by: Peng Fan --- Changes in v13: - Fix the KUnit test data to realistic spread values. - Add the Reported-by/Closes tag for Sashiko. drivers/clk/clk.c | 14 ++++++++++++++ drivers/clk/clk_test.c | 12 ++++++------ drivers/clk/kunit_clk_assigned_rates.h | 4 ++-- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index fef87167a60b..208caf60eeb5 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -2851,6 +2851,20 @@ int clk_hw_set_spread_spectrum(struct clk_hw *hw, co= nst struct clk_spread_spectr if (!hw) return 0; =20 + switch (ss_conf->method) { + case CLK_SPREAD_NO: + break; + case CLK_SPREAD_CENTER: + case CLK_SPREAD_UP: + case CLK_SPREAD_DOWN: + if (!ss_conf->modfreq_hz || !ss_conf->spread_bp || + ss_conf->spread_bp > 10000) + return -EINVAL; + break; + default: + return -EINVAL; + } + core =3D hw->core; =20 clk_prepare_lock(); diff --git a/drivers/clk/clk_test.c b/drivers/clk/clk_test.c index 1c5c8b7c1f3c..21e62d68f87f 100644 --- a/drivers/clk/clk_test.c +++ b/drivers/clk/clk_test.c @@ -3526,7 +3526,7 @@ static const struct clk_assigned_rates_test_param clk= _assigned_sscs_skips_test_p */ .desc =3D "provider missing assigned-clocks", TEST_PARAM_OVERLAY(kunit_clk_assigned_sscs_without), - .sscs =3D {50000, 60000, 3}, + .sscs =3D {50000, 600, 3}, }, { /* @@ -3535,7 +3535,7 @@ static const struct clk_assigned_rates_test_param clk= _assigned_sscs_skips_test_p */ .desc =3D "consumer missing assigned-clocks", TEST_PARAM_OVERLAY(kunit_clk_assigned_sscs_without_consumer), - .sscs =3D {50000, 60000, 3}, + .sscs =3D {50000, 600, 3}, .consumer_test =3D true, }, { @@ -3545,7 +3545,7 @@ static const struct clk_assigned_rates_test_param clk= _assigned_sscs_skips_test_p */ .desc =3D "provider assigned-clock-sscs of zero", TEST_PARAM_OVERLAY(kunit_clk_assigned_sscs_zero), - .sscs =3D {50000, 60000, 3}, + .sscs =3D {50000, 600, 3}, }, { /* @@ -3554,7 +3554,7 @@ static const struct clk_assigned_rates_test_param clk= _assigned_sscs_skips_test_p */ .desc =3D "consumer assigned-clock-sscs of zero", TEST_PARAM_OVERLAY(kunit_clk_assigned_sscs_zero_consumer), - .sscs =3D {50000, 60000, 3}, + .sscs =3D {50000, 600, 3}, .consumer_test =3D true, }, { @@ -3564,7 +3564,7 @@ static const struct clk_assigned_rates_test_param clk= _assigned_sscs_skips_test_p */ .desc =3D "provider assigned-clocks null phandle", TEST_PARAM_OVERLAY(kunit_clk_assigned_sscs_null), - .sscs =3D {50000, 60000, 3}, + .sscs =3D {50000, 600, 3}, }, { /* @@ -3573,7 +3573,7 @@ static const struct clk_assigned_rates_test_param clk= _assigned_sscs_skips_test_p */ .desc =3D "consumer assigned-clocks null phandle", TEST_PARAM_OVERLAY(kunit_clk_assigned_sscs_null_consumer), - .sscs =3D {50000, 60000, 3}, + .sscs =3D {50000, 600, 3}, .consumer_test =3D true, }, }; diff --git a/drivers/clk/kunit_clk_assigned_rates.h b/drivers/clk/kunit_clk= _assigned_rates.h index d7ae5ec2d25b..c5d9f004ee81 100644 --- a/drivers/clk/kunit_clk_assigned_rates.h +++ b/drivers/clk/kunit_clk_assigned_rates.h @@ -9,10 +9,10 @@ #define ASSIGNED_RATES_1_RATE 9700000 =20 #define ASSIGNED_SSCS_0_MODFREQ 10000 -#define ASSIGNED_SSCS_0_SPREAD 30000 +#define ASSIGNED_SSCS_0_SPREAD 300 #define ASSIGNED_SSCS_0_METHOD CLK_SSC_CENTER_SPREAD #define ASSIGNED_SSCS_1_MODFREQ 20000 -#define ASSIGNED_SSCS_1_SPREAD 40000 +#define ASSIGNED_SSCS_1_SPREAD 400 #define ASSIGNED_SSCS_1_METHOD CLK_SSC_UP_SPREAD =20 #endif --=20 2.43.0 From nobody Sat Sep 26 07:15:40 2026 Received: from mail-wr1-f53.google.com (mail-wr1-f53.google.com [209.85.221.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 639524EA367 for ; Thu, 3 Sep 2026 15:39:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788449944; cv=none; b=iAR7ylvLa604UBcyg/2guPLvYcE5waB40wy0qZ8iLZRoH8sI/TjGHTONA4S68VQhJvyDfUWFvZAI41oA//NOBTwH6IVVZHbaLkS8pmIUlerWoJdvr2R5lKRAKMnxrEY2TichlLhheb0zRv8zshSlVGO+J93if4ocmhI+D0fsikc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788449944; c=relaxed/simple; bh=5VcRoJMWHY4qVgnecHiIGpAC6SQWrjspNdzORitn378=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kMQPbmfA2PLCC0Qb9dHgTqGJYNfJjwdjCbnlN1XNcW7jE4DA6N9/hMTzv5pMeVIRCOrXVlKoNiFOfbg0hC1k5l832G5bcnGDZE6ZFT0T3snWDKlIdCsOlKT3dAvU9+4rbj+msYfpcuKVZvWw+L6YnoBFtKJpeWFUPSXmR+5EZBw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=amarulasolutions.com; spf=pass smtp.mailfrom=amarulasolutions.com; dkim=pass (1024-bit key) header.d=amarulasolutions.com header.i=@amarulasolutions.com header.b=RPZ0qdM0; arc=none smtp.client-ip=209.85.221.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=amarulasolutions.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=amarulasolutions.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amarulasolutions.com header.i=@amarulasolutions.com header.b="RPZ0qdM0" Received: by mail-wr1-f53.google.com with SMTP id ffacd0b85a97d-48441a2ba14so7601f8f.1 for ; Thu, 03 Sep 2026 08:39:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; t=1788449940; x=1789054740; 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:content-type; bh=cm4uXra2L9WOBsP9ackTlqi/Ub+9G7ZP+SENv4y3Q0o=; b=RPZ0qdM0ADegwUVmfNDD/y0tiBym8CzDqc253AecJBQFIM81AUcj5GzJ1ImJtaELJb v4a4DLNn8tS6ksroetUOQlYOsgzOn+c63zNRcGyiev9WmtGkz3oRGDv6CbSN5PmHAbJ9 3G6XAVCChPgWP4xebVfks7lVLH21XdGGMD7/w= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788449940; x=1789054740; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=cm4uXra2L9WOBsP9ackTlqi/Ub+9G7ZP+SENv4y3Q0o=; b=KmsgLeWoHvFkYWzFohDbcox0Xi+BJS/TkrpdLhOyJnSmNEK1creAc5PP8bPXGlmrR+ nmJPdzcqnq7odlSwadk9ork/A9U675sr3gMl0QFyb567KBUKPjZsGYX8kd4EjmtqJPs1 ukZWOagSsaQCDjjWSE1nq5KOUWT1y1ncWTvdhbJ6q2nwPPnUU9xDaucRIb7imga4AyYK Ap64qkTcqij1pRpD7nmmPt9lzxABn547t+tSFnPEqdwztrw0704JnX97Q0UO6+FG5x+v iVeAZGgsKFdmMPMcXkRohXJj2IRCGKAkPX2XKCJzrx5nE6n1QFfNfCwf9COnETjhSrot okYw== X-Gm-Message-State: AFuF++mNhjR7qBnop4TD2dNRyalzU2q6cCDSqe/eNexhkqsNUCO/wsRO 2tIEson0JGmPoQaUcUsJ8+HnEMxMq7DwKR+lggxagcTqCnt0WFnUuohkP6Vnca8YVPB8EvddvBu HQngG7SI= X-Gm-Gg: AYBFou17Jd+0B5PuqX3Va4ZWIPB6qyy6btMorWGYq5Etl5IBz2RPvCpDb5W4aNS0S0t jn58UCUR93rLpSMagNHcFp9M3QFrAT05fciM6wuXEH9x4AAF5JiaEDC8ThA4MDEsD3F1HajyQff gK3Xj3LZtO4+dm3JodsEmr+m+JPyyfUq2MNX8BFjDfVKyxyA7GuadH+6kezMVXb+EdENY02kJAJ D1ONDK+kXMCjbvA3nk50uBS1SIc+BYoFE1L6w8laJAWlgYoL9Igcinccr+m4x+I3L17bXFyFWkK MEhmrM22nbRH5bM+JynUdyUt1N3/b7o4zTIAeFprP22n7eFOPCX7fGf2YyzBw0BXXL7ezjz7ACU TMYtgXCgGKRu22lUawGkWOzG9QX40Xsd/JmKc+Hd9vXTWTtbao5uA/VhY9uu8DzV/fTiEnuf4KV vFNfiasQN3IFMi5R4VrMidC7kGpS5WXRL+nItHISC/rHt0uEt4DQZ4ZVwzuC7aYgXEWs9xiNz/9 mbnwGZYZ+HJXwzOdohTOaK4R+h75RJSnc4huPEBtW4qi9VhHP4i4aQRHkBGuMOXqtHpndxpN+ZM /xD8VvMEgMs31OwJ+jZ6uTJ/RYc9r600em+M3T66B0QIIODmZ3cACmkvgXqFfiLTqUY= X-Received: by 2002:a05:6000:2210:b0:47f:ec8a:214f with SMTP id ffacd0b85a97d-48488f0f6c6mr22597779f8f.15.1788449940413; Thu, 03 Sep 2026 08:39:00 -0700 (PDT) Received: from dario-ThinkPad-P14s-Gen-5.amarulasolutions.com (host-95-245-93-90.retail.telecomitalia.it. [95.245.93.90]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-48448e72df2sm15366301f8f.1.2026.09.03.08.38.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Sep 2026 08:38:59 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: michael@amarulasolutions.com, 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 v13 4/4] clk: imx: pll14xx: support spread spectrum clock generation Date: Thu, 3 Sep 2026 17:32:16 +0200 Message-ID: <20260903153836.373267-5-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260903153836.373267-1-dario.binacchi@amarulasolutions.com> References: <20260903153836.373267-1-dario.binacchi@amarulasolutions.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 Reviewed-by: Peng Fan --- (no changes since v12) Changes in v12: - Apply the SSC settings also from the set_spread_spectrum() callback to handle the case the clock framework skips set_rate() if the requested rate is unchanged. 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 | 99 +++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/drivers/clk/imx/clk-pll14xx.c b/drivers/clk/imx/clk-pll14xx.c index b6f1cc9f5700..5b187101c558 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) =20 #define LOCK_TIMEOUT_US 10000 =20 @@ -44,6 +54,7 @@ struct clk_pll14xx { int rate_count; s16 delta_k; spinlock_t lock; + struct clk_spread_spectrum ss_conf; }; =20 #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, un= signed long drate, return 0; } =20 +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 =3D to_clk_pll14xx(hw); + struct clk_spread_spectrum *conf =3D &pll->ss_conf; + u32 sscg_ctrl, mfr, mrr, sel_pf; + + sscg_ctrl =3D readl_relaxed(pll->base + SSCG_CTRL); + sscg_ctrl &=3D ~(SSCG_ENABLE | MFREQ_CTL_MASK | MRAT_CTL_MASK | SEL_PF_MA= SK); + + switch (conf->method) { + case CLK_SPREAD_CENTER: + sel_pf =3D SEL_PF_CENTER_SPREAD; + break; + case CLK_SPREAD_UP: + sel_pf =3D SEL_PF_UP_SPREAD; + break; + case CLK_SPREAD_DOWN: + sel_pf =3D SEL_PF_DOWN_SPREAD; + break; + default: + /* No spread: disable modulation and clear any stale state */ + goto out; + } + + if (!conf->modfreq_hz || !parent_rate || !pdiv) + goto out; + + mfr =3D 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 =3D (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 |=3D 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, uns= igned long drate, writel_relaxed(FIELD_PREP(KDIV_MASK, rate.kdiv), pll->base + DIV_CTL1); =20 + __clk_pll1443x_set_spread_spectrum(hw, prate, rate.pdiv, + rate.mdiv); + spin_unlock_irqrestore(&pll->lock, flags); =20 return 0; @@ -411,6 +477,8 @@ static int clk_pll1443x_set_rate(struct clk_hw *hw, uns= igned long drate, =20 writel_relaxed(FIELD_PREP(KDIV_MASK, rate.kdiv), pll->base + DIV_CTL1); =20 + __clk_pll1443x_set_spread_spectrum(hw, prate, rate.pdiv, rate.mdiv); + spin_unlock_irqrestore(&pll->lock, flags); =20 /* @@ -437,6 +505,36 @@ static int clk_pll1443x_set_rate(struct clk_hw *hw, un= signed long drate, return 0; } =20 +static int clk_pll1443x_set_spread_spectrum(struct clk_hw *hw, + const struct clk_spread_spectrum *ss_conf) +{ + struct clk_pll14xx *pll =3D to_clk_pll14xx(hw); + struct clk_hw *parent =3D clk_hw_get_parent(hw); + unsigned long parent_rate =3D parent ? clk_hw_get_rate(parent) : 0; + unsigned long flags; + u32 div_ctl0; + + spin_lock_irqsave(&pll->lock, flags); + + pll->ss_conf =3D *ss_conf; + + /* + * Apply the configuration to the hardware right away, using the + * current PLL dividers: the clock framework does not call set_rate() + * if the requested rate is unchanged, so relying on it would leave + * the SSC settings unapplied when the PLL is already at the target + * rate (e.g. configured by the bootloader). + */ + div_ctl0 =3D readl_relaxed(pll->base + DIV_CTL0); + __clk_pll1443x_set_spread_spectrum(hw, parent_rate, + FIELD_GET(PDIV_MASK, div_ctl0), + FIELD_GET(MDIV_MASK, div_ctl0)); + + spin_unlock_irqrestore(&pll->lock, flags); + + return 0; +} + static int clk_pll14xx_prepare(struct clk_hw *hw) { struct clk_pll14xx *pll =3D to_clk_pll14xx(hw); @@ -509,6 +607,7 @@ static const struct clk_ops clk_pll1443x_ops =3D { .recalc_rate =3D clk_pll14xx_recalc_rate, .determine_rate =3D clk_pll1443x_determine_rate, .set_rate =3D clk_pll1443x_set_rate, + .set_spread_spectrum =3D clk_pll1443x_set_spread_spectrum, }; =20 struct clk_hw *imx_dev_clk_hw_pll14xx(struct device *dev, const char *name, --=20 2.43.0