1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright Sunplus Technology Co., Ltd.
6 #include <linux/netdevice.h>
7 #include <linux/bitfield.h>
8 #include <linux/of_mdio.h>
10 #include "spl2sw_register.h"
11 #include "spl2sw_define.h"
12 #include "spl2sw_phy.h"
14 static void spl2sw_mii_link_change(struct net_device *ndev)
16 struct spl2sw_mac *mac = netdev_priv(ndev);
17 struct phy_device *phydev = ndev->phydev;
18 struct spl2sw_common *comm = mac->comm;
21 reg = readl(comm->l2sw_reg_base + L2SW_MAC_FORCE_MODE);
24 reg |= FIELD_PREP(MAC_FORCE_RMII_LINK, mac->lan_port);
26 if (phydev->speed == 100) {
27 reg |= FIELD_PREP(MAC_FORCE_RMII_SPD, mac->lan_port);
29 reg &= FIELD_PREP(MAC_FORCE_RMII_SPD, ~mac->lan_port) |
34 reg |= FIELD_PREP(MAC_FORCE_RMII_DPX, mac->lan_port);
36 reg &= FIELD_PREP(MAC_FORCE_RMII_DPX, ~mac->lan_port) |
41 reg |= FIELD_PREP(MAC_FORCE_RMII_FC, mac->lan_port);
43 reg &= FIELD_PREP(MAC_FORCE_RMII_FC, ~mac->lan_port) |
47 reg &= FIELD_PREP(MAC_FORCE_RMII_LINK, ~mac->lan_port) |
51 writel(reg, comm->l2sw_reg_base + L2SW_MAC_FORCE_MODE);
53 phy_print_status(phydev);
56 int spl2sw_phy_connect(struct spl2sw_common *comm)
58 struct phy_device *phydev;
59 struct net_device *ndev;
60 struct spl2sw_mac *mac;
63 for (i = 0; i < MAX_NETDEV_NUM; i++)
66 mac = netdev_priv(ndev);
67 phydev = of_phy_connect(ndev, mac->phy_node, spl2sw_mii_link_change,
72 phy_support_asym_pause(phydev);
73 phy_attached_info(phydev);
79 void spl2sw_phy_remove(struct spl2sw_common *comm)
81 struct net_device *ndev;
84 for (i = 0; i < MAX_NETDEV_NUM; i++)
88 phy_disconnect(ndev->phydev);