diff options
Diffstat (limited to 'drivers/net/ethernet/mediatek/mtk_eth_path.c')
-rw-r--r-- | drivers/net/ethernet/mediatek/mtk_eth_path.c | 81 |
1 files changed, 55 insertions, 26 deletions
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_path.c b/drivers/net/ethernet/mediatek/mtk_eth_path.c index 61f705d945e5..7f05880cf9ef 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_path.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_path.c @@ -13,19 +13,32 @@ #include "mtk_eth_soc.h" struct mtk_eth_muxc { - int (*set_path)(struct mtk_eth *eth, int path); + const char *name; + int cap_bit; + int (*set_path)(struct mtk_eth *eth, int path); }; -static const char * const mtk_eth_mux_name[] = { - "mux_gdm1_to_gmac1_esw", "mux_gmac2_gmac0_to_gephy", - "mux_u3_gmac2_to_qphy", "mux_gmac1_gmac2_to_sgmii_rgmii", - "mux_gmac12_to_gephy_sgmii", -}; - -static const char * const mtk_eth_path_name[] = { - "gmac1_rgmii", "gmac1_trgmii", "gmac1_sgmii", "gmac2_rgmii", - "gmac2_sgmii", "gmac2_gephy", "gdm1_esw", -}; +static const char *mtk_eth_path_name(int path) +{ + switch (path) { + case MTK_ETH_PATH_GMAC1_RGMII: + return "gmac1_rgmii"; + case MTK_ETH_PATH_GMAC1_TRGMII: + return "gmac1_trgmii"; + case MTK_ETH_PATH_GMAC1_SGMII: + return "gmac1_sgmii"; + case MTK_ETH_PATH_GMAC2_RGMII: + return "gmac2_rgmii"; + case MTK_ETH_PATH_GMAC2_SGMII: + return "gmac2_sgmii"; + case MTK_ETH_PATH_GMAC2_GEPHY: + return "gmac2_gephy"; + case MTK_ETH_PATH_GDM1_ESW: + return "gdm1_esw"; + default: + return "unknown path"; + } +} static int set_mux_gdm1_to_gmac1_esw(struct mtk_eth *eth, int path) { @@ -53,7 +66,7 @@ static int set_mux_gdm1_to_gmac1_esw(struct mtk_eth *eth, int path) } dev_dbg(eth->dev, "path %s in %s updated = %d\n", - mtk_eth_path_name[path], __func__, updated); + mtk_eth_path_name(path), __func__, updated); return 0; } @@ -76,7 +89,7 @@ static int set_mux_gmac2_gmac0_to_gephy(struct mtk_eth *eth, int path) regmap_update_bits(eth->infra, INFRA_MISC2, GEPHY_MAC_SEL, val); dev_dbg(eth->dev, "path %s in %s updated = %d\n", - mtk_eth_path_name[path], __func__, updated); + mtk_eth_path_name(path), __func__, updated); return 0; } @@ -99,7 +112,7 @@ static int set_mux_u3_gmac2_to_qphy(struct mtk_eth *eth, int path) regmap_update_bits(eth->infra, INFRA_MISC2, CO_QPHY_SEL, val); dev_dbg(eth->dev, "path %s in %s updated = %d\n", - mtk_eth_path_name[path], __func__, updated); + mtk_eth_path_name(path), __func__, updated); return 0; } @@ -137,7 +150,7 @@ static int set_mux_gmac1_gmac2_to_sgmii_rgmii(struct mtk_eth *eth, int path) SYSCFG0_SGMII_MASK, val); dev_dbg(eth->dev, "path %s in %s updated = %d\n", - mtk_eth_path_name[path], __func__, updated); + mtk_eth_path_name(path), __func__, updated); return 0; } @@ -168,26 +181,42 @@ static int set_mux_gmac12_to_gephy_sgmii(struct mtk_eth *eth, int path) SYSCFG0_SGMII_MASK, val); dev_dbg(eth->dev, "path %s in %s updated = %d\n", - mtk_eth_path_name[path], __func__, updated); + mtk_eth_path_name(path), __func__, updated); return 0; } static const struct mtk_eth_muxc mtk_eth_muxc[] = { - { .set_path = set_mux_gdm1_to_gmac1_esw, }, - { .set_path = set_mux_gmac2_gmac0_to_gephy, }, - { .set_path = set_mux_u3_gmac2_to_qphy, }, - { .set_path = set_mux_gmac1_gmac2_to_sgmii_rgmii, }, - { .set_path = set_mux_gmac12_to_gephy_sgmii, } + { + .name = "mux_gdm1_to_gmac1_esw", + .cap_bit = MTK_ETH_MUX_GDM1_TO_GMAC1_ESW, + .set_path = set_mux_gdm1_to_gmac1_esw, + }, { + .name = "mux_gmac2_gmac0_to_gephy", + .cap_bit = MTK_ETH_MUX_GMAC2_GMAC0_TO_GEPHY, + .set_path = set_mux_gmac2_gmac0_to_gephy, + }, { + .name = "mux_u3_gmac2_to_qphy", + .cap_bit = MTK_ETH_MUX_U3_GMAC2_TO_QPHY, + .set_path = set_mux_u3_gmac2_to_qphy, + }, { + .name = "mux_gmac1_gmac2_to_sgmii_rgmii", + .cap_bit = MTK_ETH_MUX_GMAC1_GMAC2_TO_SGMII_RGMII, + .set_path = set_mux_gmac1_gmac2_to_sgmii_rgmii, + }, { + .name = "mux_gmac12_to_gephy_sgmii", + .cap_bit = MTK_ETH_MUX_GMAC12_TO_GEPHY_SGMII, + .set_path = set_mux_gmac12_to_gephy_sgmii, + }, }; static int mtk_eth_mux_setup(struct mtk_eth *eth, int path) { int i, err = 0; - if (!MTK_HAS_CAPS(eth->soc->caps, MTK_PATH_BIT(path))) { + if (!MTK_HAS_CAPS(eth->soc->caps, path)) { dev_err(eth->dev, "path %s isn't support on the SoC\n", - mtk_eth_path_name[path]); + mtk_eth_path_name(path)); return -EINVAL; } @@ -195,14 +224,14 @@ static int mtk_eth_mux_setup(struct mtk_eth *eth, int path) return 0; /* Setup MUX in path fabric */ - for (i = 0; i < MTK_ETH_MUX_MAX; i++) { - if (MTK_HAS_CAPS(eth->soc->caps, MTK_MUX_BIT(i))) { + for (i = 0; i < ARRAY_SIZE(mtk_eth_muxc); i++) { + if (MTK_HAS_CAPS(eth->soc->caps, mtk_eth_muxc[i].cap_bit)) { err = mtk_eth_muxc[i].set_path(eth, path); if (err) goto out; } else { dev_dbg(eth->dev, "mux %s isn't present on the SoC\n", - mtk_eth_mux_name[i]); + mtk_eth_muxc[i].name); } } |