Merge tag 'usb-serial-5.7-rc5' of https://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / drivers / net / ethernet / stmicro / stmmac / stmmac_mdio.c
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 #define MII_XGMAC_PA_SHIFT              16
45 #define MII_XGMAC_DA_SHIFT              21
46
47 static int stmmac_xgmac2_c45_format(struct stmmac_priv *priv, int phyaddr,
48                                     int phyreg, u32 *hw_addr)
49 {
50         u32 tmp;
51
52         /* Set port as Clause 45 */
53         tmp = readl(priv->ioaddr + XGMAC_MDIO_C22P);
54         tmp &= ~BIT(phyaddr);
55         writel(tmp, priv->ioaddr + XGMAC_MDIO_C22P);
56
57         *hw_addr = (phyaddr << MII_XGMAC_PA_SHIFT) | (phyreg & 0xffff);
58         *hw_addr |= (phyreg >> MII_DEVADDR_C45_SHIFT) << MII_XGMAC_DA_SHIFT;
59         return 0;
60 }
61
62 static int stmmac_xgmac2_c22_format(struct stmmac_priv *priv, int phyaddr,
63                                     int phyreg, u32 *hw_addr)
64 {
65         u32 tmp;
66
67         /* HW does not support C22 addr >= 4 */
68         if (phyaddr > MII_XGMAC_MAX_C22ADDR)
69                 return -ENODEV;
70
71         /* Set port as Clause 22 */
72         tmp = readl(priv->ioaddr + XGMAC_MDIO_C22P);
73         tmp &= ~MII_XGMAC_C22P_MASK;
74         tmp |= BIT(phyaddr);
75         writel(tmp, priv->ioaddr + XGMAC_MDIO_C22P);
76
77         *hw_addr = (phyaddr << MII_XGMAC_PA_SHIFT) | (phyreg & 0x1f);
78         return 0;
79 }
80
81 static int stmmac_xgmac2_mdio_read(struct mii_bus *bus, int phyaddr, int phyreg)
82 {
83         struct net_device *ndev = bus->priv;
84         struct stmmac_priv *priv = netdev_priv(ndev);
85         unsigned int mii_address = priv->hw->mii.addr;
86         unsigned int mii_data = priv->hw->mii.data;
87         u32 tmp, addr, value = MII_XGMAC_BUSY;
88         int ret;
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         if (phyreg & MII_ADDR_C45) {
96                 phyreg &= ~MII_ADDR_C45;
97
98                 ret = stmmac_xgmac2_c45_format(priv, phyaddr, phyreg, &addr);
99                 if (ret)
100                         return ret;
101         } else {
102                 ret = stmmac_xgmac2_c22_format(priv, phyaddr, phyreg, &addr);
103                 if (ret)
104                         return ret;
105
106                 value |= MII_XGMAC_SADDR;
107         }
108
109         value |= (priv->clk_csr << priv->hw->mii.clk_csr_shift)
110                 & priv->hw->mii.clk_csr_mask;
111         value |= MII_XGMAC_READ;
112
113         /* Wait until any existing MII operation is complete */
114         if (readl_poll_timeout(priv->ioaddr + mii_data, tmp,
115                                !(tmp & MII_XGMAC_BUSY), 100, 10000))
116                 return -EBUSY;
117
118         /* Set the MII address register to read */
119         writel(addr, priv->ioaddr + mii_address);
120         writel(value, priv->ioaddr + mii_data);
121
122         /* Wait until any existing MII operation is complete */
123         if (readl_poll_timeout(priv->ioaddr + mii_data, tmp,
124                                !(tmp & MII_XGMAC_BUSY), 100, 10000))
125                 return -EBUSY;
126
127         /* Read the data from the MII data register */
128         return readl(priv->ioaddr + mii_data) & GENMASK(15, 0);
129 }
130
131 static int stmmac_xgmac2_mdio_write(struct mii_bus *bus, int phyaddr,
132                                     int phyreg, u16 phydata)
133 {
134         struct net_device *ndev = bus->priv;
135         struct stmmac_priv *priv = netdev_priv(ndev);
136         unsigned int mii_address = priv->hw->mii.addr;
137         unsigned int mii_data = priv->hw->mii.data;
138         u32 addr, tmp, value = MII_XGMAC_BUSY;
139         int ret;
140
141         /* Wait until any existing MII operation is complete */
142         if (readl_poll_timeout(priv->ioaddr + mii_data, tmp,
143                                !(tmp & MII_XGMAC_BUSY), 100, 10000))
144                 return -EBUSY;
145
146         if (phyreg & MII_ADDR_C45) {
147                 phyreg &= ~MII_ADDR_C45;
148
149                 ret = stmmac_xgmac2_c45_format(priv, phyaddr, phyreg, &addr);
150                 if (ret)
151                         return ret;
152         } else {
153                 ret = stmmac_xgmac2_c22_format(priv, phyaddr, phyreg, &addr);
154                 if (ret)
155                         return ret;
156
157                 value |= MII_XGMAC_SADDR;
158         }
159
160         value |= (priv->clk_csr << priv->hw->mii.clk_csr_shift)
161                 & priv->hw->mii.clk_csr_mask;
162         value |= phydata;
163         value |= MII_XGMAC_WRITE;
164
165         /* Wait until any existing MII operation is complete */
166         if (readl_poll_timeout(priv->ioaddr + mii_data, tmp,
167                                !(tmp & MII_XGMAC_BUSY), 100, 10000))
168                 return -EBUSY;
169
170         /* Set the MII address register to write */
171         writel(addr, priv->ioaddr + mii_address);
172         writel(value, priv->ioaddr + mii_data);
173
174         /* Wait until any existing MII operation is complete */
175         return readl_poll_timeout(priv->ioaddr + mii_data, tmp,
176                                   !(tmp & MII_XGMAC_BUSY), 100, 10000);
177 }
178
179 /**
180  * stmmac_mdio_read
181  * @bus: points to the mii_bus structure
182  * @phyaddr: MII addr
183  * @phyreg: MII reg
184  * Description: it reads data from the MII register from within the phy device.
185  * For the 7111 GMAC, we must set the bit 0 in the MII address register while
186  * accessing the PHY registers.
187  * Fortunately, it seems this has no drawback for the 7109 MAC.
188  */
189 static int stmmac_mdio_read(struct mii_bus *bus, int phyaddr, int phyreg)
190 {
191         struct net_device *ndev = bus->priv;
192         struct stmmac_priv *priv = netdev_priv(ndev);
193         unsigned int mii_address = priv->hw->mii.addr;
194         unsigned int mii_data = priv->hw->mii.data;
195         u32 value = MII_BUSY;
196         int data = 0;
197         u32 v;
198
199         value |= (phyaddr << priv->hw->mii.addr_shift)
200                 & priv->hw->mii.addr_mask;
201         value |= (phyreg << priv->hw->mii.reg_shift) & priv->hw->mii.reg_mask;
202         value |= (priv->clk_csr << priv->hw->mii.clk_csr_shift)
203                 & priv->hw->mii.clk_csr_mask;
204         if (priv->plat->has_gmac4) {
205                 value |= MII_GMAC4_READ;
206                 if (phyreg & MII_ADDR_C45) {
207                         value |= MII_GMAC4_C45E;
208                         value &= ~priv->hw->mii.reg_mask;
209                         value |= ((phyreg >> MII_DEVADDR_C45_SHIFT) <<
210                                priv->hw->mii.reg_shift) &
211                                priv->hw->mii.reg_mask;
212
213                         data |= (phyreg & MII_REGADDR_C45_MASK) <<
214                                 MII_GMAC4_REG_ADDR_SHIFT;
215                 }
216         }
217
218         if (readl_poll_timeout(priv->ioaddr + mii_address, v, !(v & MII_BUSY),
219                                100, 10000))
220                 return -EBUSY;
221
222         writel(data, priv->ioaddr + mii_data);
223         writel(value, priv->ioaddr + mii_address);
224
225         if (readl_poll_timeout(priv->ioaddr + mii_address, v, !(v & MII_BUSY),
226                                100, 10000))
227                 return -EBUSY;
228
229         /* Read the data from the MII data register */
230         data = (int)readl(priv->ioaddr + mii_data) & MII_DATA_MASK;
231
232         return data;
233 }
234
235 /**
236  * stmmac_mdio_write
237  * @bus: points to the mii_bus structure
238  * @phyaddr: MII addr
239  * @phyreg: MII reg
240  * @phydata: phy data
241  * Description: it writes the data into the MII register from within the device.
242  */
243 static int stmmac_mdio_write(struct mii_bus *bus, int phyaddr, int phyreg,
244                              u16 phydata)
245 {
246         struct net_device *ndev = bus->priv;
247         struct stmmac_priv *priv = netdev_priv(ndev);
248         unsigned int mii_address = priv->hw->mii.addr;
249         unsigned int mii_data = priv->hw->mii.data;
250         u32 value = MII_BUSY;
251         int data = phydata;
252         u32 v;
253
254         value |= (phyaddr << priv->hw->mii.addr_shift)
255                 & priv->hw->mii.addr_mask;
256         value |= (phyreg << priv->hw->mii.reg_shift) & priv->hw->mii.reg_mask;
257
258         value |= (priv->clk_csr << priv->hw->mii.clk_csr_shift)
259                 & priv->hw->mii.clk_csr_mask;
260         if (priv->plat->has_gmac4) {
261                 value |= MII_GMAC4_WRITE;
262                 if (phyreg & MII_ADDR_C45) {
263                         value |= MII_GMAC4_C45E;
264                         value &= ~priv->hw->mii.reg_mask;
265                         value |= ((phyreg >> MII_DEVADDR_C45_SHIFT) <<
266                                priv->hw->mii.reg_shift) &
267                                priv->hw->mii.reg_mask;
268
269                         data |= (phyreg & MII_REGADDR_C45_MASK) <<
270                                 MII_GMAC4_REG_ADDR_SHIFT;
271                 }
272         } else {
273                 value |= MII_WRITE;
274         }
275
276         /* Wait until any existing MII operation is complete */
277         if (readl_poll_timeout(priv->ioaddr + mii_address, v, !(v & MII_BUSY),
278                                100, 10000))
279                 return -EBUSY;
280
281         /* Set the MII address register to write */
282         writel(data, priv->ioaddr + mii_data);
283         writel(value, priv->ioaddr + mii_address);
284
285         /* Wait until any existing MII operation is complete */
286         return readl_poll_timeout(priv->ioaddr + mii_address, v, !(v & MII_BUSY),
287                                   100, 10000);
288 }
289
290 /**
291  * stmmac_mdio_reset
292  * @bus: points to the mii_bus structure
293  * Description: reset the MII bus
294  */
295 int stmmac_mdio_reset(struct mii_bus *bus)
296 {
297 #if IS_ENABLED(CONFIG_STMMAC_PLATFORM)
298         struct net_device *ndev = bus->priv;
299         struct stmmac_priv *priv = netdev_priv(ndev);
300         unsigned int mii_address = priv->hw->mii.addr;
301
302 #ifdef CONFIG_OF
303         if (priv->device->of_node) {
304                 struct gpio_desc *reset_gpio;
305                 u32 delays[3] = { 0, 0, 0 };
306
307                 reset_gpio = devm_gpiod_get_optional(priv->device,
308                                                      "snps,reset",
309                                                      GPIOD_OUT_LOW);
310                 if (IS_ERR(reset_gpio))
311                         return PTR_ERR(reset_gpio);
312
313                 device_property_read_u32_array(priv->device,
314                                                "snps,reset-delays-us",
315                                                delays, ARRAY_SIZE(delays));
316
317                 if (delays[0])
318                         msleep(DIV_ROUND_UP(delays[0], 1000));
319
320                 gpiod_set_value_cansleep(reset_gpio, 1);
321                 if (delays[1])
322                         msleep(DIV_ROUND_UP(delays[1], 1000));
323
324                 gpiod_set_value_cansleep(reset_gpio, 0);
325                 if (delays[2])
326                         msleep(DIV_ROUND_UP(delays[2], 1000));
327         }
328 #endif
329
330         /* This is a workaround for problems with the STE101P PHY.
331          * It doesn't complete its reset until at least one clock cycle
332          * on MDC, so perform a dummy mdio read. To be updated for GMAC4
333          * if needed.
334          */
335         if (!priv->plat->has_gmac4)
336                 writel(0, priv->ioaddr + mii_address);
337 #endif
338         return 0;
339 }
340
341 /**
342  * stmmac_mdio_register
343  * @ndev: net device structure
344  * Description: it registers the MII bus
345  */
346 int stmmac_mdio_register(struct net_device *ndev)
347 {
348         int err = 0;
349         struct mii_bus *new_bus;
350         struct stmmac_priv *priv = netdev_priv(ndev);
351         struct stmmac_mdio_bus_data *mdio_bus_data = priv->plat->mdio_bus_data;
352         struct device_node *mdio_node = priv->plat->mdio_node;
353         struct device *dev = ndev->dev.parent;
354         int addr, found, max_addr;
355
356         if (!mdio_bus_data)
357                 return 0;
358
359         new_bus = mdiobus_alloc();
360         if (!new_bus)
361                 return -ENOMEM;
362
363         if (mdio_bus_data->irqs)
364                 memcpy(new_bus->irq, mdio_bus_data->irqs, sizeof(new_bus->irq));
365
366         new_bus->name = "stmmac";
367
368         if (priv->plat->has_xgmac) {
369                 new_bus->read = &stmmac_xgmac2_mdio_read;
370                 new_bus->write = &stmmac_xgmac2_mdio_write;
371
372                 /* Right now only C22 phys are supported */
373                 max_addr = MII_XGMAC_MAX_C22ADDR + 1;
374
375                 /* Check if DT specified an unsupported phy addr */
376                 if (priv->plat->phy_addr > MII_XGMAC_MAX_C22ADDR)
377                         dev_err(dev, "Unsupported phy_addr (max=%d)\n",
378                                         MII_XGMAC_MAX_C22ADDR);
379         } else {
380                 new_bus->read = &stmmac_mdio_read;
381                 new_bus->write = &stmmac_mdio_write;
382                 max_addr = PHY_MAX_ADDR;
383         }
384
385         if (mdio_bus_data->has_xpcs) {
386                 priv->hw->xpcs = mdio_xpcs_get_ops();
387                 if (!priv->hw->xpcs) {
388                         err = -ENODEV;
389                         goto bus_register_fail;
390                 }
391         }
392
393         if (mdio_bus_data->needs_reset)
394                 new_bus->reset = &stmmac_mdio_reset;
395
396         snprintf(new_bus->id, MII_BUS_ID_SIZE, "%s-%x",
397                  new_bus->name, priv->plat->bus_id);
398         new_bus->priv = ndev;
399         new_bus->phy_mask = mdio_bus_data->phy_mask;
400         new_bus->parent = priv->device;
401
402         err = of_mdiobus_register(new_bus, mdio_node);
403         if (err != 0) {
404                 dev_err(dev, "Cannot register the MDIO bus\n");
405                 goto bus_register_fail;
406         }
407
408         /* Looks like we need a dummy read for XGMAC only and C45 PHYs */
409         if (priv->plat->has_xgmac)
410                 stmmac_xgmac2_mdio_read(new_bus, 0, MII_ADDR_C45);
411
412         if (priv->plat->phy_node || mdio_node)
413                 goto bus_register_done;
414
415         found = 0;
416         for (addr = 0; addr < max_addr; addr++) {
417                 struct phy_device *phydev = mdiobus_get_phy(new_bus, addr);
418
419                 if (!phydev)
420                         continue;
421
422                 /*
423                  * If an IRQ was provided to be assigned after
424                  * the bus probe, do it here.
425                  */
426                 if (!mdio_bus_data->irqs &&
427                     (mdio_bus_data->probed_phy_irq > 0)) {
428                         new_bus->irq[addr] = mdio_bus_data->probed_phy_irq;
429                         phydev->irq = mdio_bus_data->probed_phy_irq;
430                 }
431
432                 /*
433                  * If we're going to bind the MAC to this PHY bus,
434                  * and no PHY number was provided to the MAC,
435                  * use the one probed here.
436                  */
437                 if (priv->plat->phy_addr == -1)
438                         priv->plat->phy_addr = addr;
439
440                 phy_attached_info(phydev);
441                 found = 1;
442         }
443
444         /* Try to probe the XPCS by scanning all addresses. */
445         if (priv->hw->xpcs) {
446                 struct mdio_xpcs_args *xpcs = &priv->hw->xpcs_args;
447                 int ret, mode = priv->plat->phy_interface;
448                 max_addr = PHY_MAX_ADDR;
449
450                 xpcs->bus = new_bus;
451
452                 for (addr = 0; addr < max_addr; addr++) {
453                         xpcs->addr = addr;
454
455                         ret = stmmac_xpcs_probe(priv, xpcs, mode);
456                         if (!ret) {
457                                 found = 1;
458                                 break;
459                         }
460                 }
461         }
462
463         if (!found && !mdio_node) {
464                 dev_warn(dev, "No PHY found\n");
465                 mdiobus_unregister(new_bus);
466                 mdiobus_free(new_bus);
467                 return -ENODEV;
468         }
469
470 bus_register_done:
471         priv->mii = new_bus;
472
473         return 0;
474
475 bus_register_fail:
476         mdiobus_free(new_bus);
477         return err;
478 }
479
480 /**
481  * stmmac_mdio_unregister
482  * @ndev: net device structure
483  * Description: it unregisters the MII bus
484  */
485 int stmmac_mdio_unregister(struct net_device *ndev)
486 {
487         struct stmmac_priv *priv = netdev_priv(ndev);
488
489         if (!priv->mii)
490                 return 0;
491
492         mdiobus_unregister(priv->mii);
493         priv->mii->priv = NULL;
494         mdiobus_free(priv->mii);
495         priv->mii = NULL;
496
497         return 0;
498 }