All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] clk: ccf: Add some helper functions for clock ops
@ 2022-03-20 20:34 Sean Anderson
  2022-03-20 20:34 ` [PATCH 2/2] clk: Use generic CCF ops where possible Sean Anderson
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Sean Anderson @ 2022-03-20 20:34 UTC (permalink / raw)
  To: u-boot
  Cc: Peng Fan, Eugen Hristev, Claudiu Beznea, Cyril Jean,
	Lukasz Majewski, Giulio Benetti, Sean Anderson

Most CCF drivers follow a common pattern where their clock ops defer the
actual operation to the backing CCF clock. Add some generic implementations
of these functions to reduce duplication of code.

Signed-off-by: Sean Anderson <seanga2@gmail.com>
---

 drivers/clk/clk.c            | 65 ++++++++++++++++++++++++++++++++++++
 include/linux/clk-provider.h |  8 +++++
 2 files changed, 73 insertions(+)

diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index eff0fa134f..a5a3461b66 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -74,3 +74,68 @@ bool clk_dev_binded(struct clk *clk)
 
 	return false;
 }
+
+/* Helper functions for clock ops */
+
+ulong ccf_clk_get_rate(struct clk *clk)
+{
+	struct clk *c;
+	int err = clk_get_by_id(clk->id, &c);
+
+	if (err)
+		return err;
+	return clk_get_rate(c);
+}
+
+ulong ccf_clk_set_rate(struct clk *clk, unsigned long rate)
+{
+	struct clk *c;
+	int err = clk_get_by_id(clk->id, &c);
+
+	if (err)
+		return err;
+	return clk_set_rate(c, rate);
+}
+
+int ccf_clk_set_parent(struct clk *clk, struct clk *parent)
+{
+	struct clk *c, *p;
+	int err = clk_get_by_id(clk->id, &c);
+
+	if (err)
+		return err;
+
+	err = clk_get_by_id(parent->id, &p);
+	if (err)
+		return err;
+
+	return clk_set_parent(c, p);
+}
+
+static int ccf_clk_endisable(struct clk *clk, bool enable)
+{
+	struct clk *c;
+	int err = clk_get_by_id(clk->id, &c);
+
+	if (err)
+		return err;
+	return enable ? clk_enable(c) : clk_disable(c);
+}
+
+int ccf_clk_enable(struct clk *clk)
+{
+	return ccf_clk_endisable(clk, true);
+}
+
+int ccf_clk_disable(struct clk *clk)
+{
+	return ccf_clk_endisable(clk, false);
+}
+
+const struct clk_ops ccf_clk_ops = {
+	.set_rate = ccf_clk_set_rate,
+	.get_rate = ccf_clk_get_rate,
+	.set_parent = ccf_clk_set_parent,
+	.enable = ccf_clk_enable,
+	.disable = ccf_clk_disable,
+};
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
index 9a6116646d..2d04882d05 100644
--- a/include/linux/clk-provider.h
+++ b/include/linux/clk-provider.h
@@ -254,4 +254,12 @@ const char *clk_hw_get_name(const struct clk *hw);
 ulong clk_generic_get_rate(struct clk *clk);
 
 struct clk *dev_get_clk_ptr(struct udevice *dev);
+
+ulong ccf_clk_get_rate(struct clk *clk);
+ulong ccf_clk_set_rate(struct clk *clk, unsigned long rate);
+int ccf_clk_set_parent(struct clk *clk, struct clk *parent);
+int ccf_clk_enable(struct clk *clk);
+int ccf_clk_disable(struct clk *clk);
+extern const struct clk_ops ccf_clk_ops;
+
 #endif /* __LINUX_CLK_PROVIDER_H */
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/2] clk: Use generic CCF ops where possible
  2022-03-20 20:34 [PATCH 1/2] clk: ccf: Add some helper functions for clock ops Sean Anderson
@ 2022-03-20 20:34 ` Sean Anderson
  2022-03-21  1:30   ` Peng Fan (OSS)
                     ` (2 more replies)
  2022-03-21  1:29 ` [PATCH 1/2] clk: ccf: Add some helper functions for clock ops Peng Fan (OSS)
  2022-03-30 19:21 ` Sean Anderson
  2 siblings, 3 replies; 7+ messages in thread
From: Sean Anderson @ 2022-03-20 20:34 UTC (permalink / raw)
  To: u-boot
  Cc: Peng Fan, Eugen Hristev, Claudiu Beznea, Cyril Jean,
	Lukasz Majewski, Giulio Benetti, Sean Anderson

This converts most CCF drivers to use generic ops. imx6q is the only
outlier, where we retain the existing functionality by moving the check to
request().

Signed-off-by: Sean Anderson <seanga2@gmail.com>
---

 drivers/clk/at91/pmc.c           | 56 ++------------------
 drivers/clk/imx/clk-imx6q.c      | 73 +++-----------------------
 drivers/clk/imx/clk-imx8mm.c     | 88 +------------------------------
 drivers/clk/imx/clk-imx8mn.c     | 88 +------------------------------
 drivers/clk/imx/clk-imx8mp.c     | 90 +-------------------------------
 drivers/clk/imx/clk-imxrt1020.c  | 65 ++---------------------
 drivers/clk/imx/clk-imxrt1050.c  | 85 +-----------------------------
 drivers/clk/microchip/mpfs_clk.c | 67 +-----------------------
 8 files changed, 21 insertions(+), 591 deletions(-)

diff --git a/drivers/clk/at91/pmc.c b/drivers/clk/at91/pmc.c
index 1fa42d728b..58bf1047b5 100644
--- a/drivers/clk/at91/pmc.c
+++ b/drivers/clk/at91/pmc.c
@@ -21,60 +21,12 @@ static int at91_clk_of_xlate(struct clk *clk, struct ofnode_phandle_args *args)
 	return 0;
 }
 
