Trying to set the rate of m250_div's parent clock makes no sense since it's a mux which has neither CLK_MUX_ROUND_CLOSEST nor CLK_SET_RATE_PARENT set. It even does harm on Meson8b SoCs where the input clock for the mux cannot be divided down to 250MHz evenly (the parent rate is 500002394Hz) which is why we need to use CLK_DIVIDER_ROUND_CLOSEST for the m250_div clock. The clk-divider driver however ignores the CLK_DIVIDER_ROUND_CLOSEST flag if CLK_SET_RATE_PARENT is set (because it simply tries to set the best possible clock rate for the parent, which does nothing in our case since the parent is a mux which doesn't allow rate changes as explained above).
This fixes setting the RGMII clock on Meson8 SoCs which ended up with a ~20MHz clock instead of the expected ~25MHz. The dwmac-meson8b driver requests a 25MHz clock rate for the m25_div (which only supports "divide by 5" and "divide by 10") clock which is derived from the m250_div clock. Due to clk-divider ignoring the CLK_DIVIDER_ROUND_CLOSEST flag the resulting m250_div clock was set to ~100MHz (divider = 5) and the m25_div clock was set to ~20MHz (divider = 5) by the common clock framework (as this value is closest to 25MHz if we would not have set CLK_DIVIDER_ROUND_CLOSEST). What we actually need however is a rate of ~250MHz on the m250_div clock (divider = 2) and ~25MHz on the m25_div clock (divider = 10) - these are also the values chosen by the out-of-tree vendor driver. With this we end up with a RGMII clock of 25000120Hz (which is as close to 25MHz we can get with an input clock of 500002394Hz). SoCs from the Meson GX series are not affected by this change because the input clock is FCLK_DIV2 whose rate cannot be changed. Additionally the GX SoCs don't need to use the "closest" divider since the parent clock is a multiple of 250MHz. Fixes: 566e8251625304 ("net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC") Signed-off-by: Martin Blumenstingl <martin.blumensti...@googlemail.com> --- drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c index c71966332387..26f41c117d63 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c @@ -135,7 +135,7 @@ static int meson8b_init_clk(struct meson8b_dwmac *dwmac) snprintf(clk_name, sizeof(clk_name), "%s#m250_div", dev_name(dev)); init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); init.ops = &clk_divider_ops; - init.flags = CLK_SET_RATE_PARENT; + init.flags = 0; clk_div_parents[0] = __clk_get_name(dwmac->m250_mux_clk); init.parent_names = clk_div_parents; init.num_parents = ARRAY_SIZE(clk_div_parents); -- 2.15.1