From nobody Sun Dec 14 11:13:58 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (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 D7A48283121 for ; Thu, 11 Dec 2025 23:42:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765496569; cv=none; b=giWHFRC+7/Km4jME0uvtRLP22hiZEV01lbh4XO2JoxQTh2BVMqZID5hhY8Gegog3la13CQCvlddv6Cb6HBxvO0TXMPrgd4BHRSEujlboRBOKl2cgerKzCcACA/NRm53lpvD2X/spI36lccmwxfKfIpYLeEIAD1eW5smW5x/b9Kk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765496569; c=relaxed/simple; bh=Ih9wCYsTB/Pc16jR/dvvroC+fpz/z+qOgLubxgOuVK4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Q66H9/w4Sz2OAYQkbXyrRu/FvcrtYuX8uH+mhdsmXAPLA7VtOeECNBQfC5+HVFXDSMO9TrYYRR6aSE/LIyJ8Wemo4vklF19i77+TRXDtQTC8G90m3rF1xrnplb1n/Zi5XalUswnYC7Fobj/2u5GKgFKVpKjQEJ6iyMJnbrc/PjQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=ajYnLUE9; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b=B70Ei6Fm; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="ajYnLUE9"; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b="B70Ei6Fm" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1765496566; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9GKBhFvbcI606yEMZFba/2jQl9vAZ7vYvocubB3FnYQ=; b=ajYnLUE93GOak89PJUnmTgAOK8o/S/fgeS89ZPOX3pHZXn2h2i0cMY8S/z5KjNxtqJ7q// LFNriNwB0rMEqMCKBMheoiitR+200JQPuvjMWD9UAqHkSuzf5M3aJfe0i7m50K4Vplw4SO 33GrOmqtqwDhZCv2jmlcU9IdW0Xn6Hg= Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-113-joUPOtmcMf-ldbB4C3RZhQ-1; Thu, 11 Dec 2025 18:42:45 -0500 X-MC-Unique: joUPOtmcMf-ldbB4C3RZhQ-1 X-Mimecast-MFC-AGG-ID: joUPOtmcMf-ldbB4C3RZhQ_1765496564 Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-7c240728e2aso1143396b3a.3 for ; Thu, 11 Dec 2025 15:42:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1765496561; x=1766101361; 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=9GKBhFvbcI606yEMZFba/2jQl9vAZ7vYvocubB3FnYQ=; b=B70Ei6Fm7fH3mA+3s2L68atazaCdX2CmMVcIFUkYQxJBsS5W3tgsVkVH9aa5fJsJ2k Kn6XiTn5sUFYViaeDQSnZVTCwNeOZKj4jHTHyPSreO2NSnKDeoQbNyixvO7THwwAsjTS 9kDa62yRJFa7fbpK0bmr7RtXTRvihOQftC+zR6p7Tbzvcd9k/ECX+Dee1Ym9eg+xslFQ FnURSVsJZNr6Utb1LudSDo/u/WKSKINgKLjsD0GuoL/2UnDf6R50Mj0uQm34AJ5OY6zM RgPHhDM6eEVY5na4+QUJOLYJWOKSXe9exilhTztycXo0slZ2kpKYtTwWeVHvYcsyPztd hYjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765496561; x=1766101361; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=9GKBhFvbcI606yEMZFba/2jQl9vAZ7vYvocubB3FnYQ=; b=xHi0fHuh0dyH5Vfte4k1sCER7ctFkGxKKOBXTyiGLAerVWIYCvNg+ix8DcMYU/3R4t D7KScfhpIEF+5J6JUJX53kdTv86+PHoIGZ1HTAzQmGBhYCLybQyusoXPeLJ2dpdL83Ph BYkHGxXKFbsCV5DG6SWwQfvr2Nu+K1JgiYuXKaIG9HdtTdy2DT/PZO4MxKjka/y85sTm meDVygV5zqgn6dMPmae9OX4pzVXBRE9o6RsGzpfTp5J8tLULbR7diHB1F+wryoexvHq+ EKaCNfwixUb5OSBw5oh5NQ3jhk5nyBtYyN/ukdSXNft2xn8Xe0Ou0A82fLksyNGS2UYa Kpyw== X-Forwarded-Encrypted: i=1; AJvYcCUDjImKCqICrhefKNIu9siIYsNfnTj4J4kBaxB51QVWNL7e0RCjeg1l6yJgepzG+JbpoQScbgC0QUIxNuM=@vger.kernel.org X-Gm-Message-State: AOJu0Yzlp6iyV5okfACEiwp+wKIrpo6iFjS+H5V0vXJyxOWtEI0zEiKI 6syYHGU8Dm53XBoC2uZn05eo663bEUKnyMsICTjbEjwIDpKkQ9X1xtcXIKBpOqzu/LeWkZbKQxN LGAVdQZU4vSs2qYWZo7KSp0QuTeMkAQtCUWBHayr3VyXMyUJKJqoQtls2RXTEyp0XbXrZU/7SeI Z6 X-Gm-Gg: AY/fxX6KTzXiaLuUO09/Dv4VCel+PuuWg5iNhxMU7rPplbnP5YwgBl2BQlKfIWOoh+Z 2G1V6ouSNPiCZG2zlpv4awjOzfkECxjgQJkMscddvJM5uy36A6dPEYTjtXV6xxggvHoysFF7TIq LWOsqlqq5HcxwJy3L6TVtUtJMsIQqb4dhP3gC9KZ6AdrJ1iTumUgL4lPnOX6Blbkr+q23ostlMK Kf03orJsjcfokbS2xUUAX1Q8BuOYR0ZUC3za6CpLGExJK4s995MKlOZkJ+g72s18Zdepo1rjsCK WCkyUPOPYz7LdssBMqzP2G2FE2fj6g0QWQDc68+eZ7LvTuxpm61L8G+gaMK98qBg1fsRrXxc461 5JekfFsuc2LeWui5O+DQ3bTsB7Mjo/dw/aOVNG3NPOur5GSGbbIjV3Q== X-Received: by 2002:a05:701b:2506:b0:11d:fc72:e17f with SMTP id a92af1059eb24-11f34beb468mr201993c88.18.1765496560941; Thu, 11 Dec 2025 15:42:40 -0800 (PST) X-Google-Smtp-Source: AGHT+IFWbTPegde3SJDmD39k4dPTKiQGShCracrJjHPeU7HNhRaJrE3woOQLP4+L53eZ4gYKS4klhg== X-Received: by 2002:a05:701b:2506:b0:11d:fc72:e17f with SMTP id a92af1059eb24-11f34beb468mr201967c88.18.1765496560381; Thu, 11 Dec 2025 15:42:40 -0800 (PST) Received: from [192.168.101.129] (c-73-183-52-120.hsd1.pa.comcast.net. [73.183.52.120]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-11f2e304766sm12034395c88.13.2025.12.11.15.42.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Dec 2025 15:42:39 -0800 (PST) From: Brian Masney Date: Fri, 12 Dec 2025 08:41:42 +0900 Subject: [PATCH 3/3] clk: remove round_rate() clk ops 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: <20251212-clk-remove-round-rate-v1-3-5c3d5f3edc78@redhat.com> References: <20251212-clk-remove-round-rate-v1-0-5c3d5f3edc78@redhat.com> In-Reply-To: <20251212-clk-remove-round-rate-v1-0-5c3d5f3edc78@redhat.com> To: Jonathan Corbet , Michael Turquette , Stephen Boyd , Maxime Ripard Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org, Brian Masney X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=10244; i=bmasney@redhat.com; s=20250903; h=from:subject:message-id; bh=Ih9wCYsTB/Pc16jR/dvvroC+fpz/z+qOgLubxgOuVK4=; b=owGbwMvMwCW2/dJd9di6A+2Mp9WSGDKtw26uX7v3+D+RF9pMVQ/rA/Pfqj17+my/mFzTzKZpy wQCH71521HKwiDGxSArpsiyJNeoICJ1le29O5osMHNYmUCGMHBxCsBEgj0ZGfb5Kvbr9G6vM12x p7p859THe38GS6Y/dmf5xyx4VHFx4V9GhltBGhFnb8znf72k9u/MzwGF/strO3l2+gcdcLnL8/e LAycA X-Developer-Key: i=bmasney@redhat.com; a=openpgp; fpr=A46D32705865AA3DDEDC2904B7D2DD275D7EC087 The round_rate() clk ops is deprecated, and all in tree drivers have been converted, so let's go ahead and remove any references to the round_rate() clk ops. Signed-off-by: Brian Masney --- Documentation/driver-api/clk.rst | 9 +-------- drivers/clk/clk.c | 39 ++++++++++++++----------------------= --- include/linux/clk-provider.h | 18 ++++++------------ 3 files changed, 21 insertions(+), 45 deletions(-) diff --git a/Documentation/driver-api/clk.rst b/Documentation/driver-api/cl= k.rst index 93bab5336dfda06069eea700d2830089bf3bce03..c6aca8186a7864f77c00feccd68= d431303ab01b7 100644 --- a/Documentation/driver-api/clk.rst +++ b/Documentation/driver-api/clk.rst @@ -77,9 +77,6 @@ the operations defined in clk-provider.h:: void (*disable_unused)(struct clk_hw *hw); unsigned long (*recalc_rate)(struct clk_hw *hw, unsigned long parent_rate); - long (*round_rate)(struct clk_hw *hw, - unsigned long rate, - unsigned long *parent_rate); int (*determine_rate)(struct clk_hw *hw, struct clk_rate_request *req); int (*set_parent)(struct clk_hw *hw, u8 index); @@ -220,9 +217,7 @@ optional or must be evaluated on a case-by-case basis. +----------------+------+-------------+---------------+-------------+--= ----+ |.recalc_rate | | y | | | = | +----------------+------+-------------+---------------+-------------+--= ----+ - |.round_rate | | y [1]_ | | | = | - +----------------+------+-------------+---------------+-------------+--= ----+ - |.determine_rate | | y [1]_ | | | = | + |.determine_rate | | y | | | = | +----------------+------+-------------+---------------+-------------+--= ----+ |.set_rate | | y | | | = | +----------------+------+-------------+---------------+-------------+--= ----+ @@ -238,8 +233,6 @@ optional or must be evaluated on a case-by-case basis. |.init | | | | | = | +----------------+------+-------------+---------------+-------------+--= ----+ =20 -.. [1] either one of round_rate or determine_rate is required. - Finally, register your clock at run-time with a hardware-specific registration function. This function simply populates struct clk_foo's data and then passes the common struct clk parameters to the framework diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 85d2f2481acf360f0618a4a382fb51250e9c2fc4..cab715bbe6474451776c95da7e3= 7b24a228a233f 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -1560,8 +1560,6 @@ late_initcall_sync(clk_disable_unused); static int clk_core_determine_round_nolock(struct clk_core *core, struct clk_rate_request *req) { - long rate; - lockdep_assert_held(&prepare_lock); =20 if (!core) @@ -1591,13 +1589,6 @@ static int clk_core_determine_round_nolock(struct cl= k_core *core, req->rate =3D core->rate; } else if (core->ops->determine_rate) { return core->ops->determine_rate(core->hw, req); - } else if (core->ops->round_rate) { - rate =3D core->ops->round_rate(core->hw, req->rate, - &req->best_parent_rate); - if (rate < 0) - return rate; - - req->rate =3D rate; } else { return -EINVAL; } @@ -1682,7 +1673,7 @@ EXPORT_SYMBOL_GPL(clk_hw_forward_rate_request); =20 static bool clk_core_can_round(struct clk_core * const core) { - return core->ops->determine_rate || core->ops->round_rate; + return core->ops->determine_rate; } =20 static int clk_core_round_rate_nolock(struct clk_core *core, @@ -1750,11 +1741,11 @@ EXPORT_SYMBOL_GPL(__clk_determine_rate); * use. * * Context: prepare_lock must be held. - * For clk providers to call from within clk_ops such as .round_r= ate, + * For clk providers to call from within clk_ops such as * .determine_rate. * - * Return: returns rounded rate of hw clk if clk supports round_rate opera= tion - * else returns the parent rate. + * Return: returns rounded rate of hw clk if clk supports determine_rate + * operation; else returns the parent rate. */ unsigned long clk_hw_round_rate(struct clk_hw *hw, unsigned long rate) { @@ -2569,12 +2560,13 @@ static int clk_core_set_rate_nolock(struct clk_core= *core, * * Setting the CLK_SET_RATE_PARENT flag allows the rate change operation to * propagate up to clk's parent; whether or not this happens depends on the - * outcome of clk's .round_rate implementation. If *parent_rate is unchan= ged - * after calling .round_rate then upstream parent propagation is ignored. = If - * *parent_rate comes back with a new rate for clk's parent then we propag= ate - * up to clk's parent and set its rate. Upward propagation will continue - * until either a clk does not support the CLK_SET_RATE_PARENT flag or - * .round_rate stops requesting changes to clk's parent_rate. + * outcome of clk's .determine_rate implementation. If req->best_parent_ra= te + * is unchanged after calling .determine_rate then upstream parent propaga= tion + * is ignored. If req->best_parent_rate comes back with a new rate for cl= k's + * parent then we propagate up to clk's parent and set its rate. Upward + * propagation will continue until either a clk does not support the + * CLK_SET_RATE_PARENT flag or .determine_rate stops requesting changes to + * clk's parent_rate. * * Rate changes are accomplished via tree traversal that also recalculates= the * rates for the clocks and fires off POST_RATE_CHANGE notifiers. @@ -2703,8 +2695,6 @@ static int clk_set_rate_range_nolock(struct clk *clk, * FIXME: * There is a catch. It may fail for the usual reason (clock * broken, clock protected, etc) but also because: - * - round_rate() was not favorable and fell on the wrong - * side of the boundary * - the determine_rate() callback does not really check for * this corner case when determining the rate */ @@ -3915,10 +3905,9 @@ static int __clk_core_init(struct clk_core *core) } =20 /* check that clk_ops are sane. See Documentation/driver-api/clk.rst */ - if (core->ops->set_rate && - !((core->ops->round_rate || core->ops->determine_rate) && - core->ops->recalc_rate)) { - pr_err("%s: %s must implement .round_rate or .determine_rate in addition= to .recalc_rate\n", + if (core->ops->set_rate && !core->ops->determine_rate && + core->ops->recalc_rate) { + pr_err("%s: %s must implement .determine_rate in addition to .recalc_rat= e\n", __func__, core->name); ret =3D -EINVAL; goto out; diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index 630705a47129453c241f1b1755f2c2f2a7ed8f77..1cda2c78dffaff037f0f16b0f11= 106b63b3a746f 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h @@ -136,10 +136,6 @@ struct clk_duty { * 0. Returns the calculated rate. Optional, but recommended - if * this op is not set then clock rate will be initialized to 0. * - * @round_rate: Given a target rate as input, returns the closest rate act= ually - * supported by the clock. The parent rate is an input/output - * parameter. - * * @determine_rate: Given a target rate as input, returns the closest rate * actually supported by the clock, and optionally the parent clock * that should be used to provide the clock rate. @@ -163,13 +159,13 @@ struct clk_duty { * * @set_rate: Change the rate of this clock. The requested rate is specifi= ed * by the second argument, which should typically be the return - * of .round_rate call. The third argument gives the parent rate - * which is likely helpful for most .set_rate implementation. + * of .determine_rate call. The third argument gives the parent + * rate which is likely helpful for most .set_rate implementation. * Returns 0 on success, -EERROR otherwise. * * @set_rate_and_parent: Change the rate and the parent of this clock. The * requested rate is specified by the second argument, which - * should typically be the return of .round_rate call. The + * should typically be the return of clk_round_rate() call. The * third argument gives the parent rate which is likely helpful * for most .set_rate_and_parent implementation. The fourth * argument gives the parent index. This callback is optional (and @@ -244,8 +240,6 @@ struct clk_ops { void (*restore_context)(struct clk_hw *hw); unsigned long (*recalc_rate)(struct clk_hw *hw, unsigned long parent_rate); - long (*round_rate)(struct clk_hw *hw, unsigned long rate, - unsigned long *parent_rate); int (*determine_rate)(struct clk_hw *hw, struct clk_rate_request *req); int (*set_parent)(struct clk_hw *hw, u8 index); @@ -679,7 +673,7 @@ struct clk_div_table { * @lock: register lock * * Clock with an adjustable divider affecting its output frequency. Imple= ments - * .recalc_rate, .set_rate and .round_rate + * .recalc_rate, .set_rate and .determine_rate * * @flags: * CLK_DIVIDER_ONE_BASED - by default the divisor is the value read from t= he @@ -1126,7 +1120,7 @@ void of_fixed_factor_clk_setup(struct device_node *no= de); * * Clock with a fixed multiplier and divider. The output frequency is the * parent clock rate divided by div and multiplied by mult. - * Implements .recalc_rate, .set_rate, .round_rate and .recalc_accuracy + * Implements .recalc_rate, .set_rate, .determine_rate and .recalc_accuracy * * Flags: * * CLK_FIXED_FACTOR_FIXED_ACCURACY - Use the value in @acc instead of the @@ -1254,7 +1248,7 @@ void clk_hw_unregister_fractional_divider(struct clk_= hw *hw); * @lock: register lock * * Clock with an adjustable multiplier affecting its output frequency. - * Implements .recalc_rate, .set_rate and .round_rate + * Implements .recalc_rate, .set_rate and .determine_rate * * @flags: * CLK_MULTIPLIER_ZERO_BYPASS - By default, the multiplier is the value re= ad --=20 2.52.0