From patchwork Thu Sep 26 10:43:20 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cristian Ciocaltea X-Patchwork-Id: 13813215 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (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 664AB1AD3F1; Thu, 26 Sep 2024 10:43:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727347437; cv=none; b=JC4VvVKbFMss9srM+2RTFbXt0/CUjo/S/03pbfO6L17vQNJ2zkvqRiTphOSfX0sbgEyTdRo8nhVp1COF05Dtc7KDIOLYj6qCT0NRotO2uwEEHPzSbeh4OQEwDLQo2pbNrhEBtKLvL4GHGqYJwJDmqPUjLkQ9wvK9696s5r8ITGg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727347437; c=relaxed/simple; bh=UWkx5xlyNvLP5psq5yb/wchMlUuTkv6Jgwny0fleod8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gJ2BsjVacbGqAVuPR7g+Bxa3InKmO3NVa0roST0HUYFMffpJInTJ8JQQ9nCNLGlBexBFnpMWcvfS/xsPBtSSDq4CwwdUn0Mh0PT92gmPTNNRq8S3UcGX+uLREJTvd1IePNAWwVQquEwgdkakuFGim8Z/6LDmrjJSnKke9HIWvZ8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=eiBehqut; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="eiBehqut" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1727347433; bh=UWkx5xlyNvLP5psq5yb/wchMlUuTkv6Jgwny0fleod8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=eiBehqut23NyCV/lfTj+SQlxkHVH+w11+l5Gi0tI77WdBej2T9md5ZpPyDXies40W kgti+R3zACLZ5IcHZ5m1SYrX1t1NmoEF29BHDJPrHCCrysh7JRrJLlZ8srOTZQ7cAs 6vboJp0fk9+XunsAeBfXLuxQScvJlAiDEB8/pDEx2LZ9a/O0/2yjw3Kt5wgcrGS/Xr LaLtrOX1jRFheK6H15NQHQMZ2Pya5gX/Pk0tigk7/9lvT899KKZqDZDfSPQLBvJuog 1JWkdScr1D7JQhZ0AHOzvQteCBKU6IMsEOcZRurZ+f7n3xGeQwVDKlr9AD0FyO0kLz THHrWAqocXKbg== Received: from localhost (unknown [IPv6:2a01:e0a:d1a:1250:792b:136f:2a18:fd70]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 8DC7917E11FA; Thu, 26 Sep 2024 12:43:53 +0200 (CEST) From: Cristian Ciocaltea Date: Thu, 26 Sep 2024 13:43:20 +0300 Subject: [PATCH v2 1/4] clk: Provide devm_clk_bulk_get_all_enabled() helper Precedence: bulk X-Mailing-List: linux-pci@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240926-clk_bulk_ena_fix-v2-1-9c767510fbb5@collabora.com> References: <20240926-clk_bulk_ena_fix-v2-0-9c767510fbb5@collabora.com> In-Reply-To: <20240926-clk_bulk_ena_fix-v2-0-9c767510fbb5@collabora.com> To: Michael Turquette , Stephen Boyd , Russell King , Matthias Brugger , AngeloGioacchino Del Regno , Jingoo Han , Lorenzo Pieralisi , =?utf-8?q?Krzysztof_Wilczy?= =?utf-8?q?=C5=84ski?= , Manivannan Sadhasivam , Rob Herring , Bjorn Helgaas , Krzysztof Kozlowski , Alim Akhtar Cc: kernel@collabora.com, linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-pci@vger.kernel.org, linux-samsung-soc@vger.kernel.org X-Mailer: b4 0.14.1 Commit 265b07df758a ("clk: Provide managed helper to get and enable bulk clocks") added devm_clk_bulk_get_all_enable() function, but missed to return the number of clocks stored in the clk_bulk_data table referenced by the clks argument. Without knowing the number, it's not possible to iterate these clocks when needed, hence the argument is useless and could have been simply removed. Introduce devm_clk_bulk_get_all_enabled() variant, which is consistent with devm_clk_bulk_get_all() in terms of the returned value: > 0 if one or more clocks have been stored = 0 if there are no clocks < 0 if an error occurred Moreover, the naming is consistent with devm_clk_get_enabled(), i.e. use the past form of 'enable'. Reviewed-by: AngeloGioacchino Del Regno Reviewed-by: Manivannan Sadhasivam Signed-off-by: Cristian Ciocaltea --- drivers/clk/clk-devres.c | 34 ++++++++++++++++++++++++++++++++++ include/linux/clk.h | 24 ++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c index 82ae1f26e634..4203aaaa7544 100644 --- a/drivers/clk/clk-devres.c +++ b/drivers/clk/clk-devres.c @@ -250,6 +250,40 @@ int __must_check devm_clk_bulk_get_all_enable(struct device *dev, } EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enable); +int __must_check devm_clk_bulk_get_all_enabled(struct device *dev, + struct clk_bulk_data **clks) +{ + struct clk_bulk_devres *devres; + int ret; + + devres = devres_alloc(devm_clk_bulk_release_all_enable, + sizeof(*devres), GFP_KERNEL); + if (!devres) + return -ENOMEM; + + ret = clk_bulk_get_all(dev, &devres->clks); + if (ret <= 0) + goto err_free_devres; + + *clks = devres->clks; + devres->num_clks = ret; + + ret = clk_bulk_prepare_enable(devres->num_clks, *clks); + if (ret) { + clk_bulk_put_all(devres->num_clks, devres->clks); + goto err_free_devres; + } + + devres_add(dev, devres); + + return devres->num_clks; + +err_free_devres: + devres_free(devres); + return ret; +} +EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enabled); + static int devm_clk_match(struct device *dev, void *res, void *data) { struct clk **c = res; diff --git a/include/linux/clk.h b/include/linux/clk.h index 851a0f2cf42c..158c5072852e 100644 --- a/include/linux/clk.h +++ b/include/linux/clk.h @@ -511,6 +511,24 @@ int __must_check devm_clk_bulk_get_all(struct device *dev, int __must_check devm_clk_bulk_get_all_enable(struct device *dev, struct clk_bulk_data **clks); +/** + * devm_clk_bulk_get_all_enabled - Get and enable all clocks of the consumer (managed) + * @dev: device for clock "consumer" + * @clks: pointer to the clk_bulk_data table of consumer + * + * Returns a positive value for the number of clocks obtained while the + * clock references are stored in the clk_bulk_data table in @clks field. + * Returns 0 if there're none and a negative value if something failed. + * + * This helper function allows drivers to get all clocks of the + * consumer and enables them in one operation with management. + * The clks will automatically be disabled and freed when the device + * is unbound. + */ + +int __must_check devm_clk_bulk_get_all_enabled(struct device *dev, + struct clk_bulk_data **clks); + /** * devm_clk_get - lookup and obtain a managed reference to a clock producer. * @dev: device for clock "consumer" @@ -1040,6 +1058,12 @@ static inline int __must_check devm_clk_bulk_get_all_enable(struct device *dev, return 0; } +static inline int __must_check devm_clk_bulk_get_all_enabled(struct device *dev, + struct clk_bulk_data **clks) +{ + return 0; +} + static inline struct clk *devm_get_clk_from_child(struct device *dev, struct device_node *np, const char *con_id) {