* [net-next PATCH v1 0/3] dwmac-meson8b: small cleanup @ 2018-02-17 14:08 ` Martin Blumenstingl 0 siblings, 0 replies; 16+ messages in thread From: Martin Blumenstingl @ 2018-02-17 14:08 UTC (permalink / raw) To: linus-amlogic This is a follow-up to my previous series "dwmac-meson8b: clock fixes for Meson8b" from [0]. during the review of that series it was found that the clock registration could be simplified. now that the previous series has landed we can start cleaning up the clock registration. the goal of this series is to simplify the code in the dwmac-meson8b driver. no functional changes are intended. I have tested this on my Khadas VIM2 (GXM SoC, with RGMII PHY) and my Endless Mini (EC-100, Meson8b SoC with RMII PHY, .dts support is not part of mainline yet). no problems were found. [0] http://lists.infradead.org/pipermail/linux-amlogic/2018-January/006143.html Martin Blumenstingl (3): net: stmmac: dwmac-meson8b: simplify clock registration net: stmmac: dwmac-meson8b: only keep struct device around net: stmmac: dwmac-meson8b: make the clock configurations private .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 208 +++++++++------------ 1 file changed, 92 insertions(+), 116 deletions(-) -- 2.16.1 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [net-next PATCH v1 0/3] dwmac-meson8b: small cleanup @ 2018-02-17 14:08 ` Martin Blumenstingl 0 siblings, 0 replies; 16+ messages in thread From: Martin Blumenstingl @ 2018-02-17 14:08 UTC (permalink / raw) To: linux-amlogic, netdev Cc: khilman, carlo, jbrunet, narmstrong, Martin Blumenstingl This is a follow-up to my previous series "dwmac-meson8b: clock fixes for Meson8b" from [0]. during the review of that series it was found that the clock registration could be simplified. now that the previous series has landed we can start cleaning up the clock registration. the goal of this series is to simplify the code in the dwmac-meson8b driver. no functional changes are intended. I have tested this on my Khadas VIM2 (GXM SoC, with RGMII PHY) and my Endless Mini (EC-100, Meson8b SoC with RMII PHY, .dts support is not part of mainline yet). no problems were found. [0] http://lists.infradead.org/pipermail/linux-amlogic/2018-January/006143.html Martin Blumenstingl (3): net: stmmac: dwmac-meson8b: simplify clock registration net: stmmac: dwmac-meson8b: only keep struct device around net: stmmac: dwmac-meson8b: make the clock configurations private .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 208 +++++++++------------ 1 file changed, 92 insertions(+), 116 deletions(-) -- 2.16.1 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [net-next PATCH v1 1/3] net: stmmac: dwmac-meson8b: simplify clock registration 2018-02-17 14:08 ` Martin Blumenstingl @ 2018-02-17 14:08 ` Martin Blumenstingl -1 siblings, 0 replies; 16+ messages in thread From: Martin Blumenstingl @ 2018-02-17 14:08 UTC (permalink / raw) To: linus-amlogic To goal of this patch is to simplify the registration of the RGMII TX clock (and it's parent clocks). This is achieved by: - introducing the meson8b_dwmac_register_clk helper-function to remove code duplication when registering a single clock (this saves a few lines since we have 4 clocks internally) - using devm_add_action_or_reset to disable the RGMII TX clock automatically when needed. This also allows us to re-use the standard stmmac_pltfr_remove function. - devm_kasprintf() and devm_kstrdup() are not used anymore to generate the clock name (these are replaced by a variable on the stack) because the common clock framework already uses kstrdup() internally. No functional changes intended. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 156 +++++++++------------ 1 file changed, 65 insertions(+), 91 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c index 5270d26f0bc6..84a9a900e74e 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c @@ -55,17 +55,11 @@ struct meson8b_dwmac { phy_interface_t phy_mode; struct clk_mux m250_mux; - struct clk *m250_mux_clk; - struct clk *m250_mux_parent[MUX_CLK_NUM_PARENTS]; - struct clk_divider m250_div; - struct clk *m250_div_clk; - struct clk_fixed_factor fixed_div2; - struct clk *fixed_div2_clk; - struct clk_gate rgmii_tx_en; - struct clk *rgmii_tx_en_clk; + + struct clk *rgmii_tx_clk; u32 tx_delay_ns; }; @@ -82,106 +76,95 @@ static void meson8b_dwmac_mask_bits(struct meson8b_dwmac *dwmac, u32 reg, writel(data, dwmac->regs + reg); } -static int meson8b_init_rgmii_tx_clk(struct meson8b_dwmac *dwmac) +static struct clk *meson8b_dwmac_register_clk(struct meson8b_dwmac *dwmac, + const char *name_suffix, + const char **parent_names, + int num_parents, + const struct clk_ops *ops, + struct clk_hw *hw) { + struct device *dev = &dwmac->pdev->dev; struct clk_init_data init; + char clk_name[32]; + + snprintf(clk_name, sizeof(clk_name), "%s#%s", dev_name(dev), + name_suffix); + + init.name = clk_name; + init.ops = ops; + init.flags = CLK_SET_RATE_PARENT; + init.parent_names = parent_names; + init.num_parents = num_parents; + + hw->init = &init; + + return devm_clk_register(dev, hw); +} + +static int meson8b_init_rgmii_tx_clk(struct meson8b_dwmac *dwmac) +{ int i, ret; + struct clk *clk; struct device *dev = &dwmac->pdev->dev; - char clk_name[32]; - const char *clk_div_parents[1]; - const char *mux_parent_names[MUX_CLK_NUM_PARENTS]; + const char *parent_name, *mux_parent_names[MUX_CLK_NUM_PARENTS]; /* get the mux parents from DT */ for (i = 0; i < MUX_CLK_NUM_PARENTS; i++) { char name[16]; snprintf(name, sizeof(name), "clkin%d", i); - dwmac->m250_mux_parent[i] = devm_clk_get(dev, name); - if (IS_ERR(dwmac->m250_mux_parent[i])) { - ret = PTR_ERR(dwmac->m250_mux_parent[i]); + clk = devm_clk_get(dev, name); + if (IS_ERR(clk)) { + ret = PTR_ERR(clk); if (ret != -EPROBE_DEFER) dev_err(dev, "Missing clock %s\n", name); return ret; } - mux_parent_names[i] = - __clk_get_name(dwmac->m250_mux_parent[i]); + mux_parent_names[i] = __clk_get_name(clk); } - /* create the m250_mux */ - snprintf(clk_name, sizeof(clk_name), "%s#m250_sel", dev_name(dev)); - init.name = clk_name; - init.ops = &clk_mux_ops; - init.flags = CLK_SET_RATE_PARENT; - init.parent_names = mux_parent_names; - init.num_parents = MUX_CLK_NUM_PARENTS; - dwmac->m250_mux.reg = dwmac->regs + PRG_ETH0; dwmac->m250_mux.shift = PRG_ETH0_CLK_M250_SEL_SHIFT; dwmac->m250_mux.mask = PRG_ETH0_CLK_M250_SEL_MASK; - dwmac->m250_mux.flags = 0; - dwmac->m250_mux.table = NULL; - dwmac->m250_mux.hw.init = &init; - - dwmac->m250_mux_clk = devm_clk_register(dev, &dwmac->m250_mux.hw); - if (WARN_ON(IS_ERR(dwmac->m250_mux_clk))) - return PTR_ERR(dwmac->m250_mux_clk); - - /* create the m250_div */ - 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; - 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); + clk = meson8b_dwmac_register_clk(dwmac, "m250_sel", mux_parent_names, + MUX_CLK_NUM_PARENTS, &clk_mux_ops, + &dwmac->m250_mux.hw); + if (WARN_ON(IS_ERR(clk))) + return PTR_ERR(clk); + parent_name = __clk_get_name(clk); dwmac->m250_div.reg = dwmac->regs + PRG_ETH0; dwmac->m250_div.shift = PRG_ETH0_CLK_M250_DIV_SHIFT; dwmac->m250_div.width = PRG_ETH0_CLK_M250_DIV_WIDTH; - dwmac->m250_div.hw.init = &init; dwmac->m250_div.flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO | CLK_DIVIDER_ROUND_CLOSEST; + clk = meson8b_dwmac_register_clk(dwmac, "m250_div", &parent_name, 1, + &clk_divider_ops, + &dwmac->m250_div.hw); + if (WARN_ON(IS_ERR(clk))) + return PTR_ERR(clk); - dwmac->m250_div_clk = devm_clk_register(dev, &dwmac->m250_div.hw); - if (WARN_ON(IS_ERR(dwmac->m250_div_clk))) - return PTR_ERR(dwmac->m250_div_clk); - - /* create the fixed_div2 */ - snprintf(clk_name, sizeof(clk_name), "%s#fixed_div2", dev_name(dev)); - init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); - init.ops = &clk_fixed_factor_ops; - init.flags = CLK_SET_RATE_PARENT; - clk_div_parents[0] = __clk_get_name(dwmac->m250_div_clk); - init.parent_names = clk_div_parents; - init.num_parents = ARRAY_SIZE(clk_div_parents); - + parent_name = __clk_get_name(clk); dwmac->fixed_div2.mult = 1; dwmac->fixed_div2.div = 2; - dwmac->fixed_div2.hw.init = &init; - - dwmac->fixed_div2_clk = devm_clk_register(dev, &dwmac->fixed_div2.hw); - if (WARN_ON(IS_ERR(dwmac->fixed_div2_clk))) - return PTR_ERR(dwmac->fixed_div2_clk); - - /* create the rgmii_tx_en */ - init.name = devm_kasprintf(dev, GFP_KERNEL, "%s#rgmii_tx_en", - dev_name(dev)); - init.ops = &clk_gate_ops; - init.flags = CLK_SET_RATE_PARENT; - clk_div_parents[0] = __clk_get_name(dwmac->fixed_div2_clk); - init.parent_names = clk_div_parents; - init.num_parents = ARRAY_SIZE(clk_div_parents); + clk = meson8b_dwmac_register_clk(dwmac, "fixed_div2", &parent_name, 1, + &clk_fixed_factor_ops, + &dwmac->fixed_div2.hw); + if (WARN_ON(IS_ERR(clk))) + return PTR_ERR(clk); + parent_name = __clk_get_name(clk); dwmac->rgmii_tx_en.reg = dwmac->regs + PRG_ETH0; dwmac->rgmii_tx_en.bit_idx = PRG_ETH0_RGMII_TX_CLK_EN; - dwmac->rgmii_tx_en.hw.init = &init; + clk = meson8b_dwmac_register_clk(dwmac, "rgmii_tx_en", &parent_name, 1, + &clk_gate_ops, + &dwmac->rgmii_tx_en.hw); + if (WARN_ON(IS_ERR(clk))) + return PTR_ERR(clk); - dwmac->rgmii_tx_en_clk = devm_clk_register(dev, - &dwmac->rgmii_tx_en.hw); - if (WARN_ON(IS_ERR(dwmac->rgmii_tx_en_clk))) - return PTR_ERR(dwmac->rgmii_tx_en_clk); + dwmac->rgmii_tx_clk = clk; return 0; } @@ -219,19 +202,23 @@ static int meson8b_init_prg_eth(struct meson8b_dwmac *dwmac) * a register) based on the line-speed (125MHz for Gbit speeds, * 25MHz for 100Mbit/s and 2.5MHz for 10Mbit/s). */ - ret = clk_set_rate(dwmac->rgmii_tx_en_clk, 125 * 1000 * 1000); + ret = clk_set_rate(dwmac->rgmii_tx_clk, 125 * 1000 * 1000); if (ret) { dev_err(&dwmac->pdev->dev, "failed to set RGMII TX clock\n"); return ret; } - ret = clk_prepare_enable(dwmac->rgmii_tx_en_clk); + ret = clk_prepare_enable(dwmac->rgmii_tx_clk); if (ret) { dev_err(&dwmac->pdev->dev, "failed to enable the RGMII TX clock\n"); return ret; } + + devm_add_action_or_reset(&dwmac->pdev->dev, + (void(*)(void *))clk_disable_unprepare, + dwmac->rgmii_tx_clk); break; case PHY_INTERFACE_MODE_RMII: @@ -317,29 +304,16 @@ static int meson8b_dwmac_probe(struct platform_device *pdev) ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); if (ret) - goto err_clk_disable; + goto err_remove_config_dt; return 0; -err_clk_disable: - if (phy_interface_mode_is_rgmii(dwmac->phy_mode)) - clk_disable_unprepare(dwmac->rgmii_tx_en_clk); err_remove_config_dt: stmmac_remove_config_dt(pdev, plat_dat); return ret; } -static int meson8b_dwmac_remove(struct platform_device *pdev) -{ - struct meson8b_dwmac *dwmac = get_stmmac_bsp_priv(&pdev->dev); - - if (phy_interface_mode_is_rgmii(dwmac->phy_mode)) - clk_disable_unprepare(dwmac->rgmii_tx_en_clk); - - return stmmac_pltfr_remove(pdev); -} - static const struct of_device_id meson8b_dwmac_match[] = { { .compatible = "amlogic,meson8b-dwmac" }, { .compatible = "amlogic,meson-gxbb-dwmac" }, @@ -349,7 +323,7 @@ MODULE_DEVICE_TABLE(of, meson8b_dwmac_match); static struct platform_driver meson8b_dwmac_driver = { .probe = meson8b_dwmac_probe, - .remove = meson8b_dwmac_remove, + .remove = stmmac_pltfr_remove, .driver = { .name = "meson8b-dwmac", .pm = &stmmac_pltfr_pm_ops, -- 2.16.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [net-next PATCH v1 1/3] net: stmmac: dwmac-meson8b: simplify clock registration @ 2018-02-17 14:08 ` Martin Blumenstingl 0 siblings, 0 replies; 16+ messages in thread From: Martin Blumenstingl @ 2018-02-17 14:08 UTC (permalink / raw) To: linux-amlogic, netdev Cc: khilman, carlo, jbrunet, narmstrong, Martin Blumenstingl To goal of this patch is to simplify the registration of the RGMII TX clock (and it's parent clocks). This is achieved by: - introducing the meson8b_dwmac_register_clk helper-function to remove code duplication when registering a single clock (this saves a few lines since we have 4 clocks internally) - using devm_add_action_or_reset to disable the RGMII TX clock automatically when needed. This also allows us to re-use the standard stmmac_pltfr_remove function. - devm_kasprintf() and devm_kstrdup() are not used anymore to generate the clock name (these are replaced by a variable on the stack) because the common clock framework already uses kstrdup() internally. No functional changes intended. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 156 +++++++++------------ 1 file changed, 65 insertions(+), 91 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c index 5270d26f0bc6..84a9a900e74e 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c @@ -55,17 +55,11 @@ struct meson8b_dwmac { phy_interface_t phy_mode; struct clk_mux m250_mux; - struct clk *m250_mux_clk; - struct clk *m250_mux_parent[MUX_CLK_NUM_PARENTS]; - struct clk_divider m250_div; - struct clk *m250_div_clk; - struct clk_fixed_factor fixed_div2; - struct clk *fixed_div2_clk; - struct clk_gate rgmii_tx_en; - struct clk *rgmii_tx_en_clk; + + struct clk *rgmii_tx_clk; u32 tx_delay_ns; }; @@ -82,106 +76,95 @@ static void meson8b_dwmac_mask_bits(struct meson8b_dwmac *dwmac, u32 reg, writel(data, dwmac->regs + reg); } -static int meson8b_init_rgmii_tx_clk(struct meson8b_dwmac *dwmac) +static struct clk *meson8b_dwmac_register_clk(struct meson8b_dwmac *dwmac, + const char *name_suffix, + const char **parent_names, + int num_parents, + const struct clk_ops *ops, + struct clk_hw *hw) { + struct device *dev = &dwmac->pdev->dev; struct clk_init_data init; + char clk_name[32]; + + snprintf(clk_name, sizeof(clk_name), "%s#%s", dev_name(dev), + name_suffix); + + init.name = clk_name; + init.ops = ops; + init.flags = CLK_SET_RATE_PARENT; + init.parent_names = parent_names; + init.num_parents = num_parents; + + hw->init = &init; + + return devm_clk_register(dev, hw); +} + +static int meson8b_init_rgmii_tx_clk(struct meson8b_dwmac *dwmac) +{ int i, ret; + struct clk *clk; struct device *dev = &dwmac->pdev->dev; - char clk_name[32]; - const char *clk_div_parents[1]; - const char *mux_parent_names[MUX_CLK_NUM_PARENTS]; + const char *parent_name, *mux_parent_names[MUX_CLK_NUM_PARENTS]; /* get the mux parents from DT */ for (i = 0; i < MUX_CLK_NUM_PARENTS; i++) { char name[16]; snprintf(name, sizeof(name), "clkin%d", i); - dwmac->m250_mux_parent[i] = devm_clk_get(dev, name); - if (IS_ERR(dwmac->m250_mux_parent[i])) { - ret = PTR_ERR(dwmac->m250_mux_parent[i]); + clk = devm_clk_get(dev, name); + if (IS_ERR(clk)) { + ret = PTR_ERR(clk); if (ret != -EPROBE_DEFER) dev_err(dev, "Missing clock %s\n", name); return ret; } - mux_parent_names[i] = - __clk_get_name(dwmac->m250_mux_parent[i]); + mux_parent_names[i] = __clk_get_name(clk); } - /* create the m250_mux */ - snprintf(clk_name, sizeof(clk_name), "%s#m250_sel", dev_name(dev)); - init.name = clk_name; - init.ops = &clk_mux_ops; - init.flags = CLK_SET_RATE_PARENT; - init.parent_names = mux_parent_names; - init.num_parents = MUX_CLK_NUM_PARENTS; - dwmac->m250_mux.reg = dwmac->regs + PRG_ETH0; dwmac->m250_mux.shift = PRG_ETH0_CLK_M250_SEL_SHIFT; dwmac->m250_mux.mask = PRG_ETH0_CLK_M250_SEL_MASK; - dwmac->m250_mux.flags = 0; - dwmac->m250_mux.table = NULL; - dwmac->m250_mux.hw.init = &init; - - dwmac->m250_mux_clk = devm_clk_register(dev, &dwmac->m250_mux.hw); - if (WARN_ON(IS_ERR(dwmac->m250_mux_clk))) - return PTR_ERR(dwmac->m250_mux_clk); - - /* create the m250_div */ - 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; - 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); + clk = meson8b_dwmac_register_clk(dwmac, "m250_sel", mux_parent_names, + MUX_CLK_NUM_PARENTS, &clk_mux_ops, + &dwmac->m250_mux.hw); + if (WARN_ON(IS_ERR(clk))) + return PTR_ERR(clk); + parent_name = __clk_get_name(clk); dwmac->m250_div.reg = dwmac->regs + PRG_ETH0; dwmac->m250_div.shift = PRG_ETH0_CLK_M250_DIV_SHIFT; dwmac->m250_div.width = PRG_ETH0_CLK_M250_DIV_WIDTH; - dwmac->m250_div.hw.init = &init; dwmac->m250_div.flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO | CLK_DIVIDER_ROUND_CLOSEST; + clk = meson8b_dwmac_register_clk(dwmac, "m250_div", &parent_name, 1, + &clk_divider_ops, + &dwmac->m250_div.hw); + if (WARN_ON(IS_ERR(clk))) + return PTR_ERR(clk); - dwmac->m250_div_clk = devm_clk_register(dev, &dwmac->m250_div.hw); - if (WARN_ON(IS_ERR(dwmac->m250_div_clk))) - return PTR_ERR(dwmac->m250_div_clk); - - /* create the fixed_div2 */ - snprintf(clk_name, sizeof(clk_name), "%s#fixed_div2", dev_name(dev)); - init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); - init.ops = &clk_fixed_factor_ops; - init.flags = CLK_SET_RATE_PARENT; - clk_div_parents[0] = __clk_get_name(dwmac->m250_div_clk); - init.parent_names = clk_div_parents; - init.num_parents = ARRAY_SIZE(clk_div_parents); - + parent_name = __clk_get_name(clk); dwmac->fixed_div2.mult = 1; dwmac->fixed_div2.div = 2; - dwmac->fixed_div2.hw.init = &init; - - dwmac->fixed_div2_clk = devm_clk_register(dev, &dwmac->fixed_div2.hw); - if (WARN_ON(IS_ERR(dwmac->fixed_div2_clk))) - return PTR_ERR(dwmac->fixed_div2_clk); - - /* create the rgmii_tx_en */ - init.name = devm_kasprintf(dev, GFP_KERNEL, "%s#rgmii_tx_en", - dev_name(dev)); - init.ops = &clk_gate_ops; - init.flags = CLK_SET_RATE_PARENT; - clk_div_parents[0] = __clk_get_name(dwmac->fixed_div2_clk); - init.parent_names = clk_div_parents; - init.num_parents = ARRAY_SIZE(clk_div_parents); + clk = meson8b_dwmac_register_clk(dwmac, "fixed_div2", &parent_name, 1, + &clk_fixed_factor_ops, + &dwmac->fixed_div2.hw); + if (WARN_ON(IS_ERR(clk))) + return PTR_ERR(clk); + parent_name = __clk_get_name(clk); dwmac->rgmii_tx_en.reg = dwmac->regs + PRG_ETH0; dwmac->rgmii_tx_en.bit_idx = PRG_ETH0_RGMII_TX_CLK_EN; - dwmac->rgmii_tx_en.hw.init = &init; + clk = meson8b_dwmac_register_clk(dwmac, "rgmii_tx_en", &parent_name, 1, + &clk_gate_ops, + &dwmac->rgmii_tx_en.hw); + if (WARN_ON(IS_ERR(clk))) + return PTR_ERR(clk); - dwmac->rgmii_tx_en_clk = devm_clk_register(dev, - &dwmac->rgmii_tx_en.hw); - if (WARN_ON(IS_ERR(dwmac->rgmii_tx_en_clk))) - return PTR_ERR(dwmac->rgmii_tx_en_clk); + dwmac->rgmii_tx_clk = clk; return 0; } @@ -219,19 +202,23 @@ static int meson8b_init_prg_eth(struct meson8b_dwmac *dwmac) * a register) based on the line-speed (125MHz for Gbit speeds, * 25MHz for 100Mbit/s and 2.5MHz for 10Mbit/s). */ - ret = clk_set_rate(dwmac->rgmii_tx_en_clk, 125 * 1000 * 1000); + ret = clk_set_rate(dwmac->rgmii_tx_clk, 125 * 1000 * 1000); if (ret) { dev_err(&dwmac->pdev->dev, "failed to set RGMII TX clock\n"); return ret; } - ret = clk_prepare_enable(dwmac->rgmii_tx_en_clk); + ret = clk_prepare_enable(dwmac->rgmii_tx_clk); if (ret) { dev_err(&dwmac->pdev->dev, "failed to enable the RGMII TX clock\n"); return ret; } + + devm_add_action_or_reset(&dwmac->pdev->dev, + (void(*)(void *))clk_disable_unprepare, + dwmac->rgmii_tx_clk); break; case PHY_INTERFACE_MODE_RMII: @@ -317,29 +304,16 @@ static int meson8b_dwmac_probe(struct platform_device *pdev) ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); if (ret) - goto err_clk_disable; + goto err_remove_config_dt; return 0; -err_clk_disable: - if (phy_interface_mode_is_rgmii(dwmac->phy_mode)) - clk_disable_unprepare(dwmac->rgmii_tx_en_clk); err_remove_config_dt: stmmac_remove_config_dt(pdev, plat_dat); return ret; } -static int meson8b_dwmac_remove(struct platform_device *pdev) -{ - struct meson8b_dwmac *dwmac = get_stmmac_bsp_priv(&pdev->dev); - - if (phy_interface_mode_is_rgmii(dwmac->phy_mode)) - clk_disable_unprepare(dwmac->rgmii_tx_en_clk); - - return stmmac_pltfr_remove(pdev); -} - static const struct of_device_id meson8b_dwmac_match[] = { { .compatible = "amlogic,meson8b-dwmac" }, { .compatible = "amlogic,meson-gxbb-dwmac" }, @@ -349,7 +323,7 @@ MODULE_DEVICE_TABLE(of, meson8b_dwmac_match); static struct platform_driver meson8b_dwmac_driver = { .probe = meson8b_dwmac_probe, - .remove = meson8b_dwmac_remove, + .remove = stmmac_pltfr_remove, .driver = { .name = "meson8b-dwmac", .pm = &stmmac_pltfr_pm_ops, -- 2.16.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [net-next PATCH v1 1/3] net: stmmac: dwmac-meson8b: simplify clock registration 2018-02-17 14:08 ` Martin Blumenstingl @ 2018-02-17 16:38 ` Jerome Brunet -1 siblings, 0 replies; 16+ messages in thread From: Jerome Brunet @ 2018-02-17 16:38 UTC (permalink / raw) To: linus-amlogic On Sat, 2018-02-17 at 15:08 +0100, Martin Blumenstingl wrote: > To goal of this patch is to simplify the registration of the RGMII TX > clock (and it's parent clocks). This is achieved by: > - introducing the meson8b_dwmac_register_clk helper-function to remove > code duplication when registering a single clock (this saves a few > lines since we have 4 clocks internally) > - using devm_add_action_or_reset to disable the RGMII TX clock > automatically when needed. This also allows us to re-use the standard > stmmac_pltfr_remove function. > - devm_kasprintf() and devm_kstrdup() are not used anymore to generate > the clock name (these are replaced by a variable on the stack) because > the common clock framework already uses kstrdup() internally. > > No functional changes intended. > > Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Reviewed-by: Jerome Brunet <jbrunet@baylibre.com> ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [net-next PATCH v1 1/3] net: stmmac: dwmac-meson8b: simplify clock registration @ 2018-02-17 16:38 ` Jerome Brunet 0 siblings, 0 replies; 16+ messages in thread From: Jerome Brunet @ 2018-02-17 16:38 UTC (permalink / raw) To: Martin Blumenstingl, linux-amlogic, netdev; +Cc: khilman, carlo, narmstrong On Sat, 2018-02-17 at 15:08 +0100, Martin Blumenstingl wrote: > To goal of this patch is to simplify the registration of the RGMII TX > clock (and it's parent clocks). This is achieved by: > - introducing the meson8b_dwmac_register_clk helper-function to remove > code duplication when registering a single clock (this saves a few > lines since we have 4 clocks internally) > - using devm_add_action_or_reset to disable the RGMII TX clock > automatically when needed. This also allows us to re-use the standard > stmmac_pltfr_remove function. > - devm_kasprintf() and devm_kstrdup() are not used anymore to generate > the clock name (these are replaced by a variable on the stack) because > the common clock framework already uses kstrdup() internally. > > No functional changes intended. > > Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Reviewed-by: Jerome Brunet <jbrunet@baylibre.com> ^ permalink raw reply [flat|nested] 16+ messages in thread
* [net-next PATCH v1 2/3] net: stmmac: dwmac-meson8b: only keep struct device around 2018-02-17 14:08 ` Martin Blumenstingl @ 2018-02-17 14:08 ` Martin Blumenstingl -1 siblings, 0 replies; 16+ messages in thread From: Martin Blumenstingl @ 2018-02-17 14:08 UTC (permalink / raw) To: linus-amlogic Nothing in the dwmac-meson8b driver (except .probe itself) requires the platform_device anymore after .probe has finished. Replace it with a pointer to struct device since this is what the functions inside the driver are actually accessing. No functional changes. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c index 84a9a900e74e..0dfce35c5583 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c @@ -48,7 +48,7 @@ #define MUX_CLK_NUM_PARENTS 2 struct meson8b_dwmac { - struct platform_device *pdev; + struct device *dev; void __iomem *regs; @@ -83,11 +83,10 @@ static struct clk *meson8b_dwmac_register_clk(struct meson8b_dwmac *dwmac, const struct clk_ops *ops, struct clk_hw *hw) { - struct device *dev = &dwmac->pdev->dev; struct clk_init_data init; char clk_name[32]; - snprintf(clk_name, sizeof(clk_name), "%s#%s", dev_name(dev), + snprintf(clk_name, sizeof(clk_name), "%s#%s", dev_name(dwmac->dev), name_suffix); init.name = clk_name; @@ -98,14 +97,14 @@ static struct clk *meson8b_dwmac_register_clk(struct meson8b_dwmac *dwmac, hw->init = &init; - return devm_clk_register(dev, hw); + return devm_clk_register(dwmac->dev, hw); } static int meson8b_init_rgmii_tx_clk(struct meson8b_dwmac *dwmac) { int i, ret; struct clk *clk; - struct device *dev = &dwmac->pdev->dev; + struct device *dev = dwmac->dev; const char *parent_name, *mux_parent_names[MUX_CLK_NUM_PARENTS]; /* get the mux parents from DT */ @@ -204,19 +203,19 @@ static int meson8b_init_prg_eth(struct meson8b_dwmac *dwmac) */ ret = clk_set_rate(dwmac->rgmii_tx_clk, 125 * 1000 * 1000); if (ret) { - dev_err(&dwmac->pdev->dev, + dev_err(dwmac->dev, "failed to set RGMII TX clock\n"); return ret; } ret = clk_prepare_enable(dwmac->rgmii_tx_clk); if (ret) { - dev_err(&dwmac->pdev->dev, + dev_err(dwmac->dev, "failed to enable the RGMII TX clock\n"); return ret; } - devm_add_action_or_reset(&dwmac->pdev->dev, + devm_add_action_or_reset(dwmac->dev, (void(*)(void *))clk_disable_unprepare, dwmac->rgmii_tx_clk); break; @@ -238,7 +237,7 @@ static int meson8b_init_prg_eth(struct meson8b_dwmac *dwmac) break; default: - dev_err(&dwmac->pdev->dev, "unsupported phy-mode %s\n", + dev_err(dwmac->dev, "unsupported phy-mode %s\n", phy_modes(dwmac->phy_mode)); return -EINVAL; } @@ -279,7 +278,7 @@ static int meson8b_dwmac_probe(struct platform_device *pdev) goto err_remove_config_dt; } - dwmac->pdev = pdev; + dwmac->dev = &pdev->dev; dwmac->phy_mode = of_get_phy_mode(pdev->dev.of_node); if (dwmac->phy_mode < 0) { dev_err(&pdev->dev, "missing phy-mode property\n"); -- 2.16.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [net-next PATCH v1 2/3] net: stmmac: dwmac-meson8b: only keep struct device around @ 2018-02-17 14:08 ` Martin Blumenstingl 0 siblings, 0 replies; 16+ messages in thread From: Martin Blumenstingl @ 2018-02-17 14:08 UTC (permalink / raw) To: linux-amlogic, netdev Cc: khilman, carlo, jbrunet, narmstrong, Martin Blumenstingl Nothing in the dwmac-meson8b driver (except .probe itself) requires the platform_device anymore after .probe has finished. Replace it with a pointer to struct device since this is what the functions inside the driver are actually accessing. No functional changes. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c index 84a9a900e74e..0dfce35c5583 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c @@ -48,7 +48,7 @@ #define MUX_CLK_NUM_PARENTS 2 struct meson8b_dwmac { - struct platform_device *pdev; + struct device *dev; void __iomem *regs; @@ -83,11 +83,10 @@ static struct clk *meson8b_dwmac_register_clk(struct meson8b_dwmac *dwmac, const struct clk_ops *ops, struct clk_hw *hw) { - struct device *dev = &dwmac->pdev->dev; struct clk_init_data init; char clk_name[32]; - snprintf(clk_name, sizeof(clk_name), "%s#%s", dev_name(dev), + snprintf(clk_name, sizeof(clk_name), "%s#%s", dev_name(dwmac->dev), name_suffix); init.name = clk_name; @@ -98,14 +97,14 @@ static struct clk *meson8b_dwmac_register_clk(struct meson8b_dwmac *dwmac, hw->init = &init; - return devm_clk_register(dev, hw); + return devm_clk_register(dwmac->dev, hw); } static int meson8b_init_rgmii_tx_clk(struct meson8b_dwmac *dwmac) { int i, ret; struct clk *clk; - struct device *dev = &dwmac->pdev->dev; + struct device *dev = dwmac->dev; const char *parent_name, *mux_parent_names[MUX_CLK_NUM_PARENTS]; /* get the mux parents from DT */ @@ -204,19 +203,19 @@ static int meson8b_init_prg_eth(struct meson8b_dwmac *dwmac) */ ret = clk_set_rate(dwmac->rgmii_tx_clk, 125 * 1000 * 1000); if (ret) { - dev_err(&dwmac->pdev->dev, + dev_err(dwmac->dev, "failed to set RGMII TX clock\n"); return ret; } ret = clk_prepare_enable(dwmac->rgmii_tx_clk); if (ret) { - dev_err(&dwmac->pdev->dev, + dev_err(dwmac->dev, "failed to enable the RGMII TX clock\n"); return ret; } - devm_add_action_or_reset(&dwmac->pdev->dev, + devm_add_action_or_reset(dwmac->dev, (void(*)(void *))clk_disable_unprepare, dwmac->rgmii_tx_clk); break; @@ -238,7 +237,7 @@ static int meson8b_init_prg_eth(struct meson8b_dwmac *dwmac) break; default: - dev_err(&dwmac->pdev->dev, "unsupported phy-mode %s\n", + dev_err(dwmac->dev, "unsupported phy-mode %s\n", phy_modes(dwmac->phy_mode)); return -EINVAL; } @@ -279,7 +278,7 @@ static int meson8b_dwmac_probe(struct platform_device *pdev) goto err_remove_config_dt; } - dwmac->pdev = pdev; + dwmac->dev = &pdev->dev; dwmac->phy_mode = of_get_phy_mode(pdev->dev.of_node); if (dwmac->phy_mode < 0) { dev_err(&pdev->dev, "missing phy-mode property\n"); -- 2.16.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [net-next PATCH v1 3/3] net: stmmac: dwmac-meson8b: make the clock configurations private 2018-02-17 14:08 ` Martin Blumenstingl @ 2018-02-17 14:08 ` Martin Blumenstingl -1 siblings, 0 replies; 16+ messages in thread From: Martin Blumenstingl @ 2018-02-17 14:08 UTC (permalink / raw) To: linus-amlogic The common clock framework needs access to the "clock configuration" structs during runtime. However, only the common clock framework should access these. Ensure this by moving the configuration structs out of struct meson8b_dwmac, so only meson8b_init_rgmii_tx_clk() and the common clock framework know about these configurations. Suggested-by: Jerome Brunet <jbrunet@baylibre.com> Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 45 ++++++++++++---------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c index 0dfce35c5583..2d5d4aea3bcb 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c @@ -49,19 +49,17 @@ struct meson8b_dwmac { struct device *dev; - void __iomem *regs; - phy_interface_t phy_mode; + struct clk *rgmii_tx_clk; + u32 tx_delay_ns; +}; +struct meson8b_dwmac_clk_configs { struct clk_mux m250_mux; struct clk_divider m250_div; struct clk_fixed_factor fixed_div2; struct clk_gate rgmii_tx_en; - - struct clk *rgmii_tx_clk; - - u32 tx_delay_ns; }; static void meson8b_dwmac_mask_bits(struct meson8b_dwmac *dwmac, u32 reg, @@ -106,6 +104,11 @@ static int meson8b_init_rgmii_tx_clk(struct meson8b_dwmac *dwmac) struct clk *clk; struct device *dev = dwmac->dev; const char *parent_name, *mux_parent_names[MUX_CLK_NUM_PARENTS]; + struct meson8b_dwmac_clk_configs *clk_configs; + + clk_configs = devm_kzalloc(dev, sizeof(*clk_configs), GFP_KERNEL); + if (!clk_configs) + return -ENOMEM; /* get the mux parents from DT */ for (i = 0; i < MUX_CLK_NUM_PARENTS; i++) { @@ -123,43 +126,43 @@ static int meson8b_init_rgmii_tx_clk(struct meson8b_dwmac *dwmac) mux_parent_names[i] = __clk_get_name(clk); } - dwmac->m250_mux.reg = dwmac->regs + PRG_ETH0; - dwmac->m250_mux.shift = PRG_ETH0_CLK_M250_SEL_SHIFT; - dwmac->m250_mux.mask = PRG_ETH0_CLK_M250_SEL_MASK; + clk_configs->m250_mux.reg = dwmac->regs + PRG_ETH0; + clk_configs->m250_mux.shift = PRG_ETH0_CLK_M250_SEL_SHIFT; + clk_configs->m250_mux.mask = PRG_ETH0_CLK_M250_SEL_MASK; clk = meson8b_dwmac_register_clk(dwmac, "m250_sel", mux_parent_names, MUX_CLK_NUM_PARENTS, &clk_mux_ops, - &dwmac->m250_mux.hw); + &clk_configs->m250_mux.hw); if (WARN_ON(IS_ERR(clk))) return PTR_ERR(clk); parent_name = __clk_get_name(clk); - dwmac->m250_div.reg = dwmac->regs + PRG_ETH0; - dwmac->m250_div.shift = PRG_ETH0_CLK_M250_DIV_SHIFT; - dwmac->m250_div.width = PRG_ETH0_CLK_M250_DIV_WIDTH; - dwmac->m250_div.flags = CLK_DIVIDER_ONE_BASED | + clk_configs->m250_div.reg = dwmac->regs + PRG_ETH0; + clk_configs->m250_div.shift = PRG_ETH0_CLK_M250_DIV_SHIFT; + clk_configs->m250_div.width = PRG_ETH0_CLK_M250_DIV_WIDTH; + clk_configs->m250_div.flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO | CLK_DIVIDER_ROUND_CLOSEST; clk = meson8b_dwmac_register_clk(dwmac, "m250_div", &parent_name, 1, &clk_divider_ops, - &dwmac->m250_div.hw); + &clk_configs->m250_div.hw); if (WARN_ON(IS_ERR(clk))) return PTR_ERR(clk); parent_name = __clk_get_name(clk); - dwmac->fixed_div2.mult = 1; - dwmac->fixed_div2.div = 2; + clk_configs->fixed_div2.mult = 1; + clk_configs->fixed_div2.div = 2; clk = meson8b_dwmac_register_clk(dwmac, "fixed_div2", &parent_name, 1, &clk_fixed_factor_ops, - &dwmac->fixed_div2.hw); + &clk_configs->fixed_div2.hw); if (WARN_ON(IS_ERR(clk))) return PTR_ERR(clk); parent_name = __clk_get_name(clk); - dwmac->rgmii_tx_en.reg = dwmac->regs + PRG_ETH0; - dwmac->rgmii_tx_en.bit_idx = PRG_ETH0_RGMII_TX_CLK_EN; + clk_configs->rgmii_tx_en.reg = dwmac->regs + PRG_ETH0; + clk_configs->rgmii_tx_en.bit_idx = PRG_ETH0_RGMII_TX_CLK_EN; clk = meson8b_dwmac_register_clk(dwmac, "rgmii_tx_en", &parent_name, 1, &clk_gate_ops, - &dwmac->rgmii_tx_en.hw); + &clk_configs->rgmii_tx_en.hw); if (WARN_ON(IS_ERR(clk))) return PTR_ERR(clk); -- 2.16.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [net-next PATCH v1 3/3] net: stmmac: dwmac-meson8b: make the clock configurations private @ 2018-02-17 14:08 ` Martin Blumenstingl 0 siblings, 0 replies; 16+ messages in thread From: Martin Blumenstingl @ 2018-02-17 14:08 UTC (permalink / raw) To: linux-amlogic, netdev Cc: khilman, carlo, jbrunet, narmstrong, Martin Blumenstingl The common clock framework needs access to the "clock configuration" structs during runtime. However, only the common clock framework should access these. Ensure this by moving the configuration structs out of struct meson8b_dwmac, so only meson8b_init_rgmii_tx_clk() and the common clock framework know about these configurations. Suggested-by: Jerome Brunet <jbrunet@baylibre.com> Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 45 ++++++++++++---------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c index 0dfce35c5583..2d5d4aea3bcb 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c @@ -49,19 +49,17 @@ struct meson8b_dwmac { struct device *dev; - void __iomem *regs; - phy_interface_t phy_mode; + struct clk *rgmii_tx_clk; + u32 tx_delay_ns; +}; +struct meson8b_dwmac_clk_configs { struct clk_mux m250_mux; struct clk_divider m250_div; struct clk_fixed_factor fixed_div2; struct clk_gate rgmii_tx_en; - - struct clk *rgmii_tx_clk; - - u32 tx_delay_ns; }; static void meson8b_dwmac_mask_bits(struct meson8b_dwmac *dwmac, u32 reg, @@ -106,6 +104,11 @@ static int meson8b_init_rgmii_tx_clk(struct meson8b_dwmac *dwmac) struct clk *clk; struct device *dev = dwmac->dev; const char *parent_name, *mux_parent_names[MUX_CLK_NUM_PARENTS]; + struct meson8b_dwmac_clk_configs *clk_configs; + + clk_configs = devm_kzalloc(dev, sizeof(*clk_configs), GFP_KERNEL); + if (!clk_configs) + return -ENOMEM; /* get the mux parents from DT */ for (i = 0; i < MUX_CLK_NUM_PARENTS; i++) { @@ -123,43 +126,43 @@ static int meson8b_init_rgmii_tx_clk(struct meson8b_dwmac *dwmac) mux_parent_names[i] = __clk_get_name(clk); } - dwmac->m250_mux.reg = dwmac->regs + PRG_ETH0; - dwmac->m250_mux.shift = PRG_ETH0_CLK_M250_SEL_SHIFT; - dwmac->m250_mux.mask = PRG_ETH0_CLK_M250_SEL_MASK; + clk_configs->m250_mux.reg = dwmac->regs + PRG_ETH0; + clk_configs->m250_mux.shift = PRG_ETH0_CLK_M250_SEL_SHIFT; + clk_configs->m250_mux.mask = PRG_ETH0_CLK_M250_SEL_MASK; clk = meson8b_dwmac_register_clk(dwmac, "m250_sel", mux_parent_names, MUX_CLK_NUM_PARENTS, &clk_mux_ops, - &dwmac->m250_mux.hw); + &clk_configs->m250_mux.hw); if (WARN_ON(IS_ERR(clk))) return PTR_ERR(clk); parent_name = __clk_get_name(clk); - dwmac->m250_div.reg = dwmac->regs + PRG_ETH0; - dwmac->m250_div.shift = PRG_ETH0_CLK_M250_DIV_SHIFT; - dwmac->m250_div.width = PRG_ETH0_CLK_M250_DIV_WIDTH; - dwmac->m250_div.flags = CLK_DIVIDER_ONE_BASED | + clk_configs->m250_div.reg = dwmac->regs + PRG_ETH0; + clk_configs->m250_div.shift = PRG_ETH0_CLK_M250_DIV_SHIFT; + clk_configs->m250_div.width = PRG_ETH0_CLK_M250_DIV_WIDTH; + clk_configs->m250_div.flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO | CLK_DIVIDER_ROUND_CLOSEST; clk = meson8b_dwmac_register_clk(dwmac, "m250_div", &parent_name, 1, &clk_divider_ops, - &dwmac->m250_div.hw); + &clk_configs->m250_div.hw); if (WARN_ON(IS_ERR(clk))) return PTR_ERR(clk); parent_name = __clk_get_name(clk); - dwmac->fixed_div2.mult = 1; - dwmac->fixed_div2.div = 2; + clk_configs->fixed_div2.mult = 1; + clk_configs->fixed_div2.div = 2; clk = meson8b_dwmac_register_clk(dwmac, "fixed_div2", &parent_name, 1, &clk_fixed_factor_ops, - &dwmac->fixed_div2.hw); + &clk_configs->fixed_div2.hw); if (WARN_ON(IS_ERR(clk))) return PTR_ERR(clk); parent_name = __clk_get_name(clk); - dwmac->rgmii_tx_en.reg = dwmac->regs + PRG_ETH0; - dwmac->rgmii_tx_en.bit_idx = PRG_ETH0_RGMII_TX_CLK_EN; + clk_configs->rgmii_tx_en.reg = dwmac->regs + PRG_ETH0; + clk_configs->rgmii_tx_en.bit_idx = PRG_ETH0_RGMII_TX_CLK_EN; clk = meson8b_dwmac_register_clk(dwmac, "rgmii_tx_en", &parent_name, 1, &clk_gate_ops, - &dwmac->rgmii_tx_en.hw); + &clk_configs->rgmii_tx_en.hw); if (WARN_ON(IS_ERR(clk))) return PTR_ERR(clk); -- 2.16.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [net-next PATCH v1 3/3] net: stmmac: dwmac-meson8b: make the clock configurations private 2018-02-17 14:08 ` Martin Blumenstingl @ 2018-02-17 16:41 ` Jerome Brunet -1 siblings, 0 replies; 16+ messages in thread From: Jerome Brunet @ 2018-02-17 16:41 UTC (permalink / raw) To: linus-amlogic On Sat, 2018-02-17 at 15:08 +0100, Martin Blumenstingl wrote: > The common clock framework needs access to the "clock configuration" > structs during runtime. > However, only the common clock framework should access these. Ensure > this by moving the configuration structs out of struct meson8b_dwmac, > so only meson8b_init_rgmii_tx_clk() and the common clock framework know > about these configurations. > > Suggested-by: Jerome Brunet <jbrunet@baylibre.com> > Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Acked-by: Jerome Brunet <jbrunet@baylibre.com> > --- > .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 45 ++++++++++++---------- > 1 file changed, 24 insertions(+), 21 deletions(-) > > diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c > index 0dfce35c5583..2d5d4aea3bcb 100644 > --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c > +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c > @@ -49,19 +49,17 @@ > > struct meson8b_dwmac { > struct device *dev; > - > void __iomem *regs; > - > phy_interface_t phy_mode; > + struct clk *rgmii_tx_clk; > + u32 tx_delay_ns; > +}; > > +struct meson8b_dwmac_clk_configs { Not too sure we needed a struct for this, but it does work and does not matter much > struct clk_mux m250_mux; > struct clk_divider m250_div; > struct clk_fixed_factor fixed_div2; > struct clk_gate rgmii_tx_en; > - > - struct clk *rgmii_tx_clk; > - > - u32 tx_delay_ns; > }; ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [net-next PATCH v1 3/3] net: stmmac: dwmac-meson8b: make the clock configurations private @ 2018-02-17 16:41 ` Jerome Brunet 0 siblings, 0 replies; 16+ messages in thread From: Jerome Brunet @ 2018-02-17 16:41 UTC (permalink / raw) To: Martin Blumenstingl, linux-amlogic, netdev; +Cc: khilman, carlo, narmstrong On Sat, 2018-02-17 at 15:08 +0100, Martin Blumenstingl wrote: > The common clock framework needs access to the "clock configuration" > structs during runtime. > However, only the common clock framework should access these. Ensure > this by moving the configuration structs out of struct meson8b_dwmac, > so only meson8b_init_rgmii_tx_clk() and the common clock framework know > about these configurations. > > Suggested-by: Jerome Brunet <jbrunet@baylibre.com> > Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Acked-by: Jerome Brunet <jbrunet@baylibre.com> > --- > .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 45 ++++++++++++---------- > 1 file changed, 24 insertions(+), 21 deletions(-) > > diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c > index 0dfce35c5583..2d5d4aea3bcb 100644 > --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c > +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c > @@ -49,19 +49,17 @@ > > struct meson8b_dwmac { > struct device *dev; > - > void __iomem *regs; > - > phy_interface_t phy_mode; > + struct clk *rgmii_tx_clk; > + u32 tx_delay_ns; > +}; > > +struct meson8b_dwmac_clk_configs { Not too sure we needed a struct for this, but it does work and does not matter much > struct clk_mux m250_mux; > struct clk_divider m250_div; > struct clk_fixed_factor fixed_div2; > struct clk_gate rgmii_tx_en; > - > - struct clk *rgmii_tx_clk; > - > - u32 tx_delay_ns; > }; ^ permalink raw reply [flat|nested] 16+ messages in thread
* [net-next PATCH v1 3/3] net: stmmac: dwmac-meson8b: make the clock configurations private 2018-02-17 16:41 ` Jerome Brunet @ 2018-02-17 17:42 ` Martin Blumenstingl -1 siblings, 0 replies; 16+ messages in thread From: Martin Blumenstingl @ 2018-02-17 17:42 UTC (permalink / raw) To: linus-amlogic Hi Jerome, On Sat, Feb 17, 2018 at 5:41 PM, Jerome Brunet <jbrunet@baylibre.com> wrote: > On Sat, 2018-02-17 at 15:08 +0100, Martin Blumenstingl wrote: >> The common clock framework needs access to the "clock configuration" >> structs during runtime. >> However, only the common clock framework should access these. Ensure >> this by moving the configuration structs out of struct meson8b_dwmac, >> so only meson8b_init_rgmii_tx_clk() and the common clock framework know >> about these configurations. >> >> Suggested-by: Jerome Brunet <jbrunet@baylibre.com> >> Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> > > Acked-by: Jerome Brunet <jbrunet@baylibre.com> thank you reviewing this! >> --- >> .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 45 ++++++++++++---------- >> 1 file changed, 24 insertions(+), 21 deletions(-) >> >> diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c >> index 0dfce35c5583..2d5d4aea3bcb 100644 >> --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c >> +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c >> @@ -49,19 +49,17 @@ >> >> struct meson8b_dwmac { >> struct device *dev; >> - >> void __iomem *regs; >> - >> phy_interface_t phy_mode; >> + struct clk *rgmii_tx_clk; >> + u32 tx_delay_ns; >> +}; >> >> +struct meson8b_dwmac_clk_configs { > > Not too sure we needed a struct for this, but it does work and does not matter > much I tried it without this struct: this resulted in even more code because every struct clk_* would have to be devm_kzalloc()'ed, along with a "if (!result) return -ENOMEM" (which makes it 3 lines per struct clk_*) either way: it's still an improvement as per commit message >> struct clk_mux m250_mux; >> struct clk_divider m250_div; >> struct clk_fixed_factor fixed_div2; >> struct clk_gate rgmii_tx_en; >> - >> - struct clk *rgmii_tx_clk; >> - >> - u32 tx_delay_ns; >> }; > Regards Martin ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [net-next PATCH v1 3/3] net: stmmac: dwmac-meson8b: make the clock configurations private @ 2018-02-17 17:42 ` Martin Blumenstingl 0 siblings, 0 replies; 16+ messages in thread From: Martin Blumenstingl @ 2018-02-17 17:42 UTC (permalink / raw) To: Jerome Brunet; +Cc: linux-amlogic, netdev, khilman, carlo, Neil Armstrong Hi Jerome, On Sat, Feb 17, 2018 at 5:41 PM, Jerome Brunet <jbrunet@baylibre.com> wrote: > On Sat, 2018-02-17 at 15:08 +0100, Martin Blumenstingl wrote: >> The common clock framework needs access to the "clock configuration" >> structs during runtime. >> However, only the common clock framework should access these. Ensure >> this by moving the configuration structs out of struct meson8b_dwmac, >> so only meson8b_init_rgmii_tx_clk() and the common clock framework know >> about these configurations. >> >> Suggested-by: Jerome Brunet <jbrunet@baylibre.com> >> Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> > > Acked-by: Jerome Brunet <jbrunet@baylibre.com> thank you reviewing this! >> --- >> .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 45 ++++++++++++---------- >> 1 file changed, 24 insertions(+), 21 deletions(-) >> >> diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c >> index 0dfce35c5583..2d5d4aea3bcb 100644 >> --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c >> +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c >> @@ -49,19 +49,17 @@ >> >> struct meson8b_dwmac { >> struct device *dev; >> - >> void __iomem *regs; >> - >> phy_interface_t phy_mode; >> + struct clk *rgmii_tx_clk; >> + u32 tx_delay_ns; >> +}; >> >> +struct meson8b_dwmac_clk_configs { > > Not too sure we needed a struct for this, but it does work and does not matter > much I tried it without this struct: this resulted in even more code because every struct clk_* would have to be devm_kzalloc()'ed, along with a "if (!result) return -ENOMEM" (which makes it 3 lines per struct clk_*) either way: it's still an improvement as per commit message >> struct clk_mux m250_mux; >> struct clk_divider m250_div; >> struct clk_fixed_factor fixed_div2; >> struct clk_gate rgmii_tx_en; >> - >> - struct clk *rgmii_tx_clk; >> - >> - u32 tx_delay_ns; >> }; > Regards Martin ^ permalink raw reply [flat|nested] 16+ messages in thread
* [net-next PATCH v1 0/3] dwmac-meson8b: small cleanup 2018-02-17 14:08 ` Martin Blumenstingl @ 2018-02-19 16:27 ` David Miller -1 siblings, 0 replies; 16+ messages in thread From: David Miller @ 2018-02-19 16:27 UTC (permalink / raw) To: linus-amlogic From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Date: Sat, 17 Feb 2018 15:08:17 +0100 > This is a follow-up to my previous series "dwmac-meson8b: clock fixes for > Meson8b" from [0]. > during the review of that series it was found that the clock registration > could be simplified. now that the previous series has landed we can start > cleaning up the clock registration. > > the goal of this series is to simplify the code in the dwmac-meson8b > driver. no functional changes are intended. > > I have tested this on my Khadas VIM2 (GXM SoC, with RGMII PHY) and my > Endless Mini (EC-100, Meson8b SoC with RMII PHY, .dts support is not part > of mainline yet). no problems were found. > > > [0] http://lists.infradead.org/pipermail/linux-amlogic/2018-January/006143.html Series applied, thank you very much. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [net-next PATCH v1 0/3] dwmac-meson8b: small cleanup @ 2018-02-19 16:27 ` David Miller 0 siblings, 0 replies; 16+ messages in thread From: David Miller @ 2018-02-19 16:27 UTC (permalink / raw) To: martin.blumenstingl Cc: linux-amlogic, netdev, khilman, carlo, jbrunet, narmstrong From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Date: Sat, 17 Feb 2018 15:08:17 +0100 > This is a follow-up to my previous series "dwmac-meson8b: clock fixes for > Meson8b" from [0]. > during the review of that series it was found that the clock registration > could be simplified. now that the previous series has landed we can start > cleaning up the clock registration. > > the goal of this series is to simplify the code in the dwmac-meson8b > driver. no functional changes are intended. > > I have tested this on my Khadas VIM2 (GXM SoC, with RGMII PHY) and my > Endless Mini (EC-100, Meson8b SoC with RMII PHY, .dts support is not part > of mainline yet). no problems were found. > > > [0] http://lists.infradead.org/pipermail/linux-amlogic/2018-January/006143.html Series applied, thank you very much. ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2018-02-19 16:27 UTC | newest] Thread overview: 16+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-02-17 14:08 [net-next PATCH v1 0/3] dwmac-meson8b: small cleanup Martin Blumenstingl 2018-02-17 14:08 ` Martin Blumenstingl 2018-02-17 14:08 ` [net-next PATCH v1 1/3] net: stmmac: dwmac-meson8b: simplify clock registration Martin Blumenstingl 2018-02-17 14:08 ` Martin Blumenstingl 2018-02-17 16:38 ` Jerome Brunet 2018-02-17 16:38 ` Jerome Brunet 2018-02-17 14:08 ` [net-next PATCH v1 2/3] net: stmmac: dwmac-meson8b: only keep struct device around Martin Blumenstingl 2018-02-17 14:08 ` Martin Blumenstingl 2018-02-17 14:08 ` [net-next PATCH v1 3/3] net: stmmac: dwmac-meson8b: make the clock configurations private Martin Blumenstingl 2018-02-17 14:08 ` Martin Blumenstingl 2018-02-17 16:41 ` Jerome Brunet 2018-02-17 16:41 ` Jerome Brunet 2018-02-17 17:42 ` Martin Blumenstingl 2018-02-17 17:42 ` Martin Blumenstingl 2018-02-19 16:27 ` [net-next PATCH v1 0/3] dwmac-meson8b: small cleanup David Miller 2018-02-19 16:27 ` David Miller
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.