-static ulong at91_clk_get_rate(struct clk *clk)
-{
-	struct clk *c;
-	int ret;
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	return clk_get_rate(c);
-}
-
-static ulong at91_clk_set_rate(struct clk *clk, ulong rate)
-{
-	struct clk *c;
-	int ret;
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	return clk_set_rate(c, rate);
-}
-
-static int at91_clk_enable(struct clk *clk)
-{
-	struct clk *c;
-	int ret;
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	return clk_enable(c);
-}
-
-static int at91_clk_disable(struct clk *clk)
-{
-	struct clk *c;
-	int ret;
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	return clk_disable(c);
-}
-
 const struct clk_ops at91_clk_ops = {
 	.of_xlate	= at91_clk_of_xlate,
-	.set_rate	= at91_clk_set_rate,
-	.get_rate	= at91_clk_get_rate,
-	.enable		= at91_clk_enable,
-	.disable	= at91_clk_disable,
+	.set_rate	= ccf_clk_set_rate,
+	.get_rate	= ccf_clk_get_rate,
+	.enable		= ccf_clk_enable,
+	.disable	= ccf_clk_disable,
 };
 
 /**
diff --git a/drivers/clk/imx/clk-imx6q.c b/drivers/clk/imx/clk-imx6q.c
index 5343036bab..67825af89b 100644
--- a/drivers/clk/imx/clk-imx6q.c
+++ b/drivers/clk/imx/clk-imx6q.c
@@ -14,79 +14,22 @@
 
 #include "clk.h"
 
-static int imx6q_check_id(ulong id)
+static int imx6q_clk_request(struct clk *clk)
 {
-	if (id < IMX6QDL_CLK_DUMMY || id >= IMX6QDL_CLK_END) {
-		printf("%s: Invalid clk ID #%lu\n", __func__, id);
+	if (clk->id < IMX6QDL_CLK_DUMMY || clk->id >= IMX6QDL_CLK_END) {
+		printf("%s: Invalid clk ID #%lu\n", __func__, clk->id);
 		return -EINVAL;
 	}
 
 	return 0;
 }
 
-static ulong imx6q_clk_get_rate(struct clk *clk)
-{
-	struct clk *c;
-	int ret;
-
-	debug("%s(#%lu)\n", __func__, clk->id);
-
-	ret = imx6q_check_id(clk->id);
-	if (ret)
-		return ret;
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	return clk_get_rate(c);
-}
-
-static ulong imx6q_clk_set_rate(struct clk *clk, unsigned long rate)
-{
-	debug("%s(#%lu), rate: %lu\n", __func__, clk->id, rate);
-
-	return rate;
-}
-
-static int __imx6q_clk_enable(struct clk *clk, bool enable)
-{
-	struct clk *c;
-	int ret = 0;
-
-	debug("%s(#%lu) en: %d\n", __func__, clk->id, enable);
-
-	ret = imx6q_check_id(clk->id);
-	if (ret)
-		return ret;
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	if (enable)
-		ret = clk_enable(c);
-	else
-		ret = clk_disable(c);
-
-	return ret;
-}
-
-static int imx6q_clk_disable(struct clk *clk)
-{
-	return __imx6q_clk_enable(clk, 0);
-}
-
-static int imx6q_clk_enable(struct clk *clk)
-{
-	return __imx6q_clk_enable(clk, 1);
-}
-
 static struct clk_ops imx6q_clk_ops = {
-	.set_rate = imx6q_clk_set_rate,
-	.get_rate = imx6q_clk_get_rate,
-	.enable = imx6q_clk_enable,
-	.disable = imx6q_clk_disable,
+	.request = imx6q_clk_request,
+	.set_rate = ccf_clk_set_rate,
+	.get_rate = ccf_clk_get_rate,
+	.enable = ccf_clk_enable,
+	.disable = ccf_clk_disable,
 };
 
 static const char *const usdhc_sels[] = { "pll2_pfd2_396m", "pll2_pfd0_352m", };
diff --git a/drivers/clk/imx/clk-imx8mm.c b/drivers/clk/imx/clk-imx8mm.c
index 3aa8c641f9..443bbdae33 100644
--- a/drivers/clk/imx/clk-imx8mm.c
+++ b/drivers/clk/imx/clk-imx8mm.c
@@ -140,92 +140,6 @@ static const char *imx8mm_ecspi2_sels[] = {"clock-osc-24m", "sys_pll2_200m", "sy
 static const char *imx8mm_ecspi3_sels[] = {"clock-osc-24m", "sys_pll2_200m", "sys_pll1_40m", "sys_pll1_160m",
 					   "sys_pll1_800m", "sys_pll3_out", "sys_pll2_250m", "audio_pll2_out", };
 
-static ulong imx8mm_clk_get_rate(struct clk *clk)
-{
-	struct clk *c;
-	int ret;
-
-	debug("%s(#%lu)\n", __func__, clk->id);
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	return clk_get_rate(c);
-}
-
-static ulong imx8mm_clk_set_rate(struct clk *clk, unsigned long rate)
-{
-	struct clk *c;
-	int ret;
-
-	debug("%s(#%lu), rate: %lu\n", __func__, clk->id, rate);
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	return clk_set_rate(c, rate);
-}
-
-static int __imx8mm_clk_enable(struct clk *clk, bool enable)
-{
-	struct clk *c;
-	int ret;
-
-	debug("%s(#%lu) en: %d\n", __func__, clk->id, enable);
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	if (enable)
-		ret = clk_enable(c);
-	else
-		ret = clk_disable(c);
-
-	return ret;
-}
-
-static int imx8mm_clk_disable(struct clk *clk)
-{
-	return __imx8mm_clk_enable(clk, 0);
-}
-
-static int imx8mm_clk_enable(struct clk *clk)
-{
-	return __imx8mm_clk_enable(clk, 1);
-}
-
-static int imx8mm_clk_set_parent(struct clk *clk, struct clk *parent)
-{
-	struct clk *c, *cp;
-	int ret;
-
-	debug("%s(#%lu), parent: %lu\n", __func__, clk->id, parent->id);
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	ret = clk_get_by_id(parent->id, &cp);
-	if (ret)
-		return ret;
-
-	ret = clk_set_parent(c, cp);
-	c->dev->parent = cp->dev;
-
-	return ret;
-}
-
-static struct clk_ops imx8mm_clk_ops = {
-	.set_rate = imx8mm_clk_set_rate,
-	.get_rate = imx8mm_clk_get_rate,
-	.enable = imx8mm_clk_enable,
-	.disable = imx8mm_clk_disable,
-	.set_parent = imx8mm_clk_set_parent,
-};
-
 static int imx8mm_clk_probe(struct udevice *dev)
 {
 	void __iomem *base;
@@ -470,7 +384,7 @@ U_BOOT_DRIVER(imx8mm_clk) = {
 	.name = "clk_imx8mm",
 	.id = UCLASS_CLK,
 	.of_match = imx8mm_clk_ids,
-	.ops = &imx8mm_clk_ops,
+	.ops = &ccf_clk_ops,
 	.probe = imx8mm_clk_probe,
 	.flags = DM_FLAG_PRE_RELOC,
 };
diff --git a/drivers/clk/imx/clk-imx8mn.c b/drivers/clk/imx/clk-imx8mn.c
index e398d7de02..bb62138f8c 100644
--- a/drivers/clk/imx/clk-imx8mn.c
+++ b/drivers/clk/imx/clk-imx8mn.c
@@ -148,92 +148,6 @@ static const char * const imx8mn_usb_phy_sels[] = {"clock-osc-24m", "sys_pll1_10
 						"sys_pll2_100m", "sys_pll2_200m", "clk_ext2",
 						"clk_ext3", "audio_pll2_out", };
 
-static ulong imx8mn_clk_get_rate(struct clk *clk)
-{
-	struct clk *c;
-	int ret;
-
-	debug("%s(#%lu)\n", __func__, clk->id);
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	return clk_get_rate(c);
-}
-
-static ulong imx8mn_clk_set_rate(struct clk *clk, unsigned long rate)
-{
-	struct clk *c;
-	int ret;
-
-	debug("%s(#%lu), rate: %lu\n", __func__, clk->id, rate);
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	return clk_set_rate(c, rate);
-}
-
-static int __imx8mn_clk_enable(struct clk *clk, bool enable)
-{
-	struct clk *c;
-	int ret;
-
-	debug("%s(#%lu) en: %d\n", __func__, clk->id, enable);
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	if (enable)
-		ret = clk_enable(c);
-	else
-		ret = clk_disable(c);
-
-	return ret;
-}
-
-static int imx8mn_clk_disable(struct clk *clk)
-{
-	return __imx8mn_clk_enable(clk, 0);
-}
-
-static int imx8mn_clk_enable(struct clk *clk)
-{
-	return __imx8mn_clk_enable(clk, 1);
-}
-
-static int imx8mn_clk_set_parent(struct clk *clk, struct clk *parent)
-{
-	struct clk *c, *cp;
-	int ret;
-
-	debug("%s(#%lu), parent: %lu\n", __func__, clk->id, parent->id);
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	ret = clk_get_by_id(parent->id, &cp);
-	if (ret)
-		return ret;
-
-	ret = clk_set_parent(c, cp);
-	c->dev->parent = cp->dev;
-
-	return ret;
-}
-
-static struct clk_ops imx8mn_clk_ops = {
-	.set_rate = imx8mn_clk_set_rate,
-	.get_rate = imx8mn_clk_get_rate,
-	.enable = imx8mn_clk_enable,
-	.disable = imx8mn_clk_disable,
-	.set_parent = imx8mn_clk_set_parent,
-};
-
 static int imx8mn_clk_probe(struct udevice *dev)
 {
 	void __iomem *base;
@@ -481,7 +395,7 @@ U_BOOT_DRIVER(imx8mn_clk) = {
 	.name = "clk_imx8mn",
 	.id = UCLASS_CLK,
 	.of_match = imx8mn_clk_ids,
-	.ops = &imx8mn_clk_ops,
+	.ops = &ccf_clk_ops,
 	.probe = imx8mn_clk_probe,
 	.flags = DM_FLAG_PRE_RELOC,
 };
diff --git a/drivers/clk/imx/clk-imx8mp.c b/drivers/clk/imx/clk-imx8mp.c
index c77500bcce..ad84ce38ed 100644
--- a/drivers/clk/imx/clk-imx8mp.c
+++ b/drivers/clk/imx/clk-imx8mp.c
@@ -186,94 +186,6 @@ static const char *imx8mp_enet_phy_ref_sels[] = {"clock-osc-24m", "sys_pll2_50m"
 
 static const char *imx8mp_dram_core_sels[] = {"dram_pll_out", "dram_alt_root", };
 
-
-static ulong imx8mp_clk_get_rate(struct clk *clk)
-{
-	struct clk *c;
-	int ret;
-
-	debug("%s(#%lu)\n", __func__, clk->id);
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	return clk_get_rate(c);
-}
-
-static ulong imx8mp_clk_set_rate(struct clk *clk, unsigned long rate)
-{
-	struct clk *c;
-	int ret;
-
-	debug("%s(#%lu), rate: %lu\n", __func__, clk->id, rate);
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	return clk_set_rate(c, rate);
-}
-
-static int __imx8mp_clk_enable(struct clk *clk, bool enable)
-{
-	struct clk *c;
-	int ret;
-
-	debug("%s(#%lu) en: %d\n", __func__, clk->id, enable);
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	if (enable)
-		ret = clk_enable(c);
-	else
-		ret = clk_disable(c);
-
-	return ret;
-}
-
-static int imx8mp_clk_disable(struct clk *clk)
-{
-	return __imx8mp_clk_enable(clk, 0);
-}
-
-static int imx8mp_clk_enable(struct clk *clk)
-{
-	return __imx8mp_clk_enable(clk, 1);
-}
-
-static int imx8mp_clk_set_parent(struct clk *clk, struct clk *parent)
-{
-	struct clk *c, *cp;
-	int ret;
-
-	debug("%s(#%lu), parent: %lu\n", __func__, clk->id, parent->id);
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	ret = clk_get_by_id(parent->id, &cp);
-	if (ret)
-		return ret;
-
-	ret = clk_set_parent(c, cp);
-
-	c->dev->parent = cp->dev;
-
-	return ret;
-}
-
-static struct clk_ops imx8mp_clk_ops = {
-	.set_rate = imx8mp_clk_set_rate,
-	.get_rate = imx8mp_clk_get_rate,
-	.enable = imx8mp_clk_enable,
-	.disable = imx8mp_clk_disable,
-	.set_parent = imx8mp_clk_set_parent,
-};
-
 static int imx8mp_clk_probe(struct udevice *dev)
 {
 	void __iomem *base;
@@ -409,7 +321,7 @@ U_BOOT_DRIVER(imx8mp_clk) = {
 	.name = "clk_imx8mp",
 	.id = UCLASS_CLK,
 	.of_match = imx8mp_clk_ids,
-	.ops = &imx8mp_clk_ops,
+	.ops = &ccf_clk_ops,
 	.probe = imx8mp_clk_probe,
 	.flags = DM_FLAG_PRE_RELOC,
 };
diff --git a/drivers/clk/imx/clk-imxrt1020.c b/drivers/clk/imx/clk-imxrt1020.c
index 840f783940..3f8b4df3c5 100644
--- a/drivers/clk/imx/clk-imxrt1020.c
+++ b/drivers/clk/imx/clk-imxrt1020.c
@@ -14,68 +14,11 @@
 
 #include "clk.h"
 
-static ulong imxrt1020_clk_get_rate(struct clk *clk)
-{
-	struct clk *c;
-	int ret;
-
-	debug("%s(#%lu)\n", __func__, clk->id);
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	return clk_get_rate(c);
-}
-
-static ulong imxrt1020_clk_set_rate(struct clk *clk, unsigned long rate)
-{
-	struct clk *c;
-	int ret;
-
-	debug("%s(#%lu), rate: %lu\n", __func__, clk->id, rate);
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	return clk_set_rate(c, rate);
-}
-
-static int __imxrt1020_clk_enable(struct clk *clk, bool enable)
-{
-	struct clk *c;
-	int ret;
-
-	debug("%s(#%lu) en: %d\n", __func__, clk->id, enable);
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	if (enable)
-		ret = clk_enable(c);
-	else
-		ret = clk_disable(c);
-
-	return ret;
-}
-
-static int imxrt1020_clk_disable(struct clk *clk)
-{
-	return __imxrt1020_clk_enable(clk, 0);
-}
-
-static int imxrt1020_clk_enable(struct clk *clk)
-{
-	return __imxrt1020_clk_enable(clk, 1);
-}
-
 static struct clk_ops imxrt1020_clk_ops = {
-	.set_rate = imxrt1020_clk_set_rate,
-	.get_rate = imxrt1020_clk_get_rate,
-	.enable = imxrt1020_clk_enable,
-	.disable = imxrt1020_clk_disable,
+	.set_rate = ccf_clk_set_rate,
+	.get_rate = ccf_clk_get_rate,
+	.enable = ccf_clk_enable,
+	.disable = ccf_clk_disable,
 };
 
 static const char * const pll2_bypass_sels[] = {"pll2_sys", "osc", };
diff --git a/drivers/clk/imx/clk-imxrt1050.c b/drivers/clk/imx/clk-imxrt1050.c
index 3e17161002..5cb5e3bc15 100644
--- a/drivers/clk/imx/clk-imxrt1050.c
+++ b/drivers/clk/imx/clk-imxrt1050.c
@@ -15,89 +15,6 @@
 
 #include "clk.h"
 
-static ulong imxrt1050_clk_get_rate(struct clk *clk)
-{
-	struct clk *c;
-	int ret;
-
-	debug("%s(#%lu)\n", __func__, clk->id);
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	return clk_get_rate(c);
-}
-
-static ulong imxrt1050_clk_set_rate(struct clk *clk, ulong rate)
-{
-	struct clk *c;
-	int ret;
-
-	debug("%s(#%lu), rate: %lu\n", __func__, clk->id, rate);
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	return clk_set_rate(c, rate);
-}
-
-static int __imxrt1050_clk_enable(struct clk *clk, bool enable)
-{
-	struct clk *c;
-	int ret;
-
-	debug("%s(#%lu) en: %d\n", __func__, clk->id, enable);
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	if (enable)
-		ret = clk_enable(c);
-	else
-		ret = clk_disable(c);
-
-	return ret;
-}
-
-static int imxrt1050_clk_disable(struct clk *clk)
-{
-	return __imxrt1050_clk_enable(clk, 0);
-}
-
-static int imxrt1050_clk_enable(struct clk *clk)
-{
-	return __imxrt1050_clk_enable(clk, 1);
-}
-
-static int imxrt1050_clk_set_parent(struct clk *clk, struct clk *parent)
-{
-	struct clk *c, *cp;
-	int ret;
-
-	debug("%s(#%lu), parent: %lu\n", __func__, clk->id, parent->id);
-
-	ret = clk_get_by_id(clk->id, &c);
-	if (ret)
-		return ret;
-
-	ret = clk_get_by_id(parent->id, &cp);
-	if (ret)
-		return ret;
-
-	return clk_set_parent(c, cp);
-}
-
-static struct clk_ops imxrt1050_clk_ops = {
-	.set_rate = imxrt1050_clk_set_rate,
-	.get_rate = imxrt1050_clk_get_rate,
-	.enable = imxrt1050_clk_enable,
-	.disable = imxrt1050_clk_disable,
-	.set_parent = imxrt1050_clk_set_parent,
-};
-
 static const char * const pll_ref_sels[] = {"osc", "dummy", };
 static const char * const pll1_bypass_sels[] = {"pll1_arm", "pll1_arm_ref_sel", };
 static const char * const pll2_bypass_sels[] = {"pll2_sys", "pll2_sys_ref_sel", };
@@ -317,7 +234,7 @@ U_BOOT_DRIVER(imxrt1050_clk) = {
 	.name = "clk_imxrt1050",
 	.id = UCLASS_CLK,
 	.of_match = imxrt1050_clk_ids,
-	.ops = &imxrt1050_clk_ops,
+	.ops = &ccf_clk_ops,
 	.probe = imxrt1050_clk_probe,
 	.flags = DM_FLAG_PRE_RELOC,
 };
diff --git a/drivers/clk/microchip/mpfs_clk.c b/drivers/clk/microchip/mpfs_clk.c
index 05d7647206..67828c9bf4 100644
--- a/drivers/clk/microchip/mpfs_clk.c
+++ b/drivers/clk/microchip/mpfs_clk.c
@@ -15,63 +15,6 @@
 
 #include "mpfs_clk.h"
 
-/* All methods are delegated to CCF clocks */
-
-static ulong mpfs_clk_get_rate(struct clk *clk)
-{
-	struct clk *c;
-	int err = clk_get_by_id(clk->id, &c);
-
-	if (err)
-		return err;
-	return clk_get_rate(c);
-}
-
-static ulong mpfs_clk_set_rate(struct clk *clk, unsigned long rate)
-{
-	struct clk *c;
-	int err = clk_get_by_id(clk->id, &c);
-
-	if (err)
-		return err;
-	return clk_set_rate(c, rate);
-}
-
-static int mpfs_clk_set_parent(struct clk *clk, struct clk *parent)
-{
-	struct clk *c, *p;
-	int err = clk_get_by_id(clk->id, &c);
-
-	if (err)
-		return err;
-
-	err = clk_get_by_id(parent->id, &p);
-	if (err)
-		return err;
-
-	return clk_set_parent(c, p);
-}
-
-static int mpfs_clk_endisable(struct clk *clk, bool enable)
-{
-	struct clk *c;
-	int err = clk_get_by_id(clk->id, &c);
-
-	if (err)
-		return err;
-	return enable ? clk_enable(c) : clk_disable(c);
-}
-
-static int mpfs_clk_enable(struct clk *clk)
-{
-	return mpfs_clk_endisable(clk, true);
-}
-
-static int mpfs_clk_disable(struct clk *clk)
-{
-	return mpfs_clk_endisable(clk, false);
-}
-
 static int mpfs_clk_probe(struct udevice *dev)
 {
 	int ret;
@@ -100,14 +43,6 @@ static int mpfs_clk_probe(struct udevice *dev)
 	return ret;
 }
 
