Signed-off-by: Russell King (Oracle) --- .../net/ethernet/stmicro/stmmac/dwmac-rk.c | 169 ++++-------------- 1 file changed, 34 insertions(+), 135 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c index a77ce36e0da6..c26bd22658c6 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c @@ -140,43 +140,6 @@ static u32 rk_encode_wm16(u16 val, u16 mask) return reg_val; } -static int rk_set_reg_speed(struct rk_priv_data *bsp_priv, - phy_interface_t interface, int speed) -{ - struct regmap *regmap; - unsigned int val; - int ret; - - if (phy_interface_mode_is_rgmii(interface)) { - ret = rk_gmac_rgmii_clk_div(speed); - if (ret < 0) - return ret; - - val = rk_encode_wm16(ret, bsp_priv->gmii_clk_sel_mask); - } else if (interface == PHY_INTERFACE_MODE_RMII) { - val = rk_encode_wm16(speed == SPEED_100, - bsp_priv->mac_speed_mask) | - rk_encode_wm16(speed == SPEED_100, - bsp_priv->rmii_clk_sel_mask); - } else { - /* This should never happen, as .get_interfaces() limits - * the interface modes that are supported to RGMII and/or - * RMII. - */ - return -EINVAL; - } - - if (bsp_priv->ops->speed_reg_php_grf) - regmap = bsp_priv->php_grf; - else - regmap = bsp_priv->grf; - - regmap_write(regmap, bsp_priv->speed_grf_reg, val); - - return 0; - -} - static int rk_set_clk_mac_speed(struct rk_priv_data *bsp_priv, phy_interface_t interface, int speed) { @@ -347,16 +310,9 @@ static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv) { } -static int rk3128_set_speed(struct rk_priv_data *bsp_priv, - phy_interface_t interface, int speed) -{ - return rk_set_reg_speed(bsp_priv, interface, speed); -} - static const struct rk_gmac_ops rk3128_ops = { .set_to_rgmii = rk3128_set_to_rgmii, .set_to_rmii = rk3128_set_to_rmii, - .set_speed = rk3128_set_speed, .phy_intf_sel_grf_reg = RK3128_GRF_MAC_CON1, .phy_intf_sel_mask = GENMASK_U16(8, 6), @@ -405,12 +361,6 @@ static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv) regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1, GRF_BIT(11)); } -static int rk3228_set_speed(struct rk_priv_data *bsp_priv, - phy_interface_t interface, int speed) -{ - return rk_set_reg_speed(bsp_priv, interface, speed); -} - static void rk3228_integrated_phy_powerup(struct rk_priv_data *priv) { regmap_write(priv->grf, RK3228_GRF_CON_MUX, @@ -422,7 +372,6 @@ static void rk3228_integrated_phy_powerup(struct rk_priv_data *priv) static const struct rk_gmac_ops rk3228_ops = { .set_to_rgmii = rk3228_set_to_rgmii, .set_to_rmii = rk3228_set_to_rmii, - .set_speed = rk3228_set_speed, .integrated_phy_powerup = rk3228_integrated_phy_powerup, .integrated_phy_powerdown = rk_gmac_integrated_ephy_powerdown, @@ -464,16 +413,9 @@ static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv) { } -static int rk3288_set_speed(struct rk_priv_data *bsp_priv, - phy_interface_t interface, int speed) -{ - return rk_set_reg_speed(bsp_priv, interface, speed); -} - static const struct rk_gmac_ops rk3288_ops = { .set_to_rgmii = rk3288_set_to_rgmii, .set_to_rmii = rk3288_set_to_rmii, - .set_speed = rk3288_set_speed, .phy_intf_sel_grf_reg = RK3288_GRF_SOC_CON1, .phy_intf_sel_mask = GENMASK_U16(8, 6), @@ -495,19 +437,8 @@ static void rk3308_set_to_rmii(struct rk_priv_data *bsp_priv) { } -static const struct rk_reg_speed_data rk3308_reg_speed_data = { -}; - -static int rk3308_set_speed(struct rk_priv_data *bsp_priv, - phy_interface_t interface, int speed) -{ - return rk_set_reg_speed(bsp_priv, &rk3308_reg_speed_data, - interface, speed); -} - static const struct rk_gmac_ops rk3308_ops = { .set_to_rmii = rk3308_set_to_rmii, - .set_speed = rk3308_set_speed, .phy_intf_sel_grf_reg = RK3308_GRF_MAC_CON0, .phy_intf_sel_mask = GENMASK_U16(4, 2), @@ -569,12 +500,6 @@ static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv) { } -static int rk3328_set_speed(struct rk_priv_data *bsp_priv, - phy_interface_t interface, int speed) -{ - return rk_set_reg_speed(bsp_priv, interface, speed); -} - static void rk3328_integrated_phy_powerup(struct rk_priv_data *priv) { regmap_write(priv->grf, RK3328_GRF_MACPHY_CON1, @@ -587,7 +512,6 @@ static const struct rk_gmac_ops rk3328_ops = { .init = rk3328_init, .set_to_rgmii = rk3328_set_to_rgmii, .set_to_rmii = rk3328_set_to_rmii, - .set_speed = rk3328_set_speed, .integrated_phy_powerup = rk3328_integrated_phy_powerup, .integrated_phy_powerdown = rk_gmac_integrated_ephy_powerdown, @@ -633,16 +557,9 @@ static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv) { } -static int rk3366_set_speed(struct rk_priv_data *bsp_priv, - phy_interface_t interface, int speed) -{ - return rk_set_reg_speed(bsp_priv, interface, speed); -} - static const struct rk_gmac_ops rk3366_ops = { .set_to_rgmii = rk3366_set_to_rgmii, .set_to_rmii = rk3366_set_to_rmii, - .set_speed = rk3366_set_speed, .phy_intf_sel_grf_reg = RK3366_GRF_SOC_CON6, .phy_intf_sel_mask = GENMASK_U16(11, 9), @@ -682,16 +599,9 @@ static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv) { } -static int rk3368_set_speed(struct rk_priv_data *bsp_priv, - phy_interface_t interface, int speed) -{ - return rk_set_reg_speed(bsp_priv, interface, speed); -} - static const struct rk_gmac_ops rk3368_ops = { .set_to_rgmii = rk3368_set_to_rgmii, .set_to_rmii = rk3368_set_to_rmii, - .set_speed = rk3368_set_speed, .phy_intf_sel_grf_reg = RK3368_GRF_SOC_CON15, .phy_intf_sel_mask = GENMASK_U16(11, 9), @@ -731,16 +641,9 @@ static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv) { } -static int rk3399_set_speed(struct rk_priv_data *bsp_priv, - phy_interface_t interface, int speed) -{ - return rk_set_reg_speed(bsp_priv, interface, speed); -} - static const struct rk_gmac_ops rk3399_ops = { .set_to_rgmii = rk3399_set_to_rgmii, .set_to_rmii = rk3399_set_to_rmii, - .set_speed = rk3399_set_speed, .phy_intf_sel_grf_reg = RK3399_GRF_SOC_CON5, .phy_intf_sel_mask = GENMASK_U16(11, 9), @@ -787,12 +690,6 @@ static void rk3506_set_to_rmii(struct rk_priv_data *bsp_priv) regmap_write(bsp_priv->grf, offset, RK3506_GMAC_RMII_MODE); } -static int rk3506_set_speed(struct rk_priv_data *bsp_priv, - phy_interface_t interface, int speed) -{ - return rk_set_reg_speed(bsp_priv, interface, speed); -} - static void rk3506_set_clock_selection(struct rk_priv_data *bsp_priv, bool input, bool enable) { @@ -810,7 +707,6 @@ static void rk3506_set_clock_selection(struct rk_priv_data *bsp_priv, static const struct rk_gmac_ops rk3506_ops = { .init = rk3506_init, .set_to_rmii = rk3506_set_to_rmii, - .set_speed = rk3506_set_speed, .set_clock_selection = rk3506_set_clock_selection, .rmii_clk_sel_mask = BIT_U16(3), @@ -893,12 +789,6 @@ static void rk3528_set_to_rmii(struct rk_priv_data *bsp_priv) RK3528_GMAC0_CLK_RMII_DIV2); } -static int rk3528_set_speed(struct rk_priv_data *bsp_priv, - phy_interface_t interface, int speed) -{ - return rk_set_reg_speed(bsp_priv, interface, speed); -} - static void rk3528_set_clock_selection(struct rk_priv_data *bsp_priv, bool input, bool enable) { @@ -931,7 +821,6 @@ static const struct rk_gmac_ops rk3528_ops = { .init = rk3528_init, .set_to_rgmii = rk3528_set_to_rgmii, .set_to_rmii = rk3528_set_to_rmii, - .set_speed = rk3528_set_speed, .set_clock_selection = rk3528_set_clock_selection, .integrated_phy_powerup = rk3528_integrated_phy_powerup, .integrated_phy_powerdown = rk3528_integrated_phy_powerdown, @@ -1084,12 +973,6 @@ static void rk3576_set_to_rmii(struct rk_priv_data *bsp_priv) { } -static int rk3576_set_gmac_speed(struct rk_priv_data *bsp_priv, - phy_interface_t interface, int speed) -{ - return rk_set_reg_speed(bsp_priv, interface, speed); -} - static void rk3576_set_clock_selection(struct rk_priv_data *bsp_priv, bool input, bool enable) { @@ -1110,7 +993,6 @@ static const struct rk_gmac_ops rk3576_ops = { .init = rk3576_init, .set_to_rgmii = rk3576_set_to_rgmii, .set_to_rmii = rk3576_set_to_rmii, - .set_speed = rk3576_set_gmac_speed, .set_clock_selection = rk3576_set_clock_selection, .rmii_mode_mask = BIT_U16(3), @@ -1199,12 +1081,6 @@ static void rk3588_set_to_rmii(struct rk_priv_data *bsp_priv) RK3588_GMAC_CLK_RMII_MODE(bsp_priv->id)); } -static int rk3588_set_gmac_speed(struct rk_priv_data *bsp_priv, - phy_interface_t interface, int speed) -{ - return rk_set_reg_speed(bsp_priv, interface, speed); -} - static void rk3588_set_clock_selection(struct rk_priv_data *bsp_priv, bool input, bool enable) { @@ -1221,7 +1097,6 @@ static const struct rk_gmac_ops rk3588_ops = { .init = rk3588_init, .set_to_rgmii = rk3588_set_to_rgmii, .set_to_rmii = rk3588_set_to_rmii, - .set_speed = rk3588_set_gmac_speed, .set_clock_selection = rk3588_set_clock_selection, .phy_intf_sel_grf_reg = RK3588_GRF_GMAC_CON0, @@ -1248,15 +1123,8 @@ static void rv1108_set_to_rmii(struct rk_priv_data *bsp_priv) { } -static int rv1108_set_speed(struct rk_priv_data *bsp_priv, - phy_interface_t interface, int speed) -{ - return rk_set_reg_speed(bsp_priv, interface, speed); -} - static const struct rk_gmac_ops rv1108_ops = { .set_to_rmii = rv1108_set_to_rmii, - .set_speed = rv1108_set_speed, .phy_intf_sel_grf_reg = RV1108_GRF_GMAC_CON0, .phy_intf_sel_mask = GENMASK_U16(6, 4), @@ -1681,11 +1549,42 @@ static int rk_set_clk_tx_rate(void *bsp_priv_, struct clk *clk_tx_i, phy_interface_t interface, int speed) { struct rk_priv_data *bsp_priv = bsp_priv_; + struct regmap *regmap; + int ret = -EINVAL; + bool is_100m; + u32 val; - if (bsp_priv->ops->set_speed) - return bsp_priv->ops->set_speed(bsp_priv, interface, speed); + if (bsp_priv->ops->set_speed) { + ret = bsp_priv->ops->set_speed(bsp_priv, interface, speed); + if (ret < 0) + return ret; + } - return -EINVAL; + if (bsp_priv->ops->speed_reg_php_grf) + regmap = bsp_priv->php_grf; + else + regmap = bsp_priv->grf; + + if (phy_interface_mode_is_rgmii(interface) && + bsp_priv->gmii_clk_sel_mask) { + ret = rk_gmac_rgmii_clk_div(speed); + if (ret < 0) + return ret; + + val = rk_encode_wm16(ret, bsp_priv->gmii_clk_sel_mask); + + ret = regmap_write(regmap, bsp_priv->speed_grf_reg, val); + } else if (interface == PHY_INTERFACE_MODE_RMII && + (bsp_priv->rmii_clk_sel_mask || + bsp_priv->mac_speed_mask)) { + is_100m = speed == SPEED_100; + val = rk_encode_wm16(is_100m, bsp_priv->mac_speed_mask) | + rk_encode_wm16(is_100m, bsp_priv->rmii_clk_sel_mask); + + ret = regmap_write(regmap, bsp_priv->speed_grf_reg, val); + } + + return ret; } static int rk_gmac_suspend(struct device *dev, void *bsp_priv_) -- 2.47.3