| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- From 50859bea6a3334834b8250e7e5406507f0d0918a Mon Sep 17 00:00:00 2001
- From: Weijie Gao <[email protected]>
- Date: Wed, 31 Aug 2022 19:05:06 +0800
- Subject: [PATCH 23/32] clk: mediatek: add support to configure clock driver
- parent
- This patch adds support for a clock node to configure its parent clock
- where possible.
- Reviewed-by: Simon Glass <[email protected]>
- Signed-off-by: Weijie Gao <[email protected]>
- ---
- drivers/clk/mediatek/clk-mtk.c | 79 ++++++++++++++++++++--------------
- drivers/clk/mediatek/clk-mtk.h | 2 +
- 2 files changed, 48 insertions(+), 33 deletions(-)
- --- a/drivers/clk/mediatek/clk-mtk.c
- +++ b/drivers/clk/mediatek/clk-mtk.c
- @@ -42,20 +42,14 @@
- * the accurate frequency.
- */
- static ulong mtk_clk_find_parent_rate(struct clk *clk, int id,
- - const struct driver *drv)
- + struct udevice *pdev)
- {
- struct clk parent = { .id = id, };
-
- - if (drv) {
- - struct udevice *dev;
- -
- - if (uclass_get_device_by_driver(UCLASS_CLK, drv, &dev))
- - return -ENODEV;
- -
- - parent.dev = dev;
- - } else {
- + if (pdev)
- + parent.dev = pdev;
- + else
- parent.dev = clk->dev;
- - }
-
- return clk_get_rate(&parent);
- }
- @@ -296,7 +290,7 @@ static ulong mtk_topckgen_get_factor_rat
- switch (fdiv->flags & CLK_PARENT_MASK) {
- case CLK_PARENT_APMIXED:
- rate = mtk_clk_find_parent_rate(clk, fdiv->parent,
- - DM_DRIVER_GET(mtk_clk_apmixedsys));
- + priv->parent);
- break;
- case CLK_PARENT_TOPCKGEN:
- rate = mtk_clk_find_parent_rate(clk, fdiv->parent, NULL);
- @@ -321,9 +315,18 @@ static ulong mtk_topckgen_get_mux_rate(s
-
- if (mux->parent[index] > 0 ||
- (mux->parent[index] == CLK_XTAL &&
- - priv->tree->flags & CLK_BYPASS_XTAL))
- - return mtk_clk_find_parent_rate(clk, mux->parent[index],
- - NULL);
- + priv->tree->flags & CLK_BYPASS_XTAL)) {
- + switch (mux->flags & CLK_PARENT_MASK) {
- + case CLK_PARENT_APMIXED:
- + return mtk_clk_find_parent_rate(clk, mux->parent[index],
- + priv->parent);
- + break;
- + default:
- + return mtk_clk_find_parent_rate(clk, mux->parent[index],
- + NULL);
- + break;
- + }
- + }
-
- return priv->tree->xtal_rate;
- }
- @@ -342,7 +345,7 @@ static ulong mtk_topckgen_get_rate(struc
- priv->tree->muxes_offs);
- }
-
- -static int mtk_topckgen_enable(struct clk *clk)
- +static int mtk_clk_mux_enable(struct clk *clk)
- {
- struct mtk_clk_priv *priv = dev_get_priv(clk->dev);
- const struct mtk_composite *mux;
- @@ -375,7 +378,7 @@ static int mtk_topckgen_enable(struct cl
- return 0;
- }
-
- -static int mtk_topckgen_disable(struct clk *clk)
- +static int mtk_clk_mux_disable(struct clk *clk)
- {
- struct mtk_clk_priv *priv = dev_get_priv(clk->dev);
- const struct mtk_composite *mux;
- @@ -401,7 +404,7 @@ static int mtk_topckgen_disable(struct c
- return 0;
- }
-
- -static int mtk_topckgen_set_parent(struct clk *clk, struct clk *parent)
- +static int mtk_common_clk_set_parent(struct clk *clk, struct clk *parent)
- {
- struct mtk_clk_priv *priv = dev_get_priv(clk->dev);
-
- @@ -473,19 +476,7 @@ static ulong mtk_clk_gate_get_rate(struc
- struct mtk_cg_priv *priv = dev_get_priv(clk->dev);
- const struct mtk_gate *gate = &priv->gates[clk->id];
-
- - switch (gate->flags & CLK_PARENT_MASK) {
- - case CLK_PARENT_APMIXED:
- - return mtk_clk_find_parent_rate(clk, gate->parent,
- - DM_DRIVER_GET(mtk_clk_apmixedsys));
- - break;
- - case CLK_PARENT_TOPCKGEN:
- - return mtk_clk_find_parent_rate(clk, gate->parent,
- - DM_DRIVER_GET(mtk_clk_topckgen));
- - break;
- -
- - default:
- - return priv->tree->xtal_rate;
- - }
- + return mtk_clk_find_parent_rate(clk, gate->parent, priv->parent);
- }
-
- const struct clk_ops mtk_clk_apmixedsys_ops = {
- @@ -496,10 +487,10 @@ const struct clk_ops mtk_clk_apmixedsys_
- };
-
- const struct clk_ops mtk_clk_topckgen_ops = {
- - .enable = mtk_topckgen_enable,
- - .disable = mtk_topckgen_disable,
- + .enable = mtk_clk_mux_enable,
- + .disable = mtk_clk_mux_disable,
- .get_rate = mtk_topckgen_get_rate,
- - .set_parent = mtk_topckgen_set_parent,
- + .set_parent = mtk_common_clk_set_parent,
- };
-
- const struct clk_ops mtk_clk_gate_ops = {
- @@ -512,11 +503,22 @@ int mtk_common_clk_init(struct udevice *
- const struct mtk_clk_tree *tree)
- {
- struct mtk_clk_priv *priv = dev_get_priv(dev);
- + struct udevice *parent;
- + int ret;
-
- priv->base = dev_read_addr_ptr(dev);
- if (!priv->base)
- return -ENOENT;
-
- + ret = uclass_get_device_by_phandle(UCLASS_CLK, dev, "clock-parent", &parent);
- + if (ret || !parent) {
- + ret = uclass_get_device_by_driver(UCLASS_CLK,
- + DM_DRIVER_GET(mtk_clk_apmixedsys), &parent);
- + if (ret || !parent)
- + return -ENOENT;
- + }
- +
- + priv->parent = parent;
- priv->tree = tree;
-
- return 0;
- @@ -527,11 +529,22 @@ int mtk_common_clk_gate_init(struct udev
- const struct mtk_gate *gates)
- {
- struct mtk_cg_priv *priv = dev_get_priv(dev);
- + struct udevice *parent;
- + int ret;
-
- priv->base = dev_read_addr_ptr(dev);
- if (!priv->base)
- return -ENOENT;
-
- + ret = uclass_get_device_by_phandle(UCLASS_CLK, dev, "clock-parent", &parent);
- + if (ret || !parent) {
- + ret = uclass_get_device_by_driver(UCLASS_CLK,
- + DM_DRIVER_GET(mtk_clk_topckgen), &parent);
- + if (ret || !parent)
- + return -ENOENT;
- + }
- +
- + priv->parent = parent;
- priv->tree = tree;
- priv->gates = gates;
-
- --- a/drivers/clk/mediatek/clk-mtk.h
- +++ b/drivers/clk/mediatek/clk-mtk.h
- @@ -206,11 +206,13 @@ struct mtk_clk_tree {
- };
-
- struct mtk_clk_priv {
- + struct udevice *parent;
- void __iomem *base;
- const struct mtk_clk_tree *tree;
- };
-
- struct mtk_cg_priv {
- + struct udevice *parent;
- void __iomem *base;
- const struct mtk_clk_tree *tree;
- const struct mtk_gate *gates;
|