-static const struct clk_ops mpfs_clk_ops = {
-	.set_rate = mpfs_clk_set_rate,
-	.get_rate = mpfs_clk_get_rate,
-	.set_parent = mpfs_clk_set_parent,
-	.enable = mpfs_clk_enable,
-	.disable = mpfs_clk_disable,
-};
-
 static const struct udevice_id mpfs_of_match[] = {
 	{ .compatible = "microchip,mpfs-clkcfg" },
 	{ }
@@ -117,7 +52,7 @@ U_BOOT_DRIVER(mpfs_clk) = {
 	.name = "mpfs_clk",
 	.id = UCLASS_CLK,
 	.of_match = mpfs_of_match,
-	.ops = &mpfs_clk_ops,
+	.ops = &ccf_clk_ops,
 	.probe = mpfs_clk_probe,
 	.priv_auto = sizeof(struct clk),
 	.flags = DM_FLAG_PRE_RELOC,
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/2] clk: ccf: Add some helper functions for clock ops
  2022-03-20 20:34 [PATCH 1/2] clk: ccf: Add some helper functions for clock ops Sean Anderson
  2022-03-20 20:34 ` [PATCH 2/2] clk: Use generic CCF ops where possible Sean Anderson
@ 2022-03-21  1:29 ` Peng Fan (OSS)
  2022-03-30 19:21 ` Sean Anderson
  2 siblings, 0 replies; 7+ messages in thread
From: Peng Fan (OSS) @ 2022-03-21  1:29 UTC (permalink / raw)
  To: Sean Anderson, u-boot
  Cc: Peng Fan, Eugen Hristev, Claudiu Beznea, Cyril Jean,
	Lukasz Majewski, Giulio Benetti



On 2022/3/21 4:34, Sean Anderson wrote:
> Most CCF drivers follow a common pattern where their clock ops defer the
> actual operation to the backing CCF clock. Add some generic implementations
> of these functions to reduce duplication of code.
> 
> Signed-off-by: Sean Anderson <seanga2@gmail.com>

Reviewed-by: Peng Fan <peng.fan@nxp.com>
> ---
> 
>   drivers/clk/clk.c            | 65 ++++++++++++++++++++++++++++++++++++
>   include/linux/clk-provider.h |  8 +++++
>   2 files changed, 73 insertions(+)
> 
> diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
> index eff0fa134f..a5a3461b66 100644
> --- a/drivers/clk/clk.c
> +++ b/drivers/clk/clk.c
> @@ -74,3 +74,68 @@ bool clk_dev_binded(struct clk *clk)
>   
>   	return false;
>   }
> +
> +/* Helper functions for clock ops */
> +
> +ulong ccf_clk_get_rate(struct clk *clk)
> +{
> +	struct clk *c;
> +	int err = clk_get_by_id(clk->id, &c);
> +
> +	if (err)
> +		return err;
> +	return clk_get_rate(c);
> +}
> +
> +ulong ccf_clk_set_rate(struct clk *clk, unsigned long rate)
> +{
> +	struct clk *c;
> +	int err = clk_get_by_id(clk->id, &c);
> +
> +	if (err)
> +		return err;
> +	return clk_set_rate(c, rate);
> +}
> +
> +int ccf_clk_set_parent(struct clk *clk, struct clk *parent)
> +{
> +	struct clk *c, *p;
> +	int err = clk_get_by_id(clk->id, &c);
> +
> +	if (err)
> +		return err;
> +
> +	err = clk_get_by_id(parent->id, &p);
> +	if (err)
> +		return err;
> +
> +	return clk_set_parent(c, p);
> +}
> +
> +static int ccf_clk_endisable(struct clk *clk, bool enable)
> +{
> +	struct clk *c;
> +	int err = clk_get_by_id(clk->id, &c);
> +
> +	if (err)
> +		return err;
> +	return enable ? clk_enable(c) : clk_disable(c);
> +}
> +
> +int ccf_clk_enable(struct clk *clk)
> +{
> +	return ccf_clk_endisable(clk, true);
> +}
> +
> +int ccf_clk_disable(struct clk *clk)
> +{
> +	return ccf_clk_endisable(clk, false);
> +}
> +
> +const struct clk_ops ccf_clk_ops = {
> +	.set_rate = ccf_clk_set_rate,
> +	.get_rate = ccf_clk_get_rate,
> +	.set_parent = ccf_clk_set_parent,
> +	.enable = ccf_clk_enable,
> +	.disable = ccf_clk_disable,
> +};
> diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
> index 9a6116646d..2d04882d05 100644
> --- a/include/linux/clk-provider.h
> +++ b/include/linux/clk-provider.h
> @@ -254,4 +254,12 @@ const char *clk_hw_get_name(const struct clk *hw);
>   ulong clk_generic_get_rate(struct clk *clk);
>   
>   struct clk *dev_get_clk_ptr(struct udevice *dev);
> +
> +ulong ccf_clk_get_rate(struct clk *clk);
> +ulong ccf_clk_set_rate(struct clk *clk, unsigned long rate);
> +int ccf_clk_set_parent(struct clk *clk, struct clk *parent);
> +int ccf_clk_enable(struct clk *clk);
> +int ccf_clk_disable(struct clk *clk);
> +extern const struct clk_ops ccf_clk_ops;
> +
>   #endif /* __LINUX_CLK_PROVIDER_H */
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 2/2] clk: Use generic CCF ops where possible
  2022-03-20 20:34 ` [PATCH 2/2] clk: Use generic CCF ops where possible Sean Anderson
@ 2022-03-21  1:30   ` Peng Fan (OSS)
  2022-03-21 13:24   ` Claudiu.Beznea
  2022-03-30 19:21   ` Sean Anderson
  2 siblings, 0 replies; 7+ messages in thread
From: Peng Fan (OSS) @ 2022-03-21  1:30 UTC (permalink / raw)
  To: Sean Anderson, u-boot
  Cc: Peng Fan, Eugen Hristev, Claudiu Beznea, Cyril Jean,
	Lukasz Majewski, Giulio Benetti



On 2022/3/21 4:34, Sean Anderson wrote:
> This converts most CCF drivers to use generic ops. imx6q is the only
> outlier, where we retain the existing functionality by moving the check to
> request().
> 
> Signed-off-by: Sean Anderson <seanga2@gmail.com>

For i.MX8M*
Reviewed-by: Peng Fan <peng.fan@nxp.com>

> ---
> 
>   drivers/clk/at91/pmc.c           | 56 ++------------------
>   drivers/clk/imx/clk-imx6q.c      | 73 +++-----------------------
>   drivers/clk/imx/clk-imx8mm.c     | 88 +------------------------------
>   drivers/clk/imx/clk-imx8mn.c     | 88 +------------------------------
>   drivers/clk/imx/clk-imx8mp.c     | 90 +-------------------------------
>   drivers/clk/imx/clk-imxrt1020.c  | 65 ++---------------------
>   drivers/clk/imx/clk-imxrt1050.c  | 85 +-----------------------------
>   drivers/clk/microchip/mpfs_clk.c | 67 +-----------------------
>   8 files changed, 21 insertions(+), 591 deletions(-)
> 
> diff --git a/drivers/clk/at91/pmc.c b/drivers/clk/at91/pmc.c
> index 1fa42d728b..58bf1047b5 100644
> --- a/drivers/clk/at91/pmc.c
> +++ b/drivers/clk/at91/pmc.c
> @@ -21,60 +21,12 @@ static int at91_clk_of_xlate(struct clk *clk, struct ofnode_phandle_args *args)
>   	return 0;
>   }
>   
> -static ulong at91_clk_get_rate(struct clk *clk)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	return clk_get_rate(c);
> -}
> -
> -static ulong at91_clk_set_rate(struct clk *clk, ulong rate)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	return clk_set_rate(c, rate);
> -}
> -
> -static int at91_clk_enable(struct clk *clk)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	return clk_enable(c);
> -}
> -
> -static int at91_clk_disable(struct clk *clk)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	return clk_disable(c);
> -}
> -
>   const struct clk_ops at91_clk_ops = {
>   	.of_xlate	= at91_clk_of_xlate,
> -	.set_rate	= at91_clk_set_rate,
> -	.get_rate	= at91_clk_get_rate,
> -	.enable		= at91_clk_enable,
> -	.disable	= at91_clk_disable,
> +	.set_rate	= ccf_clk_set_rate,
> +	.get_rate	= ccf_clk_get_rate,
> +	.enable		= ccf_clk_enable,
> +	.disable	= ccf_clk_disable,
>   };
>   
>   /**
> diff --git a/drivers/clk/imx/clk-imx6q.c b/drivers/clk/imx/clk-imx6q.c
> index 5343036bab..67825af89b 100644
> --- a/drivers/clk/imx/clk-imx6q.c
> +++ b/drivers/clk/imx/clk-imx6q.c
> @@ -14,79 +14,22 @@
>   
>   #include "clk.h"
>   
> -static int imx6q_check_id(ulong id)
> +static int imx6q_clk_request(struct clk *clk)
>   {
> -	if (id < IMX6QDL_CLK_DUMMY || id >= IMX6QDL_CLK_END) {
> -		printf("%s: Invalid clk ID #%lu\n", __func__, id);
> +	if (clk->id < IMX6QDL_CLK_DUMMY || clk->id >= IMX6QDL_CLK_END) {
> +		printf("%s: Invalid clk ID #%lu\n", __func__, clk->id);
>   		return -EINVAL;
>   	}
>   
>   	return 0;
>   }
>   
> -static ulong imx6q_clk_get_rate(struct clk *clk)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	debug("%s(#%lu)\n", __func__, clk->id);
> -
> -	ret = imx6q_check_id(clk->id);
> -	if (ret)
> -		return ret;
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	return clk_get_rate(c);
> -}
> -
> -static ulong imx6q_clk_set_rate(struct clk *clk, unsigned long rate)
> -{
> -	debug("%s(#%lu), rate: %lu\n", __func__, clk->id, rate);
> -
> -	return rate;
> -}
> -
> -static int __imx6q_clk_enable(struct clk *clk, bool enable)
> -{
> -	struct clk *c;
> -	int ret = 0;
> -
> -	debug("%s(#%lu) en: %d\n", __func__, clk->id, enable);
> -
> -	ret = imx6q_check_id(clk->id);
> -	if (ret)
> -		return ret;
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	if (enable)
> -		ret = clk_enable(c);
> -	else
> -		ret = clk_disable(c);
> -
> -	return ret;
> -}
> -
> -static int imx6q_clk_disable(struct clk *clk)
> -{
> -	return __imx6q_clk_enable(clk, 0);
> -}
> -
> -static int imx6q_clk_enable(struct clk *clk)
> -{
> -	return __imx6q_clk_enable(clk, 1);
> -}
> -
>   static struct clk_ops imx6q_clk_ops = {
> -	.set_rate = imx6q_clk_set_rate,
> -	.get_rate = imx6q_clk_get_rate,
> -	.enable = imx6q_clk_enable,
> -	.disable = imx6q_clk_disable,
> +	.request = imx6q_clk_request,
> +	.set_rate = ccf_clk_set_rate,
> +	.get_rate = ccf_clk_get_rate,
> +	.enable = ccf_clk_enable,
> +	.disable = ccf_clk_disable,
>   };
>   
>   static const char *const usdhc_sels[] = { "pll2_pfd2_396m", "pll2_pfd0_352m", };
> diff --git a/drivers/clk/imx/clk-imx8mm.c b/drivers/clk/imx/clk-imx8mm.c
> index 3aa8c641f9..443bbdae33 100644
> --- a/drivers/clk/imx/clk-imx8mm.c
> +++ b/drivers/clk/imx/clk-imx8mm.c
> @@ -140,92 +140,6 @@ static const char *imx8mm_ecspi2_sels[] = {"clock-osc-24m", "sys_pll2_200m", "sy
>   static const char *imx8mm_ecspi3_sels[] = {"clock-osc-24m", "sys_pll2_200m", "sys_pll1_40m", "sys_pll1_160m",
>   					   "sys_pll1_800m", "sys_pll3_out", "sys_pll2_250m", "audio_pll2_out", };
>   
> -static ulong imx8mm_clk_get_rate(struct clk *clk)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	debug("%s(#%lu)\n", __func__, clk->id);
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	return clk_get_rate(c);
> -}
> -
> -static ulong imx8mm_clk_set_rate(struct clk *clk, unsigned long rate)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	debug("%s(#%lu), rate: %lu\n", __func__, clk->id, rate);
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	return clk_set_rate(c, rate);
> -}
> -
> -static int __imx8mm_clk_enable(struct clk *clk, bool enable)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	debug("%s(#%lu) en: %d\n", __func__, clk->id, enable);
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	if (enable)
> -		ret = clk_enable(c);
> -	else
> -		ret = clk_disable(c);
> -
> -	return ret;
> -}
> -
> -static int imx8mm_clk_disable(struct clk *clk)
> -{
> -	return __imx8mm_clk_enable(clk, 0);
> -}
> -
> -static int imx8mm_clk_enable(struct clk *clk)
> -{
> -	return __imx8mm_clk_enable(clk, 1);
> -}
> -
> -static int imx8mm_clk_set_parent(struct clk *clk, struct clk *parent)
> -{
> -	struct clk *c, *cp;
> -	int ret;
> -
> -	debug("%s(#%lu), parent: %lu\n", __func__, clk->id, parent->id);
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	ret = clk_get_by_id(parent->id, &cp);
> -	if (ret)
> -		return ret;
> -
> -	ret = clk_set_parent(c, cp);
> -	c->dev->parent = cp->dev;
> -
> -	return ret;
> -}
> -
> -static struct clk_ops imx8mm_clk_ops = {
> -	.set_rate = imx8mm_clk_set_rate,
> -	.get_rate = imx8mm_clk_get_rate,
> -	.enable = imx8mm_clk_enable,
> -	.disable = imx8mm_clk_disable,
> -	.set_parent = imx8mm_clk_set_parent,
> -};
> -
>   static int imx8mm_clk_probe(struct udevice *dev)
>   {
>   	void __iomem *base;
> @@ -470,7 +384,7 @@ U_BOOT_DRIVER(imx8mm_clk) = {
>   	.name = "clk_imx8mm",
>   	.id = UCLASS_CLK,
>   	.of_match = imx8mm_clk_ids,
> -	.ops = &imx8mm_clk_ops,
> +	.ops = &ccf_clk_ops,
>   	.probe = imx8mm_clk_probe,
>   	.flags = DM_FLAG_PRE_RELOC,
>   };
> diff --git a/drivers/clk/imx/clk-imx8mn.c b/drivers/clk/imx/clk-imx8mn.c
> index e398d7de02..bb62138f8c 100644
> --- a/drivers/clk/imx/clk-imx8mn.c
> +++ b/drivers/clk/imx/clk-imx8mn.c
> @@ -148,92 +148,6 @@ static const char * const imx8mn_usb_phy_sels[] = {"clock-osc-24m", "sys_pll1_10
>   						"sys_pll2_100m", "sys_pll2_200m", "clk_ext2",
>   						"clk_ext3", "audio_pll2_out", };
>   
> -static ulong imx8mn_clk_get_rate(struct clk *clk)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	debug("%s(#%lu)\n", __func__, clk->id);
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	return clk_get_rate(c);
> -}
> -
> -static ulong imx8mn_clk_set_rate(struct clk *clk, unsigned long rate)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	debug("%s(#%lu), rate: %lu\n", __func__, clk->id, rate);
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	return clk_set_rate(c, rate);
> -}
> -
> -static int __imx8mn_clk_enable(struct clk *clk, bool enable)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	debug("%s(#%lu) en: %d\n", __func__, clk->id, enable);
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	if (enable)
> -		ret = clk_enable(c);
> -	else
> -		ret = clk_disable(c);
> -
> -	return ret;
> -}
> -
> -static int imx8mn_clk_disable(struct clk *clk)
> -{
> -	return __imx8mn_clk_enable(clk, 0);
> -}
> -
> -static int imx8mn_clk_enable(struct clk *clk)
> -{
> -	return __imx8mn_clk_enable(clk, 1);
> -}
> -
> -static int imx8mn_clk_set_parent(struct clk *clk, struct clk *parent)
> -{
> -	struct clk *c, *cp;
> -	int ret;
> -
> -	debug("%s(#%lu), parent: %lu\n", __func__, clk->id, parent->id);
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	ret = clk_get_by_id(parent->id, &cp);
> -	if (ret)
> -		return ret;
> -
> -	ret = clk_set_parent(c, cp);
> -	c->dev->parent = cp->dev;
> -
> -	return ret;
> -}
> -
> -static struct clk_ops imx8mn_clk_ops = {
> -	.set_rate = imx8mn_clk_set_rate,
> -	.get_rate = imx8mn_clk_get_rate,
> -	.enable = imx8mn_clk_enable,
> -	.disable = imx8mn_clk_disable,
> -	.set_parent = imx8mn_clk_set_parent,
> -};
> -
>   static int imx8mn_clk_probe(struct udevice *dev)
>   {
>   	void __iomem *base;
> @@ -481,7 +395,7 @@ U_BOOT_DRIVER(imx8mn_clk) = {
>   	.name = "clk_imx8mn",
>   	.id = UCLASS_CLK,
>   	.of_match = imx8mn_clk_ids,
> -	.ops = &imx8mn_clk_ops,
> +	.ops = &ccf_clk_ops,
>   	.probe = imx8mn_clk_probe,
>   	.flags = DM_FLAG_PRE_RELOC,
>   };
> diff --git a/drivers/clk/imx/clk-imx8mp.c b/drivers/clk/imx/clk-imx8mp.c
> index c77500bcce..ad84ce38ed 100644
> --- a/drivers/clk/imx/clk-imx8mp.c
> +++ b/drivers/clk/imx/clk-imx8mp.c
> @@ -186,94 +186,6 @@ static const char *imx8mp_enet_phy_ref_sels[] = {"clock-osc-24m", "sys_pll2_50m"
>   
>   static const char *imx8mp_dram_core_sels[] = {"dram_pll_out", "dram_alt_root", };
>   
> -
> -static ulong imx8mp_clk_get_rate(struct clk *clk)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	debug("%s(#%lu)\n", __func__, clk->id);
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	return clk_get_rate(c);
> -}
> -
> -static ulong imx8mp_clk_set_rate(struct clk *clk, unsigned long rate)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	debug("%s(#%lu), rate: %lu\n", __func__, clk->id, rate);
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	return clk_set_rate(c, rate);
> -}
> -
> -static int __imx8mp_clk_enable(struct clk *clk, bool enable)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	debug("%s(#%lu) en: %d\n", __func__, clk->id, enable);
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	if (enable)
> -		ret = clk_enable(c);
> -	else
> -		ret = clk_disable(c);
> -
> -	return ret;
> -}
> -
> -static int imx8mp_clk_disable(struct clk *clk)
> -{
> -	return __imx8mp_clk_enable(clk, 0);
> -}
> -
> -static int imx8mp_clk_enable(struct clk *clk)
> -{
> -	return __imx8mp_clk_enable(clk, 1);
> -}
> -
> -static int imx8mp_clk_set_parent(struct clk *clk, struct clk *parent)
> -{
> -	struct clk *c, *cp;
> -	int ret;
> -
> -	debug("%s(#%lu), parent: %lu\n", __func__, clk->id, parent->id);
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	ret = clk_get_by_id(parent->id, &cp);
> -	if (ret)
> -		return ret;
> -
> -	ret = clk_set_parent(c, cp);
> -
> -	c->dev->parent = cp->dev;
> -
> -	return ret;
> -}
> -
> -static struct clk_ops imx8mp_clk_ops = {
> -	.set_rate = imx8mp_clk_set_rate,
> -	.get_rate = imx8mp_clk_get_rate,
> -	.enable = imx8mp_clk_enable,
> -	.disable = imx8mp_clk_disable,
> -	.set_parent = imx8mp_clk_set_parent,
> -};
> -
>   static int imx8mp_clk_probe(struct udevice *dev)
>   {
>   	void __iomem *base;
> @@ -409,7 +321,7 @@ U_BOOT_DRIVER(imx8mp_clk) = {
>   	.name = "clk_imx8mp",
>   	.id = UCLASS_CLK,
>   	.of_match = imx8mp_clk_ids,
> -	.ops = &imx8mp_clk_ops,
> +	.ops = &ccf_clk_ops,
>   	.probe = imx8mp_clk_probe,
>   	.flags = DM_FLAG_PRE_RELOC,
>   };
> diff --git a/drivers/clk/imx/clk-imxrt1020.c b/drivers/clk/imx/clk-imxrt1020.c
> index 840f783940..3f8b4df3c5 100644
> --- a/drivers/clk/imx/clk-imxrt1020.c
> +++ b/drivers/clk/imx/clk-imxrt1020.c
> @@ -14,68 +14,11 @@
>   
>   #include "clk.h"
>   
> -static ulong imxrt1020_clk_get_rate(struct clk *clk)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	debug("%s(#%lu)\n", __func__, clk->id);
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	return clk_get_rate(c);
> -}
> -
> -static ulong imxrt1020_clk_set_rate(struct clk *clk, unsigned long rate)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	debug("%s(#%lu), rate: %lu\n", __func__, clk->id, rate);
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	return clk_set_rate(c, rate);
> -}
> -
> -static int __imxrt1020_clk_enable(struct clk *clk, bool enable)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	debug("%s(#%lu) en: %d\n", __func__, clk->id, enable);
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	if (enable)
> -		ret = clk_enable(c);
> -	else
> -		ret = clk_disable(c);
> -
> -	return ret;
> -}
> -
> -static int imxrt1020_clk_disable(struct clk *clk)
> -{
> -	return __imxrt1020_clk_enable(clk, 0);
> -}
> -
> -static int imxrt1020_clk_enable(struct clk *clk)
> -{
> -	return __imxrt1020_clk_enable(clk, 1);
> -}
> -
>   static struct clk_ops imxrt1020_clk_ops = {
> -	.set_rate = imxrt1020_clk_set_rate,
> -	.get_rate = imxrt1020_clk_get_rate,
> -	.enable = imxrt1020_clk_enable,
> -	.disable = imxrt1020_clk_disable,
> +	.set_rate = ccf_clk_set_rate,
> +	.get_rate = ccf_clk_get_rate,
> +	.enable = ccf_clk_enable,
> +	.disable = ccf_clk_disable,
>   };
>   
>   static const char * const pll2_bypass_sels[] = {"pll2_sys", "osc", };
> diff --git a/drivers/clk/imx/clk-imxrt1050.c b/drivers/clk/imx/clk-imxrt1050.c
> index 3e17161002..5cb5e3bc15 100644
> --- a/drivers/clk/imx/clk-imxrt1050.c
> +++ b/drivers/clk/imx/clk-imxrt1050.c
> @@ -15,89 +15,6 @@
>   
>   #include "clk.h"
>   
> -static ulong imxrt1050_clk_get_rate(struct clk *clk)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	debug("%s(#%lu)\n", __func__, clk->id);
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	return clk_get_rate(c);
> -}
> -
> -static ulong imxrt1050_clk_set_rate(struct clk *clk, ulong rate)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	debug("%s(#%lu), rate: %lu\n", __func__, clk->id, rate);
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	return clk_set_rate(c, rate);
> -}
> -
> -static int __imxrt1050_clk_enable(struct clk *clk, bool enable)
> -{
> -	struct clk *c;
> -	int ret;
> -
> -	debug("%s(#%lu) en: %d\n", __func__, clk->id, enable);
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	if (enable)
> -		ret = clk_enable(c);
> -	else
> -		ret = clk_disable(c);
> -
> -	return ret;
> -}
> -
> -static int imxrt1050_clk_disable(struct clk *clk)
> -{
> -	return __imxrt1050_clk_enable(clk, 0);
> -}
> -
> -static int imxrt1050_clk_enable(struct clk *clk)
> -{
> -	return __imxrt1050_clk_enable(clk, 1);
> -}
> -
> -static int imxrt1050_clk_set_parent(struct clk *clk, struct clk *parent)
> -{
> -	struct clk *c, *cp;
> -	int ret;
> -
> -	debug("%s(#%lu), parent: %lu\n", __func__, clk->id, parent->id);
> -
> -	ret = clk_get_by_id(clk->id, &c);
> -	if (ret)
> -		return ret;
> -
> -	ret = clk_get_by_id(parent->id, &cp);
> -	if (ret)
> -		return ret;
> -
> -	return clk_set_parent(c, cp);
> -}
> -
> -static struct clk_ops imxrt1050_clk_ops = {
> -	.set_rate = imxrt1050_clk_set_rate,
> -	.get_rate = imxrt1050_clk_get_rate,
> -	.enable = imxrt1050_clk_enable,
> -	.disable = imxrt1050_clk_disable,
> -	.set_parent = imxrt1050_clk_set_parent,
> -};
> -
>   static const char * const pll_ref_sels[] = {"osc", "dummy", };
>   static const char * const pll1_bypass_sels[] = {"pll1_arm", "pll1_arm_ref_sel", };
>   static const char * const pll2_bypass_sels[] = {"pll2_sys", "pll2_sys_ref_sel", };
> @@ -317,7 +234,7 @@ U_BOOT_DRIVER(imxrt1050_clk) = {
>   	.name = "clk_imxrt1050",
>   	.id = UCLASS_CLK,
>   	.of_match = imxrt1050_clk_ids,
> -	.ops = &imxrt1050_clk_ops,
> +	.ops = &ccf_clk_ops,
>   	.probe = imxrt1050_clk_probe,
>   	.flags = DM_FLAG_PRE_RELOC,
>   };
> diff --git a/drivers/clk/microchip/mpfs_clk.c b/drivers/clk/microchip/mpfs_clk.c
> index 05d7647206..67828c9bf4 100644
> --- a/drivers/clk/microchip/mpfs_clk.c
> +++ b/drivers/clk/microchip/mpfs_clk.c
> @@ -15,63 +15,6 @@
>   
>   #include "mpfs_clk.h"
>   
> -/* All methods are delegated to CCF clocks */
> -
> -static ulong mpfs_clk_get_rate(struct clk *clk)
> -{
> -	struct clk *c;
> -	int err = clk_get_by_id(clk->id, &c);
> -
> -	if (err)
> -		return err;
> -	return clk_get_rate(c);
> -}
> -
> -static ulong mpfs_clk_set_rate(struct clk *clk, unsigned long rate)
> -{
> -	struct clk *c;
> -	int err = clk_get_by_id(clk->id, &c);
> -
> -	if (err)
> -		return err;
> -	return clk_set_rate(c, rate);
> -}
> -
> -static int mpfs_clk_set_parent(struct clk *clk, struct clk *parent)
> -{
> -	struct clk *c, *p;
> -	int err = clk_get_by_id(clk->id, &c);
> -
> -	if (err)
> -		return err;
> -
> -	err = clk_get_by_id(parent->id, &p);
> -	if (err)
> -		return err;
> -
> -	return clk_set_parent(c, p);
> -}
> -
> -static int mpfs_clk_endisable(struct clk *clk, bool enable)
> -{
> -	struct clk *c;
> -	int err = clk_get_by_id(clk->id, &c);
> -
> -	if (err)
> -		return err;
> -	return enable ? clk_enable(c) : clk_disable(c);
> -}
> -
> -static int mpfs_clk_enable(struct clk *clk)
> -{
> -	return mpfs_clk_endisable(clk, true);
> -}
> -
> -static int mpfs_clk_disable(struct clk *clk)
> -{
> -	return mpfs_clk_endisable(clk, false);
> -}
> -
>   static int mpfs_clk_probe(struct udevice *dev)
>   {
>   	int ret;
> @@ -100,14 +43,6 @@ static int mpfs_clk_probe(struct udevice *dev)
>   	return ret;
>   }
>   
> -static const struct clk_ops mpfs_clk_ops = {
> -	.set_rate = mpfs_clk_set_rate,
> -	.get_rate = mpfs_clk_get_rate,
> -	.set_parent = mpfs_clk_set_parent,
> -	.enable = mpfs_clk_enable,
> -	.disable = mpfs_clk_disable,
> -};
> -
>   static const struct udevice_id mpfs_of_match[] = {
>   	{ .compatible = "microchip,mpfs-clkcfg" },
>   	{ }
> @@ -117,7 +52,7 @@ U_BOOT_DRIVER(mpfs_clk) = {
>   	.name = "mpfs_clk",
>   	.id = UCLASS_CLK,
>   	.of_match = mpfs_of_match,
> -	.ops = &mpfs_clk_ops,
> +	.ops = &ccf_clk_ops,
>   	.probe = mpfs_clk_probe,
>   	.priv_auto = sizeof(struct clk),
>   	.flags = DM_FLAG_PRE_RELOC,
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 2/2] clk: Use generic CCF ops where possible
  2022-03-20 20:34 ` [PATCH 2/2] clk: Use generic CCF ops where possible Sean Anderson
  2022-03-21  1:30   ` Peng Fan (OSS)
@ 2022-03-21 13:24   ` Claudiu.Beznea
  2022-03-30 19:21   ` Sean Anderson
  2 siblings, 0 replies; 7+ messages in thread
From: Claudiu.Beznea @ 2022-03-21 13:24 UTC (permalink / raw)
  To: seanga2, u-boot
  Cc: peng.fan, Eugen.Hristev, Cyril.Jean, lukma, giulio.benetti

On 20.03.2022 22:34, Sean Anderson wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
> 
> This converts most CCF drivers to use generic ops. imx6q is the only
> outlier, where we retain the existing functionality by moving the check to
> request().
> 
> Signed-off-by: Sean Anderson <seanga2@gmail.com>
> ---
> 
>  drivers/clk/at91/pmc.c           | 56 ++------------------

For AT91:
Reviewed-by: Claudiu Beznea <claudiu.beznea@microchip.com>

>  drivers/clk/imx/clk-imx6q.c      | 73 +++-----------------------
>  drivers/clk/imx/clk-imx8mm.c     | 88 +------------------------------
>  drivers/clk/imx/clk-imx8mn.c     | 88 +------------------------------
>  drivers/clk/imx/clk-imx8mp.c     | 90 +-------------------------------
>  drivers/clk/imx/clk-imxrt1020.c  | 65 ++---------------------
>  drivers/clk/imx/clk-imxrt1050.c  | 85 +-----------------------------
>  drivers/clk/microchip/mpfs_clk.c | 67 +-----------------------
>  8 files changed, 21 insertions(+), 591 deletions(-)
> 
> diff --git a/drivers/clk/at91/pmc.c b/drivers/clk/at91/pmc.c
> index 1fa42d728b..58bf1047b5 100644
> --- a/drivers/clk/at91/pmc.c
> +++ b/drivers/clk/at91/pmc.c
> @@ -21,60 +21,12 @@ static int at91_clk_of_xlate(struct clk *clk, struct ofnode_phandle_args *args)
>         return 0;
>  }
> 
> -static ulong at91_clk_get_rate(struct clk *clk)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       return clk_get_rate(c);
> -}
> -
> -static ulong at91_clk_set_rate(struct clk *clk, ulong rate)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       return clk_set_rate(c, rate);
> -}
> -
> -static int at91_clk_enable(struct clk *clk)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       return clk_enable(c);
> -}
> -
> -static int at91_clk_disable(struct clk *clk)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       return clk_disable(c);
> -}
> -
>  const struct clk_ops at91_clk_ops = {
>         .of_xlate       = at91_clk_of_xlate,
> -       .set_rate       = at91_clk_set_rate,
> -       .get_rate       = at91_clk_get_rate,
> -       .enable         = at91_clk_enable,
> -       .disable        = at91_clk_disable,
> +       .set_rate       = ccf_clk_set_rate,
> +       .get_rate       = ccf_clk_get_rate,
> +       .enable         = ccf_clk_enable,
> +       .disable        = ccf_clk_disable,
>  };
> 
>  /**
> diff --git a/drivers/clk/imx/clk-imx6q.c b/drivers/clk/imx/clk-imx6q.c
> index 5343036bab..67825af89b 100644
> --- a/drivers/clk/imx/clk-imx6q.c
> +++ b/drivers/clk/imx/clk-imx6q.c
> @@ -14,79 +14,22 @@
> 
>  #include "clk.h"
> 
> -static int imx6q_check_id(ulong id)
> +static int imx6q_clk_request(struct clk *clk)
>  {
> -       if (id < IMX6QDL_CLK_DUMMY || id >= IMX6QDL_CLK_END) {
> -               printf("%s: Invalid clk ID #%lu\n", __func__, id);
> +       if (clk->id < IMX6QDL_CLK_DUMMY || clk->id >= IMX6QDL_CLK_END) {
> +               printf("%s: Invalid clk ID #%lu\n", __func__, clk->id);
>                 return -EINVAL;
>         }
> 
>         return 0;
>  }
> 
> -static ulong imx6q_clk_get_rate(struct clk *clk)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       debug("%s(#%lu)\n", __func__, clk->id);
> -
> -       ret = imx6q_check_id(clk->id);
> -       if (ret)
> -               return ret;
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       return clk_get_rate(c);
> -}
> -
> -static ulong imx6q_clk_set_rate(struct clk *clk, unsigned long rate)
> -{
> -       debug("%s(#%lu), rate: %lu\n", __func__, clk->id, rate);
> -
> -       return rate;
> -}
> -
> -static int __imx6q_clk_enable(struct clk *clk, bool enable)
> -{
> -       struct clk *c;
> -       int ret = 0;
> -
> -       debug("%s(#%lu) en: %d\n", __func__, clk->id, enable);
> -
> -       ret = imx6q_check_id(clk->id);
> -       if (ret)
> -               return ret;
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       if (enable)
> -               ret = clk_enable(c);
> -       else
> -               ret = clk_disable(c);
> -
> -       return ret;
> -}
> -
> -static int imx6q_clk_disable(struct clk *clk)
> -{
> -       return __imx6q_clk_enable(clk, 0);
> -}
> -
> -static int imx6q_clk_enable(struct clk *clk)
> -{
> -       return __imx6q_clk_enable(clk, 1);
> -}
> -
>  static struct clk_ops imx6q_clk_ops = {
> -       .set_rate = imx6q_clk_set_rate,
> -       .get_rate = imx6q_clk_get_rate,
> -       .enable = imx6q_clk_enable,
> -       .disable = imx6q_clk_disable,
> +       .request = imx6q_clk_request,
> +       .set_rate = ccf_clk_set_rate,
> +       .get_rate = ccf_clk_get_rate,
> +       .enable = ccf_clk_enable,
> +       .disable = ccf_clk_disable,
>  };
> 
>  static const char *const usdhc_sels[] = { "pll2_pfd2_396m", "pll2_pfd0_352m", };
> diff --git a/drivers/clk/imx/clk-imx8mm.c b/drivers/clk/imx/clk-imx8mm.c
> index 3aa8c641f9..443bbdae33 100644
> --- a/drivers/clk/imx/clk-imx8mm.c
> +++ b/drivers/clk/imx/clk-imx8mm.c
> @@ -140,92 +140,6 @@ static const char *imx8mm_ecspi2_sels[] = {"clock-osc-24m", "sys_pll2_200m", "sy
>  static const char *imx8mm_ecspi3_sels[] = {"clock-osc-24m", "sys_pll2_200m", "sys_pll1_40m", "sys_pll1_160m",
>                                            "sys_pll1_800m", "sys_pll3_out", "sys_pll2_250m", "audio_pll2_out", };
> 
> -static ulong imx8mm_clk_get_rate(struct clk *clk)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       debug("%s(#%lu)\n", __func__, clk->id);
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       return clk_get_rate(c);
> -}
> -
> -static ulong imx8mm_clk_set_rate(struct clk *clk, unsigned long rate)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       debug("%s(#%lu), rate: %lu\n", __func__, clk->id, rate);
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       return clk_set_rate(c, rate);
> -}
> -
> -static int __imx8mm_clk_enable(struct clk *clk, bool enable)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       debug("%s(#%lu) en: %d\n", __func__, clk->id, enable);
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       if (enable)
> -               ret = clk_enable(c);
> -       else
> -               ret = clk_disable(c);
> -
> -       return ret;
> -}
> -
> -static int imx8mm_clk_disable(struct clk *clk)
> -{
> -       return __imx8mm_clk_enable(clk, 0);
> -}
> -
> -static int imx8mm_clk_enable(struct clk *clk)
> -{
> -       return __imx8mm_clk_enable(clk, 1);
> -}
> -
> -static int imx8mm_clk_set_parent(struct clk *clk, struct clk *parent)
> -{
> -       struct clk *c, *cp;
> -       int ret;
> -
> -       debug("%s(#%lu), parent: %lu\n", __func__, clk->id, parent->id);
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       ret = clk_get_by_id(parent->id, &cp);
> -       if (ret)
> -               return ret;
> -
> -       ret = clk_set_parent(c, cp);
> -       c->dev->parent = cp->dev;
> -
> -       return ret;
> -}
> -
> -static struct clk_ops imx8mm_clk_ops = {
> -       .set_rate = imx8mm_clk_set_rate,
> -       .get_rate = imx8mm_clk_get_rate,
> -       .enable = imx8mm_clk_enable,
> -       .disable = imx8mm_clk_disable,
> -       .set_parent = imx8mm_clk_set_parent,
> -};
> -
>  static int imx8mm_clk_probe(struct udevice *dev)
>  {
>         void __iomem *base;
> @@ -470,7 +384,7 @@ U_BOOT_DRIVER(imx8mm_clk) = {
>         .name = "clk_imx8mm",
>         .id = UCLASS_CLK,
>         .of_match = imx8mm_clk_ids,
> -       .ops = &imx8mm_clk_ops,
> +       .ops = &ccf_clk_ops,
>         .probe = imx8mm_clk_probe,
>         .flags = DM_FLAG_PRE_RELOC,
>  };
> diff --git a/drivers/clk/imx/clk-imx8mn.c b/drivers/clk/imx/clk-imx8mn.c
> index e398d7de02..bb62138f8c 100644
> --- a/drivers/clk/imx/clk-imx8mn.c
> +++ b/drivers/clk/imx/clk-imx8mn.c
> @@ -148,92 +148,6 @@ static const char * const imx8mn_usb_phy_sels[] = {"clock-osc-24m", "sys_pll1_10
>                                                 "sys_pll2_100m", "sys_pll2_200m", "clk_ext2",
>                                                 "clk_ext3", "audio_pll2_out", };
> 
> -static ulong imx8mn_clk_get_rate(struct clk *clk)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       debug("%s(#%lu)\n", __func__, clk->id);
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       return clk_get_rate(c);
> -}
> -
> -static ulong imx8mn_clk_set_rate(struct clk *clk, unsigned long rate)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       debug("%s(#%lu), rate: %lu\n", __func__, clk->id, rate);
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       return clk_set_rate(c, rate);
> -}
> -
> -static int __imx8mn_clk_enable(struct clk *clk, bool enable)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       debug("%s(#%lu) en: %d\n", __func__, clk->id, enable);
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       if (enable)
> -               ret = clk_enable(c);
> -       else
> -               ret = clk_disable(c);
> -
> -       return ret;
> -}
> -
> -static int imx8mn_clk_disable(struct clk *clk)
> -{
> -       return __imx8mn_clk_enable(clk, 0);
> -}
> -
> -static int imx8mn_clk_enable(struct clk *clk)
> -{
> -       return __imx8mn_clk_enable(clk, 1);
> -}
> -
> -static int imx8mn_clk_set_parent(struct clk *clk, struct clk *parent)
> -{
> -       struct clk *c, *cp;
> -       int ret;
> -
> -       debug("%s(#%lu), parent: %lu\n", __func__, clk->id, parent->id);
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       ret = clk_get_by_id(parent->id, &cp);
> -       if (ret)
> -               return ret;
> -
> -       ret = clk_set_parent(c, cp);
> -       c->dev->parent = cp->dev;
> -
> -       return ret;
> -}
> -
> -static struct clk_ops imx8mn_clk_ops = {
> -       .set_rate = imx8mn_clk_set_rate,
> -       .get_rate = imx8mn_clk_get_rate,
> -       .enable = imx8mn_clk_enable,
> -       .disable = imx8mn_clk_disable,
> -       .set_parent = imx8mn_clk_set_parent,
> -};
> -
>  static int imx8mn_clk_probe(struct udevice *dev)
>  {
>         void __iomem *base;
> @@ -481,7 +395,7 @@ U_BOOT_DRIVER(imx8mn_clk) = {
>         .name = "clk_imx8mn",
>         .id = UCLASS_CLK,
>         .of_match = imx8mn_clk_ids,
> -       .ops = &imx8mn_clk_ops,
> +       .ops = &ccf_clk_ops,
>         .probe = imx8mn_clk_probe,
>         .flags = DM_FLAG_PRE_RELOC,
>  };
> diff --git a/drivers/clk/imx/clk-imx8mp.c b/drivers/clk/imx/clk-imx8mp.c
> index c77500bcce..ad84ce38ed 100644
> --- a/drivers/clk/imx/clk-imx8mp.c
> +++ b/drivers/clk/imx/clk-imx8mp.c
> @@ -186,94 +186,6 @@ static const char *imx8mp_enet_phy_ref_sels[] = {"clock-osc-24m", "sys_pll2_50m"
> 
>  static const char *imx8mp_dram_core_sels[] = {"dram_pll_out", "dram_alt_root", };
> 
> -
> -static ulong imx8mp_clk_get_rate(struct clk *clk)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       debug("%s(#%lu)\n", __func__, clk->id);
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       return clk_get_rate(c);
> -}
> -
> -static ulong imx8mp_clk_set_rate(struct clk *clk, unsigned long rate)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       debug("%s(#%lu), rate: %lu\n", __func__, clk->id, rate);
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       return clk_set_rate(c, rate);
> -}
> -
> -static int __imx8mp_clk_enable(struct clk *clk, bool enable)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       debug("%s(#%lu) en: %d\n", __func__, clk->id, enable);
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       if (enable)
> -               ret = clk_enable(c);
> -       else
> -               ret = clk_disable(c);
> -
> -       return ret;
> -}
> -
> -static int imx8mp_clk_disable(struct clk *clk)
> -{
> -       return __imx8mp_clk_enable(clk, 0);
> -}
> -
> -static int imx8mp_clk_enable(struct clk *clk)
> -{
> -       return __imx8mp_clk_enable(clk, 1);
> -}
> -
> -static int imx8mp_clk_set_parent(struct clk *clk, struct clk *parent)
> -{
> -       struct clk *c, *cp;
> -       int ret;
> -
> -       debug("%s(#%lu), parent: %lu\n", __func__, clk->id, parent->id);
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       ret = clk_get_by_id(parent->id, &cp);
> -       if (ret)
> -               return ret;
> -
> -       ret = clk_set_parent(c, cp);
> -
> -       c->dev->parent = cp->dev;
> -
> -       return ret;
> -}
> -
> -static struct clk_ops imx8mp_clk_ops = {
> -       .set_rate = imx8mp_clk_set_rate,
> -       .get_rate = imx8mp_clk_get_rate,
> -       .enable = imx8mp_clk_enable,
> -       .disable = imx8mp_clk_disable,
> -       .set_parent = imx8mp_clk_set_parent,
> -};
> -
>  static int imx8mp_clk_probe(struct udevice *dev)
>  {
>         void __iomem *base;
> @@ -409,7 +321,7 @@ U_BOOT_DRIVER(imx8mp_clk) = {
>         .name = "clk_imx8mp",
>         .id = UCLASS_CLK,
>         .of_match = imx8mp_clk_ids,
> -       .ops = &imx8mp_clk_ops,
> +       .ops = &ccf_clk_ops,
>         .probe = imx8mp_clk_probe,
>         .flags = DM_FLAG_PRE_RELOC,
>  };
> diff --git a/drivers/clk/imx/clk-imxrt1020.c b/drivers/clk/imx/clk-imxrt1020.c
> index 840f783940..3f8b4df3c5 100644
> --- a/drivers/clk/imx/clk-imxrt1020.c
> +++ b/drivers/clk/imx/clk-imxrt1020.c
> @@ -14,68 +14,11 @@
> 
>  #include "clk.h"
> 
> -static ulong imxrt1020_clk_get_rate(struct clk *clk)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       debug("%s(#%lu)\n", __func__, clk->id);
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       return clk_get_rate(c);
> -}
> -
> -static ulong imxrt1020_clk_set_rate(struct clk *clk, unsigned long rate)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       debug("%s(#%lu), rate: %lu\n", __func__, clk->id, rate);
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       return clk_set_rate(c, rate);
> -}
> -
> -static int __imxrt1020_clk_enable(struct clk *clk, bool enable)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       debug("%s(#%lu) en: %d\n", __func__, clk->id, enable);
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       if (enable)
> -               ret = clk_enable(c);
> -       else
> -               ret = clk_disable(c);
> -
> -       return ret;
> -}
> -
> -static int imxrt1020_clk_disable(struct clk *clk)
> -{
> -       return __imxrt1020_clk_enable(clk, 0);
> -}
> -
> -static int imxrt1020_clk_enable(struct clk *clk)
> -{
> -       return __imxrt1020_clk_enable(clk, 1);
> -}
> -
>  static struct clk_ops imxrt1020_clk_ops = {
> -       .set_rate = imxrt1020_clk_set_rate,
> -       .get_rate = imxrt1020_clk_get_rate,
> -       .enable = imxrt1020_clk_enable,
> -       .disable = imxrt1020_clk_disable,
> +       .set_rate = ccf_clk_set_rate,
> +       .get_rate = ccf_clk_get_rate,
> +       .enable = ccf_clk_enable,
> +       .disable = ccf_clk_disable,
>  };
> 
>  static const char * const pll2_bypass_sels[] = {"pll2_sys", "osc", };
> diff --git a/drivers/clk/imx/clk-imxrt1050.c b/drivers/clk/imx/clk-imxrt1050.c
> index 3e17161002..5cb5e3bc15 100644
> --- a/drivers/clk/imx/clk-imxrt1050.c
> +++ b/drivers/clk/imx/clk-imxrt1050.c
> @@ -15,89 +15,6 @@
> 
>  #include "clk.h"
> 
> -static ulong imxrt1050_clk_get_rate(struct clk *clk)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       debug("%s(#%lu)\n", __func__, clk->id);
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       return clk_get_rate(c);
> -}
> -
> -static ulong imxrt1050_clk_set_rate(struct clk *clk, ulong rate)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       debug("%s(#%lu), rate: %lu\n", __func__, clk->id, rate);
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       return clk_set_rate(c, rate);
> -}
> -
> -static int __imxrt1050_clk_enable(struct clk *clk, bool enable)
> -{
> -       struct clk *c;
> -       int ret;
> -
> -       debug("%s(#%lu) en: %d\n", __func__, clk->id, enable);
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       if (enable)
> -               ret = clk_enable(c);
> -       else
> -               ret = clk_disable(c);
> -
> -       return ret;
> -}
> -
> -static int imxrt1050_clk_disable(struct clk *clk)
> -{
> -       return __imxrt1050_clk_enable(clk, 0);
> -}
> -
> -static int imxrt1050_clk_enable(struct clk *clk)
> -{
> -       return __imxrt1050_clk_enable(clk, 1);
> -}
> -
> -static int imxrt1050_clk_set_parent(struct clk *clk, struct clk *parent)
> -{
> -       struct clk *c, *cp;
> -       int ret;
> -
> -       debug("%s(#%lu), parent: %lu\n", __func__, clk->id, parent->id);
> -
> -       ret = clk_get_by_id(clk->id, &c);
> -       if (ret)
> -               return ret;
> -
> -       ret = clk_get_by_id(parent->id, &cp);
> -       if (ret)
> -               return ret;
> -
> -       return clk_set_parent(c, cp);
> -}
> -
> -static struct clk_ops imxrt1050_clk_ops = {
> -       .set_rate = imxrt1050_clk_set_rate,
> -       .get_rate = imxrt1050_clk_get_rate,
> -       .enable = imxrt1050_clk_enable,
> -       .disable = imxrt1050_clk_disable,
> -       .set_parent = imxrt1050_clk_set_parent,
> -};
> -
>  static const char * const pll_ref_sels[] = {"osc", "dummy", };
>  static const char * const pll1_bypass_sels[] = {"pll1_arm", "pll1_arm_ref_sel", };
>  static const char * const pll2_bypass_sels[] = {"pll2_sys", "pll2_sys_ref_sel", };
> @@ -317,7 +234,7 @@ U_BOOT_DRIVER(imxrt1050_clk) = {
>         .name = "clk_imxrt1050",
>         .id = UCLASS_CLK,
>         .of_match = imxrt1050_clk_ids,
> -       .ops = &imxrt1050_clk_ops,
> +       .ops = &ccf_clk_ops,
>         .probe = imxrt1050_clk_probe,
>         .flags = DM_FLAG_PRE_RELOC,
>  };
> diff --git a/drivers/clk/microchip/mpfs_clk.c b/drivers/clk/microchip/mpfs_clk.c
> index 05d7647206..67828c9bf4 100644
> --- a/drivers/clk/microchip/mpfs_clk.c
> +++ b/drivers/clk/microchip/mpfs_clk.c
> @@ -15,63 +15,6 @@
> 
>  #include "mpfs_clk.h"
> 
> -/* All methods are delegated to CCF clocks */
> -
> -static ulong mpfs_clk_get_rate(struct clk *clk)
> -{
> -       struct clk *c;
> -       int err = clk_get_by_id(clk->id, &c);
> -
> -       if (err)
> -               return err;
> -       return clk_get_rate(c);
> -}
> -
> -static ulong mpfs_clk_set_rate(struct clk *clk, unsigned long rate)
> -{
> -       struct clk *c;
> -       int err = clk_get_by_id(clk->id, &c);
> -
> -       if (err)
> -               return err;
> -       return clk_set_rate(c, rate);
> -}
> -
> -static int mpfs_clk_set_parent(struct clk *clk, struct clk *parent)
> -{
> -       struct clk *c, *p;
> -       int err = clk_get_by_id(clk->id, &c);
> -
> -       if (err)
> -               return err;
> -
> -       err = clk_get_by_id(parent->id, &p);
> -       if (err)
> -               return err;
> -
> -       return clk_set_parent(c, p);
> -}
> -
> -static int mpfs_clk_endisable(struct clk *clk, bool enable)
> -{
> -       struct clk *c;
> -       int err = clk_get_by_id(clk->id, &c);
> -
> -       if (err)
> -               return err;
> -       return enable ? clk_enable(c) : clk_disable(c);
> -}
> -
> -static int mpfs_clk_enable(struct clk *clk)
> -{
> -       return mpfs_clk_endisable(clk, true);
> -}
> -
> -static int mpfs_clk_disable(struct clk *clk)
> -{
> -       return mpfs_clk_endisable(clk, false);
> -}
> -
>  static int mpfs_clk_probe(struct udevice *dev)
>  {
>         int ret;
> @@ -100,14 +43,6 @@ static int mpfs_clk_probe(struct udevice *dev)
>         return ret;
>  }
> 
> -static const struct clk_ops mpfs_clk_ops = {
> -       .set_rate = mpfs_clk_set_rate,
> -       .get_rate = mpfs_clk_get_rate,
> -       .set_parent = mpfs_clk_set_parent,
> -       .enable = mpfs_clk_enable,
> -       .disable = mpfs_clk_disable,
> -};
> -
>  static const struct udevice_id mpfs_of_match[] = {
>         { .compatible = "microchip,mpfs-clkcfg" },
>         { }
> @@ -117,7 +52,7 @@ U_BOOT_DRIVER(mpfs_clk) = {
>         .name = "mpfs_clk",
>         .id = UCLASS_CLK,
>         .of_match = mpfs_of_match,
> -       .ops = &mpfs_clk_ops,
> +       .ops = &ccf_clk_ops,
>         .probe = mpfs_clk_probe,
>         .priv_auto = sizeof(struct clk),
>         .flags = DM_FLAG_PRE_RELOC,
> --
> 2.34.1
> 


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 2/2] clk: Use generic CCF ops where possible
  2022-03-20 20:34 ` [PATCH 2/2] clk: Use generic CCF ops where possible Sean Anderson
  2022-03-21  1:30   ` Peng Fan (OSS)
  2022-03-21 13:24   ` Claudiu.Beznea
@ 2022-03-30 19:21   ` Sean Anderson
  2 siblings, 0 replies; 7+ messages in thread
From: Sean Anderson @ 2022-03-30 19:21 UTC (permalink / raw)
  To: u-boot
  Cc: Peng Fan, Eugen Hristev, Claudiu Beznea, Cyril Jean,
	Lukasz Majewski, Giulio Benetti

On 3/20/22 4:34 PM, Sean Anderson wrote:
> This converts most CCF drivers to use generic ops. imx6q is the only
> outlier, where we retain the existing functionality by moving the check to
> request().
> 
> Signed-off-by: Sean Anderson <seanga2@gmail.com>
> ---
> 
>   drivers/clk/at91/pmc.c           | 56 ++------------------
>   drivers/clk/imx/clk-imx6q.c      | 73 +++-----------------------
>   drivers/clk/imx/clk-imx8mm.c     | 88 +------------------------------
>   drivers/clk/imx/clk-imx8mn.c     | 88 +------------------------------
>   drivers/clk/imx/clk-imx8mp.c     | 90 +-------------------------------
>   drivers/clk/imx/clk-imxrt1020.c  | 65 ++---------------------
>   drivers/clk/imx/clk-imxrt1050.c  | 85 +-----------------------------
>   drivers/clk/microchip/mpfs_clk.c | 67 +-----------------------
>   8 files changed, 21 insertions(+), 591 deletions(-)
> 
> diff --git a/drivers/clk/at91/pmc.c b/drivers/clk/at91/pmc.c
> index 1fa42d728b..58bf1047b5 100644
> --- a/drivers/clk/at91/pmc.c
> +++ b/drivers/clk/at91/pmc.c

This driver needs to #include <linux/clk-provider.h>

I've added this while applying.

--Sean

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/2] clk: ccf: Add some helper functions for clock ops
  2022-03-20 20:34 [PATCH 1/2] clk: ccf: Add some helper functions for clock ops Sean Anderson
  2022-03-20 20:34 ` [PATCH 2/2] clk: Use generic CCF ops where possible Sean Anderson
  2022-03-21  1:29 ` [PATCH 1/2] clk: ccf: Add some helper functions for clock ops Peng Fan (OSS)
@ 2022-03-30 19:21 ` Sean Anderson
  2 siblings, 0 replies; 7+ messages in thread
From: Sean Anderson @ 2022-03-30 19:21 UTC (permalink / raw)
  To: Sean Anderson, u-boot
  Cc: Claudiu Beznea, Eugen Hristev, Cyril Jean, Giulio Benetti,
	Lukasz Majewski, Peng Fan

On Sun, 20 Mar 2022 16:34:45 -0400, Sean Anderson wrote:
> Most CCF drivers follow a common pattern where their clock ops defer the
> actual operation to the backing CCF clock. Add some generic implementations
> of these functions to reduce duplication of code.
> 
> 

Applied, thanks!

[1/2] clk: ccf: Add some helper functions for clock ops
      commit: 3a11b5ae65c269ef9f7bb1e18826e85fc164f161
[2/2] clk: Use generic CCF ops where possible
      commit: 47ac74e4eb7bc920573a7cf59275b48fe8500482

Best regards,
-- 
Sean Anderson <seanga2@gmail.com>

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2022-03-30 19:22 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-20 20:34 [PATCH 1/2] clk: ccf: Add some helper functions for clock ops Sean Anderson
2022-03-20 20:34 ` [PATCH 2/2] clk: Use generic CCF ops where possible Sean Anderson
2022-03-21  1:30   ` Peng Fan (OSS)
2022-03-21 13:24   ` Claudiu.Beznea
2022-03-30 19:21   ` Sean Anderson
2022-03-21  1:29 ` [PATCH 1/2] clk: ccf: Add some helper functions for clock ops Peng Fan (OSS)
2022-03-30 19:21 ` Sean Anderson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.