blob: 5a130b140f4739837d431c08bb0f46c81b398d2e [file] [log] [blame]
developer2cdaeb12022-10-04 20:25:05 +08001Index: linux-5.4.203/drivers/net/dsa/mt7530.c
2===================================================================
3--- linux-5.4.203.orig/drivers/net/dsa/mt7530.c
4+++ linux-5.4.203/drivers/net/dsa/mt7530.c
5@@ -847,6 +847,132 @@ mt7531_ind_phy_write(struct dsa_switch *
6 return ret;
7 }
8
9+static int mt753x_mdio_read(struct mii_bus *bus, int addr, int regnum)
10+{
11+ struct mt7530_priv *priv = bus->priv;
12+ struct mt7530_dummy_poll p;
13+ int ret;
14+ u32 val;
15+
16+ INIT_MT7530_DUMMY_POLL(&p, priv, MT7531_PHY_IAC);
17+
18+ mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED);
19+
20+ ret = readx_poll_timeout(_mt7530_unlocked_read, &p, val,
21+ !(val & MT7531_PHY_ACS_ST), 20, 100000);
22+ if (ret < 0) {
23+ dev_err(priv->dev, "poll timeout\n");
24+ goto out;
25+ }
26+
27+ val = MT7531_MDIO_CL22_READ | MT7531_MDIO_PHY_ADDR(addr) |
28+ MT7531_MDIO_REG_ADDR(regnum);
29+
30+ mt7530_mii_write(priv, MT7531_PHY_IAC, val | MT7531_PHY_ACS_ST);
31+
32+ ret = readx_poll_timeout(_mt7530_unlocked_read, &p, val,
33+ !(val & MT7531_PHY_ACS_ST), 20, 100000);
34+ if (ret < 0) {
35+ dev_err(priv->dev, "poll timeout\n");
36+ goto out;
37+ }
38+
39+ ret = val & MT7531_MDIO_RW_DATA_MASK;
40+out:
41+ mutex_unlock(&priv->bus->mdio_lock);
42+
43+ return ret;
44+}
45+
46+static int mt753x_mdio_write(struct mii_bus *bus, int addr, int regnum, u16 val)
47+{
48+ struct mt7530_priv *priv = bus->priv;
49+ struct mt7530_dummy_poll p;
50+ int ret;
51+ u32 reg;
52+
53+ INIT_MT7530_DUMMY_POLL(&p, priv, MT7531_PHY_IAC);
54+
55+ mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED);
56+
57+ ret = readx_poll_timeout(_mt7530_unlocked_read, &p, reg,
58+ !(reg & MT7531_PHY_ACS_ST), 20, 100000);
59+ if (ret < 0) {
60+ dev_err(priv->dev, "poll timeout\n");
61+ goto out;
62+ }
63+
64+ reg = MT7531_MDIO_CL22_WRITE | MT7531_MDIO_PHY_ADDR(addr) |
65+ MT7531_MDIO_REG_ADDR(regnum) | val;
66+
67+ mt7530_mii_write(priv, MT7531_PHY_IAC, reg | MT7531_PHY_ACS_ST);
68+
69+ ret = readx_poll_timeout(_mt7530_unlocked_read, &p, reg,
70+ !(reg & MT7531_PHY_ACS_ST), 20, 100000);
71+ if (ret < 0) {
72+ dev_err(priv->dev, "poll timeout\n");
73+ goto out;
74+ }
75+
76+out:
77+ mutex_unlock(&priv->bus->mdio_lock);
78+
79+ return ret;
80+}
81+
82+static int mt753x_mdio_init(struct mt7530_priv *priv)
83+{
84+ struct device_node *dn;
85+ struct device_node *mii_np;
86+ int ret;
87+
88+ dn = priv->dev->of_node;
89+
90+ mii_np = of_get_child_by_name(dn, "mdio-bus");
91+ if (!mii_np) {
92+ ret = -ENODEV;
93+ goto err_put_node;
94+ }
95+
96+ if (!of_device_is_available(mii_np)) {
97+ ret = -ENODEV;
98+ goto err_put_node;
99+ }
100+
101+ priv->gbus = devm_mdiobus_alloc(priv->dev);
102+ if (!priv->gbus) {
103+ ret = -ENOMEM;
104+ goto err_put_node;
105+ }
106+ priv->gbus->name = "mt753x_mdio";
107+ priv->gbus->read = mt753x_mdio_read;
108+ priv->gbus->write = mt753x_mdio_write;
109+ priv->gbus->priv = priv;
110+ priv->gbus->parent = priv->dev;
111+
112+ if(snprintf(priv->gbus->id, MII_BUS_ID_SIZE, "%s@%s", mii_np->name, dn->name) < 0) {
113+ ret = -ENOMEM;
114+ goto err_put_node;
115+ }
116+
117+ ret = of_mdiobus_register(priv->gbus, mii_np);
118+ if (ret)
119+ priv->gbus = NULL;
120+
121+err_put_node:
122+ of_node_put(mii_np);
123+
124+ return ret;
125+}
126+
127+static void mt753x_mdio_exit(struct mt7530_priv *priv)
128+{
129+ if (!priv->gbus)
130+ return;
131+
132+ mdiobus_unregister(priv->gbus);
133+}
134+
135 static void
136 mt7530_get_strings(struct dsa_switch *ds, int port, u32 stringset,
137 uint8_t *data)
138@@ -2892,6 +3018,7 @@ mt7530_probe(struct mdio_device *mdiodev
139 return ret;
140 }
141 mt7530_nl_init(&priv);
142+ mt753x_mdio_init(priv);
143
144 return 0;
145 }
146@@ -2919,6 +3046,7 @@ mt7530_remove(struct mdio_device *mdiode
147 iounmap(priv->base);
148
149 mt7530_nl_exit();
150+ mt753x_mdio_exit(priv);
151 }
152
153 static struct mdio_driver mt7530_mdio_driver = {
154Index: linux-5.4.203/drivers/net/dsa/mt7530.h
155===================================================================
156--- linux-5.4.203.orig/drivers/net/dsa/mt7530.h
157+++ linux-5.4.203/drivers/net/dsa/mt7530.h
158@@ -730,6 +730,7 @@ struct mt7530_priv {
159 struct device *dev;
160 struct dsa_switch *ds;
161 struct mii_bus *bus;
162+ struct mii_bus *gbus;
163 struct reset_control *rstc;
164 struct regulator *core_pwr;
165 struct regulator *io_pwr;