Add initial support for new target with the initial patch for ethernet support using pending upstream patches for PCS UNIPHY, PPE and EDMA. Only initramfs currently working as support for new SPI/NAND implementation, USB, CPUFreq and other devices is still unfinished and needs to be evaluated. Link: https://github.com/openwrt/openwrt/pull/17725 Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
115 lines
3.6 KiB
Diff
115 lines
3.6 KiB
Diff
From 265b07df758a998f60cf5b5aec6bd72ca676655e Mon Sep 17 00:00:00 2001
|
|
From: Shradha Todi <shradha.t@samsung.com>
|
|
Date: Tue, 20 Feb 2024 14:10:45 +0530
|
|
Subject: [PATCH] clk: Provide managed helper to get and enable bulk clocks
|
|
|
|
Provide a managed devm_clk_bulk* wrapper to get and enable all
|
|
bulk clocks in order to simplify drivers that keeps all clocks
|
|
enabled for the time of driver operation.
|
|
|
|
Suggested-by: Marek Szyprowski <m.szyprowski@samsung.com>
|
|
Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com>
|
|
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
|
|
Signed-off-by: Shradha Todi <shradha.t@samsung.com>
|
|
Link: https://lore.kernel.org/r/20240220084046.23786-2-shradha.t@samsung.com
|
|
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
|
|
---
|
|
drivers/clk/clk-devres.c | 40 ++++++++++++++++++++++++++++++++++++++++
|
|
include/linux/clk.h | 22 ++++++++++++++++++++++
|
|
2 files changed, 62 insertions(+)
|
|
|
|
diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c
|
|
index 737aa70e2cb3..90e6078fb6e1 100644
|
|
--- a/drivers/clk/clk-devres.c
|
|
+++ b/drivers/clk/clk-devres.c
|
|
@@ -182,6 +182,46 @@ int __must_check devm_clk_bulk_get_all(struct device *dev,
|
|
}
|
|
EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all);
|
|
|
|
+static void devm_clk_bulk_release_all_enable(struct device *dev, void *res)
|
|
+{
|
|
+ struct clk_bulk_devres *devres = res;
|
|
+
|
|
+ clk_bulk_disable_unprepare(devres->num_clks, devres->clks);
|
|
+ clk_bulk_put_all(devres->num_clks, devres->clks);
|
|
+}
|
|
+
|
|
+int __must_check devm_clk_bulk_get_all_enable(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) {
|
|
+ *clks = devres->clks;
|
|
+ devres->num_clks = ret;
|
|
+ } else {
|
|
+ devres_free(devres);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ ret = clk_bulk_prepare_enable(devres->num_clks, *clks);
|
|
+ if (!ret) {
|
|
+ devres_add(dev, devres);
|
|
+ } else {
|
|
+ clk_bulk_put_all(devres->num_clks, devres->clks);
|
|
+ devres_free(devres);
|
|
+ }
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enable);
|
|
+
|
|
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 06f1b292f8a0..0f44d3863de2 100644
|
|
--- a/include/linux/clk.h
|
|
+++ b/include/linux/clk.h
|
|
@@ -478,6 +478,22 @@ int __must_check devm_clk_bulk_get_optional(struct device *dev, int num_clks,
|
|
int __must_check devm_clk_bulk_get_all(struct device *dev,
|
|
struct clk_bulk_data **clks);
|
|
|
|
+/**
|
|
+ * devm_clk_bulk_get_all_enable - 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 success (0) or negative errno.
|
|
+ *
|
|
+ * 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_enable(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"
|
|
@@ -968,6 +984,12 @@ static inline int __must_check devm_clk_bulk_get_all(struct device *dev,
|
|
return 0;
|
|
}
|
|
|
|
+static inline int __must_check devm_clk_bulk_get_all_enable(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)
|
|
{
|
|
--
|
|
2.45.2
|
|
|