Add a gates_offs field to struct mtk_cg_priv and use that instead of struct mtk_clk_tree.gates_offs.
Prior to this change, struct mtk_clk_tree.gates_offs could be the offset of struct mtk_clk_tree.gates or struct mtk_cg_priv.gates depending on the context. This was confusing and error-prone. For example, in mt8365 there is one set of gates that needs an offset and one that does not that share the same struct mtk_clk_tree. This is fixed in this patch by giving the correct offset for each gate separately. Signed-off-by: David Lechner <[email protected]> --- drivers/clk/mediatek/clk-mt7622.c | 8 ++++---- drivers/clk/mediatek/clk-mt7623.c | 8 +++----- drivers/clk/mediatek/clk-mt7629.c | 11 +++++------ drivers/clk/mediatek/clk-mt7981.c | 6 +++--- drivers/clk/mediatek/clk-mt7986.c | 2 +- drivers/clk/mediatek/clk-mt7987.c | 2 +- drivers/clk/mediatek/clk-mt7988.c | 8 ++++---- drivers/clk/mediatek/clk-mt8183.c | 2 +- drivers/clk/mediatek/clk-mt8365.c | 5 +++-- drivers/clk/mediatek/clk-mt8512.c | 4 ++-- drivers/clk/mediatek/clk-mt8516.c | 2 +- drivers/clk/mediatek/clk-mt8518.c | 2 +- drivers/clk/mediatek/clk-mtk.c | 24 +++++++++++++----------- drivers/clk/mediatek/clk-mtk.h | 4 +++- 14 files changed, 45 insertions(+), 43 deletions(-) diff --git a/drivers/clk/mediatek/clk-mt7622.c b/drivers/clk/mediatek/clk-mt7622.c index 16c6f024e72..9621d5efe11 100644 --- a/drivers/clk/mediatek/clk-mt7622.c +++ b/drivers/clk/mediatek/clk-mt7622.c @@ -693,7 +693,7 @@ static int mt7622_pericfg_probe(struct udevice *dev) static int mt7622_pciesys_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7622_clk_tree, pcie_cgs, - ARRAY_SIZE(pcie_cgs)); + ARRAY_SIZE(pcie_cgs), 0); } static int mt7622_pciesys_bind(struct udevice *dev) @@ -712,7 +712,7 @@ static int mt7622_pciesys_bind(struct udevice *dev) static int mt7622_ethsys_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7622_clk_tree, eth_cgs, - ARRAY_SIZE(eth_cgs)); + ARRAY_SIZE(eth_cgs), 0); } static int mt7622_ethsys_bind(struct udevice *dev) @@ -731,13 +731,13 @@ static int mt7622_ethsys_bind(struct udevice *dev) static int mt7622_sgmiisys_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7622_clk_tree, sgmii_cgs, - ARRAY_SIZE(sgmii_cgs)); + ARRAY_SIZE(sgmii_cgs), 0); } static int mt7622_ssusbsys_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7622_clk_tree, ssusb_cgs, - ARRAY_SIZE(ssusb_cgs)); + ARRAY_SIZE(ssusb_cgs), 0); } static const struct udevice_id mt7622_apmixed_compat[] = { diff --git a/drivers/clk/mediatek/clk-mt7623.c b/drivers/clk/mediatek/clk-mt7623.c index 6ce1d729736..3509ea67e7d 100644 --- a/drivers/clk/mediatek/clk-mt7623.c +++ b/drivers/clk/mediatek/clk-mt7623.c @@ -1055,15 +1055,13 @@ static int mt7623_topckgen_probe(struct udevice *dev) } static const struct mtk_clk_tree mt7623_clk_gate_tree = { - /* Each CLK ID for gates clock starts at index 1 */ - .gates_offs = 1, .xtal_rate = 26 * MHZ, }; static int mt7623_infracfg_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7623_clk_gate_tree, infra_cgs, - ARRAY_SIZE(infra_cgs)); + ARRAY_SIZE(infra_cgs), 1); } static const struct mtk_clk_tree mt7623_clk_peri_tree = { @@ -1086,13 +1084,13 @@ static int mt7623_pericfg_probe(struct udevice *dev) static int mt7623_hifsys_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7623_clk_gate_tree, hif_cgs, - ARRAY_SIZE(hif_cgs)); + ARRAY_SIZE(hif_cgs), 1); } static int mt7623_ethsys_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7623_clk_gate_tree, eth_cgs, - ARRAY_SIZE(eth_cgs)); + ARRAY_SIZE(eth_cgs), 1); } static int mt7623_ethsys_hifsys_bind(struct udevice *dev) diff --git a/drivers/clk/mediatek/clk-mt7629.c b/drivers/clk/mediatek/clk-mt7629.c index e4132f6195f..5bbac309e9d 100644 --- a/drivers/clk/mediatek/clk-mt7629.c +++ b/drivers/clk/mediatek/clk-mt7629.c @@ -581,7 +581,6 @@ static const struct mtk_clk_tree mt7629_clk_tree = { static const struct mtk_clk_tree mt7629_peri_clk_tree = { .xtal_rate = 40 * MHZ, .xtal2_rate = 20 * MHZ, - .gates_offs = CLK_PERI_PWM1_PD, .fdivs_offs = CLK_TOP_TO_USB3_SYS, .muxes_offs = CLK_TOP_AXI_SEL, .plls = apmixed_plls, @@ -635,19 +634,19 @@ static int mt7629_topckgen_probe(struct udevice *dev) static int mt7629_infracfg_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7629_clk_tree, infra_cgs, - ARRAY_SIZE(infra_cgs)); + ARRAY_SIZE(infra_cgs), 0); } static int mt7629_pericfg_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7629_peri_clk_tree, peri_cgs, - ARRAY_SIZE(peri_cgs)); + ARRAY_SIZE(peri_cgs), CLK_PERI_PWM1_PD); } static int mt7629_ethsys_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7629_clk_tree, eth_cgs, - ARRAY_SIZE(eth_cgs)); + ARRAY_SIZE(eth_cgs), 0); } static int mt7629_ethsys_bind(struct udevice *dev) @@ -666,13 +665,13 @@ static int mt7629_ethsys_bind(struct udevice *dev) static int mt7629_sgmiisys_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7629_clk_tree, sgmii_cgs, - ARRAY_SIZE(sgmii_cgs)); + ARRAY_SIZE(sgmii_cgs), 0); } static int mt7629_ssusbsys_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7629_clk_tree, ssusb_cgs, - ARRAY_SIZE(ssusb_cgs)); + ARRAY_SIZE(ssusb_cgs), 0); } static const struct udevice_id mt7629_apmixed_compat[] = { diff --git a/drivers/clk/mediatek/clk-mt7981.c b/drivers/clk/mediatek/clk-mt7981.c index c8adbe538d9..73dc5cfe19d 100644 --- a/drivers/clk/mediatek/clk-mt7981.c +++ b/drivers/clk/mediatek/clk-mt7981.c @@ -631,7 +631,7 @@ static const struct mtk_gate sgmii0_cgs[] = { static int mt7981_sgmii0sys_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7981_topckgen_clk_tree, - sgmii0_cgs, ARRAY_SIZE(sgmii0_cgs)); + sgmii0_cgs, ARRAY_SIZE(sgmii0_cgs), 0); } static const struct udevice_id mt7981_sgmii0sys_compat[] = { @@ -658,7 +658,7 @@ static const struct mtk_gate sgmii1_cgs[] = { static int mt7981_sgmii1sys_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7981_topckgen_clk_tree, - sgmii1_cgs, ARRAY_SIZE(sgmii1_cgs)); + sgmii1_cgs, ARRAY_SIZE(sgmii1_cgs), 0); } static const struct udevice_id mt7981_sgmii1sys_compat[] = { @@ -699,7 +699,7 @@ static const struct mtk_gate eth_cgs[] = { static int mt7981_ethsys_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7981_topckgen_clk_tree, - eth_cgs, ARRAY_SIZE(eth_cgs)); + eth_cgs, ARRAY_SIZE(eth_cgs), 0); } static int mt7981_ethsys_bind(struct udevice *dev) diff --git a/drivers/clk/mediatek/clk-mt7986.c b/drivers/clk/mediatek/clk-mt7986.c index d2ac5ad1bb1..04040f5ff63 100644 --- a/drivers/clk/mediatek/clk-mt7986.c +++ b/drivers/clk/mediatek/clk-mt7986.c @@ -637,7 +637,7 @@ static const struct mtk_gate eth_cgs[] = { static int mt7986_ethsys_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7986_topckgen_clk_tree, eth_cgs, - ARRAY_SIZE(eth_cgs)); + ARRAY_SIZE(eth_cgs), 0); } static int mt7986_ethsys_bind(struct udevice *dev) diff --git a/drivers/clk/mediatek/clk-mt7987.c b/drivers/clk/mediatek/clk-mt7987.c index e0ca82de01e..3a30d16a158 100644 --- a/drivers/clk/mediatek/clk-mt7987.c +++ b/drivers/clk/mediatek/clk-mt7987.c @@ -819,7 +819,7 @@ static const struct mtk_gate eth_cgs[] = { static int mt7987_ethsys_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7987_topckgen_clk_tree, eth_cgs, - ARRAY_SIZE(eth_cgs)); + ARRAY_SIZE(eth_cgs), 0); } static int mt7987_ethsys_bind(struct udevice *dev) diff --git a/drivers/clk/mediatek/clk-mt7988.c b/drivers/clk/mediatek/clk-mt7988.c index 43820557ba7..71a16b9f19f 100644 --- a/drivers/clk/mediatek/clk-mt7988.c +++ b/drivers/clk/mediatek/clk-mt7988.c @@ -893,7 +893,7 @@ static int mt7988_ethdma_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7988_topckgen_clk_tree, ethdma_mtk_gate, - ARRAY_SIZE(ethdma_mtk_gate)); + ARRAY_SIZE(ethdma_mtk_gate), 0); } static int mt7988_ethdma_bind(struct udevice *dev) @@ -952,7 +952,7 @@ static int mt7988_sgmiisys_0_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7988_topckgen_clk_tree, sgmiisys_0_mtk_gate, - ARRAY_SIZE(sgmiisys_0_mtk_gate)); + ARRAY_SIZE(sgmiisys_0_mtk_gate), 0); } static const struct udevice_id mt7988_sgmiisys_0_compat[] = { @@ -997,7 +997,7 @@ static int mt7988_sgmiisys_1_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7988_topckgen_clk_tree, sgmiisys_1_mtk_gate, - ARRAY_SIZE(sgmiisys_1_mtk_gate)); + ARRAY_SIZE(sgmiisys_1_mtk_gate), 0); } static const struct udevice_id mt7988_sgmiisys_1_compat[] = { @@ -1044,7 +1044,7 @@ static int mt7988_ethwarp_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt7988_topckgen_clk_tree, ethwarp_mtk_gate, - ARRAY_SIZE(ethwarp_mtk_gate)); + ARRAY_SIZE(ethwarp_mtk_gate), 0); } static int mt7988_ethwarp_bind(struct udevice *dev) diff --git a/drivers/clk/mediatek/clk-mt8183.c b/drivers/clk/mediatek/clk-mt8183.c index 5b41cf4b88c..5a353e82f3f 100644 --- a/drivers/clk/mediatek/clk-mt8183.c +++ b/drivers/clk/mediatek/clk-mt8183.c @@ -778,7 +778,7 @@ static int mt8183_topckgen_probe(struct udevice *dev) static int mt8183_infracfg_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt8183_clk_tree, infra_clks, - ARRAY_SIZE(infra_clks)); + ARRAY_SIZE(infra_clks), 0); } static const struct udevice_id mt8183_apmixed_compat[] = { diff --git a/drivers/clk/mediatek/clk-mt8365.c b/drivers/clk/mediatek/clk-mt8365.c index b6332b14aea..02d30ab12d8 100644 --- a/drivers/clk/mediatek/clk-mt8365.c +++ b/drivers/clk/mediatek/clk-mt8365.c @@ -708,13 +708,14 @@ static int mt8365_topckgen_probe(struct udevice *dev) static int mt8365_topckgen_cg_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt8365_clk_tree, top_clk_gates, - ARRAY_SIZE(top_clk_gates)); + ARRAY_SIZE(top_clk_gates), + CLK_TOP_AUD_I2S0_M); } static int mt8365_infracfg_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt8365_clk_tree, ifr_clks, - ARRAY_SIZE(ifr_clks)); + ARRAY_SIZE(ifr_clks), 0); } static const struct udevice_id mt8365_apmixed_compat[] = { diff --git a/drivers/clk/mediatek/clk-mt8512.c b/drivers/clk/mediatek/clk-mt8512.c index d4f6604c160..bad8c62601d 100644 --- a/drivers/clk/mediatek/clk-mt8512.c +++ b/drivers/clk/mediatek/clk-mt8512.c @@ -809,13 +809,13 @@ static int mt8512_topckgen_probe(struct udevice *dev) static int mt8512_topckgen_cg_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt8512_clk_tree, top_clks, - ARRAY_SIZE(top_clks)); + ARRAY_SIZE(top_clks), 0); } static int mt8512_infracfg_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt8512_clk_tree, infra_clks, - ARRAY_SIZE(infra_clks)); + ARRAY_SIZE(infra_clks), 0); } static const struct udevice_id mt8512_apmixed_compat[] = { diff --git a/drivers/clk/mediatek/clk-mt8516.c b/drivers/clk/mediatek/clk-mt8516.c index d5f922886a3..a84a5f360f5 100644 --- a/drivers/clk/mediatek/clk-mt8516.c +++ b/drivers/clk/mediatek/clk-mt8516.c @@ -758,7 +758,7 @@ static int mt8516_topckgen_probe(struct udevice *dev) static int mt8516_topckgen_cg_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt8516_clk_tree, top_clks, - ARRAY_SIZE(top_clks)); + ARRAY_SIZE(top_clks), 0); } static const struct udevice_id mt8516_apmixed_compat[] = { diff --git a/drivers/clk/mediatek/clk-mt8518.c b/drivers/clk/mediatek/clk-mt8518.c index 92730f3f06c..43a06217d33 100644 --- a/drivers/clk/mediatek/clk-mt8518.c +++ b/drivers/clk/mediatek/clk-mt8518.c @@ -1514,7 +1514,7 @@ static int mt8518_topckgen_probe(struct udevice *dev) static int mt8518_topckgen_cg_probe(struct udevice *dev) { return mtk_common_clk_gate_init(dev, &mt8518_clk_tree, top_clks, - ARRAY_SIZE(top_clks)); + ARRAY_SIZE(top_clks), 0); } static const struct udevice_id mt8518_apmixed_compat[] = { diff --git a/drivers/clk/mediatek/clk-mtk.c b/drivers/clk/mediatek/clk-mtk.c index a3dd18363f6..6ba2fabfd08 100644 --- a/drivers/clk/mediatek/clk-mtk.c +++ b/drivers/clk/mediatek/clk-mtk.c @@ -1018,8 +1018,8 @@ static const int mtk_clk_gate_of_xlate(struct clk *clk, if (ret) return ret; - if (clk->id >= tree->gates_offs && - clk->id < tree->gates_offs + priv->num_gates) + if (clk->id >= priv->gates_offs && + clk->id < priv->gates_offs + priv->num_gates) return 0; return -ENOENT; @@ -1030,10 +1030,10 @@ static int mtk_clk_gate_enable(struct clk *clk) struct mtk_cg_priv *priv = dev_get_priv(clk->dev); const struct mtk_gate *gate; - if (clk->id < priv->tree->gates_offs) + if (clk->id < priv->gates_offs) return -EINVAL; - gate = &priv->gates[clk->id - priv->tree->gates_offs]; + gate = &priv->gates[clk->id - priv->gates_offs]; return mtk_gate_enable(priv->base, gate); } @@ -1042,10 +1042,10 @@ static int mtk_clk_gate_disable(struct clk *clk) struct mtk_cg_priv *priv = dev_get_priv(clk->dev); const struct mtk_gate *gate; - if (clk->id < priv->tree->gates_offs) + if (clk->id < priv->gates_offs) return -EINVAL; - gate = &priv->gates[clk->id - priv->tree->gates_offs]; + gate = &priv->gates[clk->id - priv->gates_offs]; return mtk_gate_disable(priv->base, gate); } @@ -1055,10 +1055,10 @@ static ulong mtk_clk_gate_get_rate(struct clk *clk) struct udevice *parent = priv->parent; const struct mtk_gate *gate; - if (clk->id < priv->tree->gates_offs) + if (clk->id < priv->gates_offs) return -EINVAL; - gate = &priv->gates[clk->id - priv->tree->gates_offs]; + gate = &priv->gates[clk->id - priv->gates_offs]; /* * With requesting a TOPCKGEN parent, make sure the dev parent * is actually topckgen. This might not be the case for an @@ -1094,8 +1094,8 @@ static void mtk_clk_gate_dump(struct udevice *dev) const struct mtk_gate *gate = &priv->gates[i]; printf("[GATE%u] DT: %u", i, gate->id); - mtk_clk_print_mapped_id(gate->id, i + tree->gates_offs, tree->id_offs_map); - mtk_clk_print_rate(dev, i + tree->gates_offs); + mtk_clk_print_mapped_id(gate->id, i + priv->gates_offs, tree->id_offs_map); + mtk_clk_print_rate(dev, i + priv->gates_offs); mtk_clk_print_single_parent(gate->parent, gate->flags); printf("\n"); } @@ -1196,7 +1196,8 @@ int mtk_common_clk_infrasys_init(struct udevice *dev, int mtk_common_clk_gate_init(struct udevice *dev, const struct mtk_clk_tree *tree, - const struct mtk_gate *gates, int num_gates) + const struct mtk_gate *gates, int num_gates, + int gates_offs) { struct mtk_cg_priv *priv = dev_get_priv(dev); struct udevice *parent; @@ -1218,6 +1219,7 @@ int mtk_common_clk_gate_init(struct udevice *dev, priv->tree = tree; priv->gates = gates; priv->num_gates = num_gates; + priv->gates_offs = gates_offs; return 0; } diff --git a/drivers/clk/mediatek/clk-mtk.h b/drivers/clk/mediatek/clk-mtk.h index 915b872ec36..25fd156ac30 100644 --- a/drivers/clk/mediatek/clk-mtk.h +++ b/drivers/clk/mediatek/clk-mtk.h @@ -290,6 +290,7 @@ struct mtk_cg_priv { const struct mtk_clk_tree *tree; const struct mtk_gate *gates; int num_gates; + int gates_offs; }; extern const struct clk_ops mtk_clk_apmixedsys_ops; @@ -304,6 +305,7 @@ int mtk_common_clk_infrasys_init(struct udevice *dev, const struct mtk_clk_tree *tree); int mtk_common_clk_gate_init(struct udevice *dev, const struct mtk_clk_tree *tree, - const struct mtk_gate *gates, int num_gates); + const struct mtk_gate *gates, int num_gates, + int gates_offs); #endif /* __DRV_CLK_MTK_H */ -- 2.43.0

