xref: /linux/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c (revision 17cfcb68af3bc7d5e8ae08779b1853310a2949f3)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*******************************************************************************
3   STMMAC Ethernet Driver -- MDIO bus implementation
4   Provides Bus interface for MII registers
5 
6   Copyright (C) 2007-2009  STMicroelectronics Ltd
7 
8 
9   Author: Carl Shaw <carl.shaw@st.com>
10   Maintainer: Giuseppe Cavallaro <peppe.cavallaro@st.com>
11 *******************************************************************************/
12 
13 #include <linux/gpio/consumer.h>
14 #include <linux/io.h>
15 #include <linux/iopoll.h>
16 #include <linux/mii.h>
17 #include <linux/of_mdio.h>
18 #include <linux/phy.h>
19 #include <linux/property.h>
20 #include <linux/slab.h>
21 
22 #include "dwxgmac2.h"
23 #include "stmmac.h"
24 
25 #define MII_BUSY 0x00000001
26 #define MII_WRITE 0x00000002
27 #define MII_DATA_MASK GENMASK(15, 0)
28 
29 /* GMAC4 defines */
30 #define MII_GMAC4_GOC_SHIFT		2
31 #define MII_GMAC4_REG_ADDR_SHIFT	16
32 #define MII_GMAC4_WRITE			(1 << MII_GMAC4_GOC_SHIFT)
33 #define MII_GMAC4_READ			(3 << MII_GMAC4_GOC_SHIFT)
34 #define MII_GMAC4_C45E			BIT(1)
35 
36 /* XGMAC defines */
37 #define MII_XGMAC_SADDR			BIT(18)
38 #define MII_XGMAC_CMD_SHIFT		16
39 #define MII_XGMAC_WRITE			(1 << MII_XGMAC_CMD_SHIFT)
40 #define MII_XGMAC_READ			(3 << MII_XGMAC_CMD_SHIFT)
41 #define MII_XGMAC_BUSY			BIT(22)
42 #define MII_XGMAC_MAX_C22ADDR		3
43 #define MII_XGMAC_C22P_MASK		GENMASK(MII_XGMAC_MAX_C22ADDR, 0)
44 
45 static int stmmac_xgmac2_c22_format(struct stmmac_priv *priv, int phyaddr,
46 				    int phyreg, u32 *hw_addr)
47 {
48 	unsigned int mii_data = priv->hw->mii.data;
49 	u32 tmp;
50 
51 	/* HW does not support C22 addr >= 4 */
52 	if (phyaddr > MII_XGMAC_MAX_C22ADDR)
53 		return -ENODEV;
54 	/* Wait until any existing MII operation is complete */
55 	if (readl_poll_timeout(priv->ioaddr + mii_data, tmp,
56 			       !(tmp & MII_XGMAC_BUSY), 100, 10000))
57 		return -EBUSY;
58 
59 	/* Set port as Clause 22 */
60 	tmp = readl(priv->ioaddr + XGMAC_MDIO_C22P);
61 	tmp &= ~MII_XGMAC_C22P_MASK;
62 	tmp |= BIT(phyaddr);
63 	writel(tmp, priv->ioaddr + XGMAC_MDIO_C22P);
64 
65 	*hw_addr = (phyaddr << 16) | (phyreg & 0x1f);
66 	return 0;
67 }
68 
69 static int stmmac_xgmac2_mdio_read(struct mii_bus *bus, int phyaddr, int phyreg)
70 {
71 	struct net_device *ndev = bus->priv;
72 	struct stmmac_priv *priv = netdev_priv(ndev);
73 	unsigned int mii_address = priv->hw->mii.addr;
74 	unsigned int mii_data = priv->hw->mii.data;
75 	u32 tmp, addr, value = MII_XGMAC_BUSY;
76 	int ret;
77 
78 	if (phyreg & MII_ADDR_C45) {
79 		return -EOPNOTSUPP;
80 	} else {
81 		ret = stmmac_xgmac2_c22_format(priv, phyaddr, phyreg, &addr);
82 		if (ret)
83 			return ret;
84 	}
85 
86 	value |= (priv->clk_csr << priv->hw->mii.clk_csr_shift)
87 		& priv->hw->mii.clk_csr_mask;
88 	value |= MII_XGMAC_SADDR | MII_XGMAC_READ;
89 
90 	/* Wait until any existing MII operation is complete */
91 	if (readl_poll_timeout(priv->ioaddr + mii_data, tmp,
92 			       !(tmp & MII_XGMAC_BUSY), 100, 10000))
93 		return -EBUSY;
94 
95 	/* Set the MII address register to read */
96 	writel(addr, priv->ioaddr + mii_address);
97 	writel(value, priv->ioaddr + mii_data);
98 
99 	/* Wait until any existing MII operation is complete */
100 	if (readl_poll_timeout(priv->ioaddr + mii_data, tmp,
101 			       !(tmp & MII_XGMAC_BUSY), 100, 10000))
102 		return -EBUSY;
103 
104 	/* Read the data from the MII data register */
105 	return readl(priv->ioaddr + mii_data) & GENMASK(15, 0);
106 }
107 
108 static int stmmac_xgmac2_mdio_write(struct mii_bus *bus, int phyaddr,
109 				    int phyreg, u16 phydata)
110 {
111 	struct net_device *ndev = bus->priv;
112 	struct stmmac_priv *priv = netdev_priv(ndev);
113 	unsigned int mii_address = priv->hw->mii.addr;
114 	unsigned int mii_data = priv->hw->mii.data;
115 	u32 addr, tmp, value = MII_XGMAC_BUSY;
116 	int ret;
117 
118 	if (phyreg & MII_ADDR_C45) {
119 		return -EOPNOTSUPP;
120 	} else {
121 		ret = stmmac_xgmac2_c22_format(priv, phyaddr, phyreg, &addr);
122 		if (ret)
123 			return ret;
124 	}
125 
126 	value |= (priv->clk_csr << priv->hw->mii.clk_csr_shift)
127 		& priv->hw->mii.clk_csr_mask;
128 	value |= phydata | MII_XGMAC_SADDR;
129 	value |= MII_XGMAC_WRITE;
130 
131 	/* Wait until any existing MII operation is complete */
132 	if (readl_poll_timeout(priv->ioaddr + mii_data, tmp,
133 			       !(tmp & MII_XGMAC_BUSY), 100, 10000))
134 		return -EBUSY;
135 
136 	/* Set the MII address register to write */
137 	writel(addr, priv->ioaddr + mii_address);
138 	writel(value, priv->ioaddr + mii_data);
139 
140 	/* Wait until any existing MII operation is complete */
141 	return readl_poll_timeout(priv->ioaddr + mii_data, tmp,
142 				  !(tmp & MII_XGMAC_BUSY), 100, 10000);
143 }
144 
145 /**
146  * stmmac_mdio_read
147  * @bus: points to the mii_bus structure
148  * @phyaddr: MII addr
149  * @phyreg: MII reg
150  * Description: it reads data from the MII register from within the phy device.
151  * For the 7111 GMAC, we must set the bit 0 in the MII address register while
152  * accessing the PHY registers.
153  * Fortunately, it seems this has no drawback for the 7109 MAC.
154  */
155 static int stmmac_mdio_read(struct mii_bus *bus, int phyaddr, int phyreg)
156 {
157 	struct net_device *ndev = bus->priv;
158 	struct stmmac_priv *priv = netdev_priv(ndev);
159 	unsigned int mii_address = priv->hw->mii.addr;
160 	unsigned int mii_data = priv->hw->mii.data;
161 	u32 value = MII_BUSY;
162 	int data = 0;
163 	u32 v;
164 
165 	value |= (phyaddr << priv->hw->mii.addr_shift)
166 		& priv->hw->mii.addr_mask;
167 	value |= (phyreg << priv->hw->mii.reg_shift) & priv->hw->mii.reg_mask;
168 	value |= (priv->clk_csr << priv->hw->mii.clk_csr_shift)
169 		& priv->hw->mii.clk_csr_mask;
170 	if (priv->plat->has_gmac4) {
171 		value |= MII_GMAC4_READ;
172 		if (phyreg & MII_ADDR_C45) {
173 			value |= MII_GMAC4_C45E;
174 			value &= ~priv->hw->mii.reg_mask;
175 			value |= ((phyreg >> MII_DEVADDR_C45_SHIFT) <<
176 			       priv->hw->mii.reg_shift) &
177 			       priv->hw->mii.reg_mask;
178 
179 			data |= (phyreg & MII_REGADDR_C45_MASK) <<
180 				MII_GMAC4_REG_ADDR_SHIFT;
181 		}
182 	}
183 
184 	if (readl_poll_timeout(priv->ioaddr + mii_address, v, !(v & MII_BUSY),
185 			       100, 10000))
186 		return -EBUSY;
187 
188 	writel(data, priv->ioaddr + mii_data);
189 	writel(value, priv->ioaddr + mii_address);
190 
191 	if (readl_poll_timeout(priv->ioaddr + mii_address, v, !(v & MII_BUSY),
192 			       100, 10000))
193 		return -EBUSY;
194 
195 	/* Read the data from the MII data register */
196 	data = (int)readl(priv->ioaddr + mii_data) & MII_DATA_MASK;
197 
198 	return data;
199 }
200 
201 /**
202  * stmmac_mdio_write
203  * @bus: points to the mii_bus structure
204  * @phyaddr: MII addr
205  * @phyreg: MII reg
206  * @phydata: phy data
207  * Description: it writes the data into the MII register from within the device.
208  */
209 static int stmmac_mdio_write(struct mii_bus *bus, int phyaddr, int phyreg,
210 			     u16 phydata)
211 {
212 	struct net_device *ndev = bus->priv;
213 	struct stmmac_priv *priv = netdev_priv(ndev);
214 	unsigned int mii_address = priv->hw->mii.addr;
215 	unsigned int mii_data = priv->hw->mii.data;
216 	u32 value = MII_BUSY;
217 	int data = phydata;
218 	u32 v;
219 
220 	value |= (phyaddr << priv->hw->mii.addr_shift)
221 		& priv->hw->mii.addr_mask;
222 	value |= (phyreg << priv->hw->mii.reg_shift) & priv->hw->mii.reg_mask;
223 
224 	value |= (priv->clk_csr << priv->hw->mii.clk_csr_shift)
225 		& priv->hw->mii.clk_csr_mask;
226 	if (priv->plat->has_gmac4) {
227 		value |= MII_GMAC4_WRITE;
228 		if (phyreg & MII_ADDR_C45) {
229 			value |= MII_GMAC4_C45E;
230 			value &= ~priv->hw->mii.reg_mask;
231 			value |= ((phyreg >> MII_DEVADDR_C45_SHIFT) <<
232 			       priv->hw->mii.reg_shift) &
233 			       priv->hw->mii.reg_mask;
234 
235 			data |= (phyreg & MII_REGADDR_C45_MASK) <<
236 				MII_GMAC4_REG_ADDR_SHIFT;
237 		}
238 	} else {
239 		value |= MII_WRITE;
240 	}
241 
242 	/* Wait until any existing MII operation is complete */
243 	if (readl_poll_timeout(priv->ioaddr + mii_address, v, !(v & MII_BUSY),
244 			       100, 10000))
245 		return -EBUSY;
246 
247 	/* Set the MII address register to write */
248 	writel(data, priv->ioaddr + mii_data);
249 	writel(value, priv->ioaddr + mii_address);
250 
251 	/* Wait until any existing MII operation is complete */
252 	return readl_poll_timeout(priv->ioaddr + mii_address, v, !(v & MII_BUSY),
253 				  100, 10000);
254 }
255 
256 /**
257  * stmmac_mdio_reset
258  * @bus: points to the mii_bus structure
259  * Description: reset the MII bus
260  */
261 int stmmac_mdio_reset(struct mii_bus *bus)
262 {
263 #if IS_ENABLED(CONFIG_STMMAC_PLATFORM)
264 	struct net_device *ndev = bus->priv;
265 	struct stmmac_priv *priv = netdev_priv(ndev);
266 	unsigned int mii_address = priv->hw->mii.addr;
267 
268 #ifdef CONFIG_OF
269 	if (priv->device->of_node) {
270 		struct gpio_desc *reset_gpio;
271 		u32 delays[3] = { 0, 0, 0 };
272 
273 		reset_gpio = devm_gpiod_get_optional(priv->device,
274 						     "snps,reset",
275 						     GPIOD_OUT_LOW);
276 		if (IS_ERR(reset_gpio))
277 			return PTR_ERR(reset_gpio);
278 
279 		device_property_read_u32_array(priv->device,
280 					       "snps,reset-delays-us",
281 					       delays, ARRAY_SIZE(delays));
282 
283 		if (delays[0])
284 			msleep(DIV_ROUND_UP(delays[0], 1000));
285 
286 		gpiod_set_value_cansleep(reset_gpio, 1);
287 		if (delays[1])
288 			msleep(DIV_ROUND_UP(delays[1], 1000));
289 
290 		gpiod_set_value_cansleep(reset_gpio, 0);
291 		if (delays[2])
292 			msleep(DIV_ROUND_UP(delays[2], 1000));
293 	}
294 #endif
295 
296 	/* This is a workaround for problems with the STE101P PHY.
297 	 * It doesn't complete its reset until at least one clock cycle
298 	 * on MDC, so perform a dummy mdio read. To be updated for GMAC4
299 	 * if needed.
300 	 */
301 	if (!priv->plat->has_gmac4)
302 		writel(0, priv->ioaddr + mii_address);
303 #endif
304 	return 0;
305 }
306 
307 /**
308  * stmmac_mdio_register
309  * @ndev: net device structure
310  * Description: it registers the MII bus
311  */
312 int stmmac_mdio_register(struct net_device *ndev)
313 {
314 	int err = 0;
315 	struct mii_bus *new_bus;
316 	struct stmmac_priv *priv = netdev_priv(ndev);
317 	struct stmmac_mdio_bus_data *mdio_bus_data = priv->plat->mdio_bus_data;
318 	struct device_node *mdio_node = priv->plat->mdio_node;
319 	struct device *dev = ndev->dev.parent;
320 	int addr, found, max_addr;
321 
322 	if (!mdio_bus_data)
323 		return 0;
324 
325 	new_bus = mdiobus_alloc();
326 	if (!new_bus)
327 		return -ENOMEM;
328 
329 	if (mdio_bus_data->irqs)
330 		memcpy(new_bus->irq, mdio_bus_data->irqs, sizeof(new_bus->irq));
331 
332 	new_bus->name = "stmmac";
333 
334 	if (priv->plat->has_xgmac) {
335 		new_bus->read = &stmmac_xgmac2_mdio_read;
336 		new_bus->write = &stmmac_xgmac2_mdio_write;
337 
338 		/* Right now only C22 phys are supported */
339 		max_addr = MII_XGMAC_MAX_C22ADDR + 1;
340 
341 		/* Check if DT specified an unsupported phy addr */
342 		if (priv->plat->phy_addr > MII_XGMAC_MAX_C22ADDR)
343 			dev_err(dev, "Unsupported phy_addr (max=%d)\n",
344 					MII_XGMAC_MAX_C22ADDR);
345 	} else {
346 		new_bus->read = &stmmac_mdio_read;
347 		new_bus->write = &stmmac_mdio_write;
348 		max_addr = PHY_MAX_ADDR;
349 	}
350 
351 	if (mdio_bus_data->needs_reset)
352 		new_bus->reset = &stmmac_mdio_reset;
353 
354 	snprintf(new_bus->id, MII_BUS_ID_SIZE, "%s-%x",
355 		 new_bus->name, priv->plat->bus_id);
356 	new_bus->priv = ndev;
357 	new_bus->phy_mask = mdio_bus_data->phy_mask;
358 	new_bus->parent = priv->device;
359 
360 	err = of_mdiobus_register(new_bus, mdio_node);
361 	if (err != 0) {
362 		dev_err(dev, "Cannot register the MDIO bus\n");
363 		goto bus_register_fail;
364 	}
365 
366 	if (priv->plat->phy_node || mdio_node)
367 		goto bus_register_done;
368 
369 	found = 0;
370 	for (addr = 0; addr < max_addr; addr++) {
371 		struct phy_device *phydev = mdiobus_get_phy(new_bus, addr);
372 
373 		if (!phydev)
374 			continue;
375 
376 		/*
377 		 * If an IRQ was provided to be assigned after
378 		 * the bus probe, do it here.
379 		 */
380 		if (!mdio_bus_data->irqs &&
381 		    (mdio_bus_data->probed_phy_irq > 0)) {
382 			new_bus->irq[addr] = mdio_bus_data->probed_phy_irq;
383 			phydev->irq = mdio_bus_data->probed_phy_irq;
384 		}
385 
386 		/*
387 		 * If we're going to bind the MAC to this PHY bus,
388 		 * and no PHY number was provided to the MAC,
389 		 * use the one probed here.
390 		 */
391 		if (priv->plat->phy_addr == -1)
392 			priv->plat->phy_addr = addr;
393 
394 		phy_attached_info(phydev);
395 		found = 1;
396 	}
397 
398 	if (!found && !mdio_node) {
399 		dev_warn(dev, "No PHY found\n");
400 		mdiobus_unregister(new_bus);
401 		mdiobus_free(new_bus);
402 		return -ENODEV;
403 	}
404 
405 bus_register_done:
406 	priv->mii = new_bus;
407 
408 	return 0;
409 
410 bus_register_fail:
411 	mdiobus_free(new_bus);
412 	return err;
413 }
414 
415 /**
416  * stmmac_mdio_unregister
417  * @ndev: net device structure
418  * Description: it unregisters the MII bus
419  */
420 int stmmac_mdio_unregister(struct net_device *ndev)
421 {
422 	struct stmmac_priv *priv = netdev_priv(ndev);
423 
424 	if (!priv->mii)
425 		return 0;
426 
427 	mdiobus_unregister(priv->mii);
428 	priv->mii->priv = NULL;
429 	mdiobus_free(priv->mii);
430 	priv->mii = NULL;
431 
432 	return 0;
433 }
434