From patchwork Wed Feb 5 09:49:51 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Peng Fan (OSS)" X-Patchwork-Id: 13960749 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id A540DC02192 for ; Wed, 5 Feb 2025 09:53:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:MIME-Version:Cc:To: In-Reply-To:References:Message-Id:Content-Transfer-Encoding:Content-Type: Subject:Date:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=6l57yxYmeST1OV4vtYzySJQWfWrxoHyD6OZl1nVF+Fc=; b=NOhbIb0B8NxohOlK1UtiDtYWj+ D1STaJVkl+s8qkQNilEIHDVE+HcKF40OsndsxOlTeM0XZ1psJQK0bGbO5TVsLr8ZPUwRSMB/VJR90 izZ6Z1I7AwRFnURjuiyLgLgTRyFDiYldtcZ8BXSzHcGE5KY7JU4waaSWcOD+ox0YKwH/n7DTNaPGt Ri0CYpDgrxG7ba22RlxX1lRQHdLvZIq2hIJlF3geRXUu22OipcjCxNycY2+cAi2wKYRI3mECKPwmh VAGN+sNnAxUw/D+rRWgn7vQkeyjIoaBNNgJb7KeMFHOFJFHxm9VgmHZHfQBh6PcpJEOqgEAPRLDSG wOEq+4Nw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tfc6I-00000002ljo-0gGh; Wed, 05 Feb 2025 09:53:42 +0000 Received: from mail-westeuropeazlp170110003.outbound.protection.outlook.com ([2a01:111:f403:c201::3] helo=AS8PR04CU009.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tfc3c-00000002l7s-0s8S for linux-arm-kernel@lists.infradead.org; Wed, 05 Feb 2025 09:50:57 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=OiTPbyX/jrOdZIUpGriGGKKdTDzfXN+sR/jZDQcBT1Sihnwh7eb5mDf2ihSabfp27G+7nKq9RMGyGAfEC+wIdzwc+83Lra3FZv4GP/t8bCXWmxpq1vyDyXIPtRVJEl7yVrqMlOY/FxfWYrjmJuEjzciwoCfij9fHLlULWmW28tdzXSRJfEQCK6IdwR+fCDxANJK9dB8yXQak4hZZipIaN8n7mb1aOxzw7P9wlcBQH6ciixPBEEIOU/jbxwB30bktQaqkW2IQQKvv6VYoK40f3HYg/uGzH0/H9oB/6PkW1LrNnL+ogN8cazjVbCJk3IB5uJlxHVkvGVWG+8fAQYLHMQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=6l57yxYmeST1OV4vtYzySJQWfWrxoHyD6OZl1nVF+Fc=; b=V050q6iUn5DB+oi4l8wplJghMCOSvx3HH8Yxgr+U/CM/UfUrhJCV7NfxU0lhDXXS1MPAhuA+rrTE1yfK03qDoRXg83Smr0zLDO8OTvmmonQuWFqoiLo6qEvUGbg9D7jBTReP1ncRCG7A7a7tJDaxy7HzUchG6PJUZuPnJVn7o5/Dn1/RLDZD5S5OIu49qhRrtH0EP7X0Fdl9NKY8ukCaDnk1RgHZ8dnD3bs6v4Hu+iiRLbWPl7D31jG3LJR/gMPdbu02q5MLEo4S6WwZeseUDbHvrUS4+1ib+MY1wgD0RoBXU4YFWse8mgwNkqOSQ60MTa3/NCpmKHqA8u5RZJoOaA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=6l57yxYmeST1OV4vtYzySJQWfWrxoHyD6OZl1nVF+Fc=; b=YYI3ex3wmgx9VJqjpowj8wnNzNy8jiavF7J2TsUB0RGv5TUppF1qeh6RcGRlxLZuF8qnpAgi7+LdgN7AZr7rfJaKevSOiaBBJF4eJbO1Cu1VtWxSmLoBh+di2s/+cc48uknxnsP9SxRhCue/YKPNJQDqB4VBCzxVNyo92dK8wvClE6AoaMj4ZFf8nfVYHx0FKIBZDSpIboAypKeo5s3iaPOmNEtpFRkL9bYbqDHvpgamRf6aVCgXiohsnR+nQZCQ6aI5B8CRDVstCsxwM4fz3tvBt0gB0QyvGPKUT4IN6Yw7J7inm/xvedjj1J5D+uYrsKKmxA0m6e13NTjYXKrFMg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from PAXPR04MB8459.eurprd04.prod.outlook.com (2603:10a6:102:1da::15) by AS8PR04MB7783.eurprd04.prod.outlook.com (2603:10a6:20b:2a4::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8422.11; Wed, 5 Feb 2025 09:50:53 +0000 Received: from PAXPR04MB8459.eurprd04.prod.outlook.com ([fe80::165a:30a2:5835:9630]) by PAXPR04MB8459.eurprd04.prod.outlook.com ([fe80::165a:30a2:5835:9630%3]) with mapi id 15.20.8398.025; Wed, 5 Feb 2025 09:50:53 +0000 From: "Peng Fan (OSS)" Date: Wed, 05 Feb 2025 17:49:51 +0800 Subject: [PATCH v2 1/4] clk: Introduce clk_hw_set_spread_spectrum Message-Id: <20250205-clk-ssc-v2-1-fa73083caa92@nxp.com> References: <20250205-clk-ssc-v2-0-fa73083caa92@nxp.com> In-Reply-To: <20250205-clk-ssc-v2-0-fa73083caa92@nxp.com> To: Michael Turquette , Stephen Boyd , Russell King , Sudeep Holla , Cristian Marussi , Abel Vesa Cc: linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, arm-scmi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Rob Herring , Krzysztof Kozlowski , Dario Binacchi , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , imx@lists.linux.dev, Peng Fan X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1738749007; l=5527; i=peng.fan@nxp.com; s=20230812; h=from:subject:message-id; bh=N5B1zgouHjlvADWtIMmbMY9BBZv1Dk20KykGSG+oSag=; b=7MC8xIQrG6++fG2MGgat1FW7XiwEyXwuRcciuqu0rwLxjZzJ4OhxdSekbhEAnaM/0eWz6cDWJ zUYbhWYvqQyC+epoZix8LYIWgYwigEsEe4+BxcvUI5GPzoTmy3Pv1bo X-Developer-Key: i=peng.fan@nxp.com; a=ed25519; pk=I4sJg7atIT1g63H7bb5lDRGR2gJW14RKDD0wFL8TT1g= X-ClientProxiedBy: SI2PR02CA0037.apcprd02.prod.outlook.com (2603:1096:4:196::8) To PAXPR04MB8459.eurprd04.prod.outlook.com (2603:10a6:102:1da::15) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PAXPR04MB8459:EE_|AS8PR04MB7783:EE_ X-MS-Office365-Filtering-Correlation-Id: cca426ee-cd16-4b81-18f6-08dd45ca9435 X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|7416014|52116014|376014|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?q?bQ83mSW9+WTFlqoTtweuE5vHAQgq+55?= =?utf-8?q?2vLXYGhX1I4gpNCQz8vyOc2FqZhBimmgXE5ilYteqrPu8YfZXJ40BUV4N5cKzOXhw?= =?utf-8?q?DZvy/Bj6LFjAHN1OoEHKWot4qAvwyDpj+tNiOsAovLgWeUwgZ3t2vDAZIphsumzmo?= =?utf-8?q?sGi8UlgYPHDNW2eHVBV+5g1PMENZRUH4NNllPkBApGzSShIQkD80urcNotzSd3Jtj?= =?utf-8?q?3SptvRt+0ybY61/A0vSRjNFXkxpeXhVfbkDO+H0pLz36oz0P9OkxiAfbq7VB/3EV4?= =?utf-8?q?F54uzqX3LwDhSnMUxqHgnXfK0HzeqqKt0ZxPYzYHSHNSpT3abhcTdRCmmdgM0Csu5?= =?utf-8?q?FnFZ266TI1007d0z8VQTHRiQjg0c1fAc79hrxZGMdMrgc7rWhZoaL4cK+wAqA6V5H?= =?utf-8?q?wTCZ2fsjQnrsR9PDSDp3eInThdaNRQOZPQezOiHqhBqIumz4T+BlrtZWASbAfhkSE?= =?utf-8?q?ywKaLwUieHiIScK5QSmdbLCS0nK2D4+bHr/sya+vRqeyMzwplKxjh/ECdVCnN7Ai9?= =?utf-8?q?fR6f4/B0UfuZ+niojCwLD97JWcLUANDFFeUsFJxfKQ2CQfxE9WVKU0elUbOGgjV4n?= =?utf-8?q?qKzaFjsTWEftoi90gH5JX4w9M7ScLG65v6qyKF+kCMEvg4RDfAk4pPIKKYihmcZUF?= =?utf-8?q?vyNxVG94BHEoFIzanPDeiphldatoMO1CVFrS4QZj9hYqKSfUSxmiWqqFfnIIfeb1x?= =?utf-8?q?qnmNDTozNnrmd+avhTXwjGnlIj0E/8hyy8a0DG11AcaWVVofjyU2Osd7Vy7nxGOi0?= =?utf-8?q?cIYg0/RlCFcqxwss+hTLnPY05uTksah3TsZDszU1IlOzKLqek2/dwJWL/oU4AGUY2?= =?utf-8?q?s4BH0oRQUTzxMP27kFMe4BIYBYSo4fdpwKRI8vRA/hl+ienRj1LcIi/CXASRwhfS3?= =?utf-8?q?zfP47Uxr3CGpenoWqPS/4qwmZ7yxpQ1f8Xio44+rbaUVk+btIxewyYO8dU4lNO5df?= =?utf-8?q?qsSzmj89UQnJHTq9D2GnOj3I5MGjhjy/7oyuJX0WDEogqT0xKArhxaphYc9BBxE2d?= =?utf-8?q?1p5dtzyaX4HM9eKL01jw/4KHpOLh53Ux7f8drvivyvaNIPwrO3waIsCLXuTF6WXv2?= =?utf-8?q?3AH9o47KO1+PjzJYwoWtQoAPd6K6fE7bJmsebw0QuPOHtC1VupPt/KXPwIEaTSJng?= =?utf-8?q?YimG0GPrNN/WdCXCc7IOYo7gk8KdaxNb6fgAQ9ogGUKY1bddCSMJo/wYM0GTzciO5?= =?utf-8?q?DdcFea7hNZ0OP7QJy2U7e8Ihy2w95Wi30GwylEexRB2Z7NSP4jQTt2T67O3gutjYu?= =?utf-8?q?6fDqZWarXioLK4X96Ls6P4A8pJDbBlCgTNnDoCXMWKP11hTjDIzPi/tWizsquV39J?= =?utf-8?q?kdmDNxukNTxPMAgb7MQdw3cfN3s5a2aOMHuJ8Oen1TEPRkn6/HZ4DET3K3Y6JVGR0?= =?utf-8?q?fqMibLCOecI?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PAXPR04MB8459.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(7416014)(52116014)(376014)(366016)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?a0YtUUEQ4JmYlYzzTXqeC7xGi8u1?= =?utf-8?q?SSbDXdBVG6XgBmkv2kP/FPosxtmbif09UQDvmAoR8NwKhllna59uWxYfVzopkhCxy?= =?utf-8?q?RimNBod/G3sJ2ISiTHl7qKABZe0vNOAm8aDy+iaModksTLhdQJ0oWIMbKfXooQxdS?= =?utf-8?q?iN7iw2iIWyyzkT034H3TdW9/1ULwkD0HrJUnkIXS30CV7XDwRnwQ3iYHG8RAjTjk1?= =?utf-8?q?7TdrEse20/EozlGGKDLtQwI1/yNHJxk04iuqIqiFTwPi+JNEMUgf0Irtgf0G6cG5u?= =?utf-8?q?SEoGNbV9+SllcMNqnsoPXI2yzJsp4Fcud5N6XMBHf58x2XFqS4s9coClItuTzsumc?= =?utf-8?q?UBc8RqXHr614yasU/bkyUwlGh67mr40YDyn8CGSc2DZA7V5dDXrnMT/BsFs/mI3YP?= =?utf-8?q?oMif5SJjj3ymZjP6YMOIpKmTSGbcvZRWlc0hopIFBfO+EhandIS4IiJz2am0/eb2q?= =?utf-8?q?MfE5Qoa6cYp2u/D4cenU1HW6F5KVhWfoeFHF0Jk/cH92Qljw2DTqeOcoCGt7YTM8R?= =?utf-8?q?1WEeCECNKCo7H08JOAUkcgMGh3wfg/rhChmbq6B80fXSJ+ASSX/Xorr6cPmf1I7Ro?= =?utf-8?q?P7IKQbxvua5nAtMdb+RgeLVnKKhdexSenqmv/xZnbjxRIfy+D5O4OlRL9SkRKuZPA?= =?utf-8?q?SbnxndD7iWkwveVfGrCXeWSsVdTSTbOOZ4K/ctvOH8QeL9Fxasv73qJ5vQZHZaUH0?= =?utf-8?q?Bs5nUUD58A5/5xtBqgb53FleE7AfdEqpODivhKs+2EXfjSivb8BiMRkEsDHq69Qw2?= =?utf-8?q?/fJyZb4Zz5KHU2bKyVABfY7p8PRE0e2BstFFqltqcZOw7581uaJfWfDhS4x3jLFzV?= =?utf-8?q?TkLgGd5+BVMd02z0RHe45mNx56BAClrpbC2G4ACInVSpXYlAftenSlG2NAbiFCQvW?= =?utf-8?q?EZ6PSIZUnr+JmE2zsb7f8ht70v8GKBGyqyOJYKzeLALJL0Whb0Ka3WjSrIK+/Qqj/?= =?utf-8?q?8nCS/R+VnDrYVahf5NqPILoGNQCKXF54jMZLpqz/rI8fkzNWUKqiWJjzcDX1Eh/2G?= =?utf-8?q?wso1hC2C/B9u1xaSaiPpyXMCuhlAHnN012Cy1BY1sh8uXqaxXxy14IUZry5DK/I+f?= =?utf-8?q?HmH3plCXjHPYWr0sUV12qBX+NlSLMpS+76/4/OGjJ17UyxGAjP6nh9RI4JMjJPkYl?= =?utf-8?q?XIj3/OWhlp1sNfw8V1V4dLa0AwcKv9GDJXmwp63CPo3Psh/ZKsrc+HZtIdmUYvHQ+?= =?utf-8?q?UUvFmuUNUycew1E1melTD9Vsuh8G5eEooPTeutzYbDmo1sqTV7e/DrpZQ4OU1Qfd0?= =?utf-8?q?XloNICF5gRUGa9dIeuvcteTZ+JeRmGAB905YB/eVgDiJoagDoTox4txlwPhqbKW9r?= =?utf-8?q?r5vaiQna1SHdQGn2qsmkk4yb8m3lGOhcRkubkq1HthyEPZamNFjHd/yVcfj+ggP8B?= =?utf-8?q?QTKaG2MRP46NtU6MXAGtY+riLaDxZP+fRkD8pxDJBZmTajQ2AjO4npSJLDt23aSzG?= =?utf-8?q?2KQkBoR82zjKzJ6ethaBOm/EbqmcbdpAVFgnH8LSeau4J3pOjyq5UiEHbfhBnIqLQ?= =?utf-8?q?DdYqmV32SOZ3?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: cca426ee-cd16-4b81-18f6-08dd45ca9435 X-MS-Exchange-CrossTenant-AuthSource: PAXPR04MB8459.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Feb 2025 09:50:53.0679 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: wg+WhqZ4NSOfWaDPy7sgow7EIZKYOL13UqtNqwFGdeGTCQdkT7KonD6Z9y6jqJqFosIiBirDPl7zCNcDg1aZcw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB7783 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250205_015056_410076_32800643 X-CRM114-Status: GOOD ( 16.41 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org From: Peng Fan Add clk_hw_set_spread_spectrum to configure a clock to enable spread spectrum feature. set_spread_spectrum ops is added for clk drivers to have their own hardware specific implementation. Signed-off-by: Peng Fan --- drivers/clk/clk.c | 34 ++++++++++++++++++++++++++++++++++ include/linux/clk-provider.h | 32 ++++++++++++++++++++++++++++++++ include/linux/clk.h | 22 ++++++++++++++++++++++ 3 files changed, 88 insertions(+) diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index cf7720b9172ff223d86227aad144e15375ddfd86..e11f9615e683af52c719d4c8419bd30f369f301b 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -2790,6 +2790,40 @@ int clk_set_max_rate(struct clk *clk, unsigned long rate) } EXPORT_SYMBOL_GPL(clk_set_max_rate); +int clk_hw_set_spread_spectrum(struct clk_hw *hw, unsigned int modfreq, + unsigned int spreaddepth, enum clk_ssc_method method, + bool enable) +{ + struct clk_spread_spectrum clk_ss; + struct clk_core *core; + int ret; + + if (!hw) + return 0; + + core = hw->core; + + clk_ss.modfreq = modfreq; + clk_ss.spreaddepth = spreaddepth; + clk_ss.method = method; + clk_ss.enable = enable; + + clk_prepare_lock(); + + ret = clk_pm_runtime_get(core); + if (ret) + goto fail; + + if (core->ops->set_spread_spectrum) + ret = core->ops->set_spread_spectrum(hw, &clk_ss); + + clk_pm_runtime_put(core); + +fail: + clk_prepare_unlock(); + return ret; +} + /** * clk_get_parent - return the parent of a clk * @clk: the clk whose parent gets returned diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index 2e6e603b749342931c0d0693c3e72b62c000791b..ac0270cc9ec133954b1f8dcffed015723bd1ff5d 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h @@ -84,6 +84,28 @@ struct clk_duty { unsigned int den; }; +/* Aligned with dtschema/schemas/clock/clock.yaml */ +enum clk_ssc_method { + CLK_SSC_CENTER_SPREAD, + CLK_SSC_UP_SPREAD, + CLK_SSC_DOWN_SPREAD, +}; + +/** + * struct clk_spread_spectrum - Structure encoding spread spectrum of a clock + * + * @modfreq: Modulation frequency + * @spreadpercent: Modulation percent + * @method: Modulation method + * @enable: Modulation enable or disable + */ +struct clk_spread_spectrum { + unsigned int modfreq; + unsigned int spreaddepth; + enum clk_ssc_method method; + bool enable; +}; + /** * struct clk_ops - Callback operations for hardware clocks; these are to * be provided by the clock implementation, and will be called by drivers @@ -178,6 +200,11 @@ struct clk_duty { * separately via calls to .set_parent and .set_rate. * Returns 0 on success, -EERROR otherwise. * + * @set_spread_spectrum: Configure the modulation frequency, modulation percentage + * and method. This callback is optional for clocks that does not + * support spread spectrum feature or no need to enable this feature. + * Returns 0 on success, -EERROR otherwise. + * * @recalc_accuracy: Recalculate the accuracy of this clock. The clock accuracy * is expressed in ppb (parts per billion). The parent accuracy is * an input parameter. @@ -255,6 +282,8 @@ struct clk_ops { int (*set_rate_and_parent)(struct clk_hw *hw, unsigned long rate, unsigned long parent_rate, u8 index); + int (*set_spread_spectrum)(struct clk_hw *hw, + struct clk_spread_spectrum *clk_ss); unsigned long (*recalc_accuracy)(struct clk_hw *hw, unsigned long parent_accuracy); int (*get_phase)(struct clk_hw *hw); @@ -1404,6 +1433,9 @@ void clk_hw_get_rate_range(struct clk_hw *hw, unsigned long *min_rate, unsigned long *max_rate); void clk_hw_set_rate_range(struct clk_hw *hw, unsigned long min_rate, unsigned long max_rate); +int clk_hw_set_spread_spectrum(struct clk_hw *hw, unsigned int modfreq, + unsigned int spreaddepth, enum clk_ssc_method method, + bool enable); static inline void __clk_hw_set_clk(struct clk_hw *dst, struct clk_hw *src) { diff --git a/include/linux/clk.h b/include/linux/clk.h index b607482ca77e987b9344c38f25ebb5c8d35c1d39..49a7f7eb8b03233e11cd3b92768896c4e45c4e7c 100644 --- a/include/linux/clk.h +++ b/include/linux/clk.h @@ -858,6 +858,21 @@ int clk_set_rate(struct clk *clk, unsigned long rate); */ int clk_set_rate_exclusive(struct clk *clk, unsigned long rate); +/** + * clk_set_spread_spectrum - set the spread spectrum for a clock + * @clk: clock source + * @modfreq: modulation freq + * @spreadpercent: modulation percentage + * @method: down spread, up spread, center spread or else + * @enable: enable or disable + * + * Configure the spread spectrum parameters for a clock. + * + * Returns success (0) or negative errno. + */ +int clk_set_spread_spectrum(struct clk *clk, unsigned int modfreq, + unsigned int spreadpercent, unsigned int method, + bool enable); /** * clk_has_parent - check if a clock is a possible parent for another * @clk: clock source @@ -1088,6 +1103,13 @@ static inline int clk_set_rate_exclusive(struct clk *clk, unsigned long rate) return 0; } +static inline int clk_set_spread_spectrum(struct clk *clk, unsigned int modfreq, + unsigned int spreadpercent, + unsigned int method, bool enable) +{ + return 0; +} + static inline long clk_round_rate(struct clk *clk, unsigned long rate) { return 0;