Merge tag 'u-boot-imx-20211020' of https://source.denx.de/u-boot/custodians/u-boot-imx
[platform/kernel/u-boot.git] / drivers / net / sun8i_emac.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2016
4  * Author: Amit Singh Tomar, amittomer25@gmail.com
5  *
6  * Ethernet driver for H3/A64/A83T based SoC's
7  *
8  * It is derived from the work done by
9  * LABBE Corentin & Chen-Yu Tsai for Linux, THANKS!
10  *
11 */
12
13 #include <cpu_func.h>
14 #include <log.h>
15 #include <asm/cache.h>
16 #include <asm/global_data.h>
17 #include <asm/gpio.h>
18 #include <asm/io.h>
19 #include <asm/arch/clock.h>
20 #include <common.h>
21 #include <clk.h>
22 #include <dm.h>
23 #include <fdt_support.h>
24 #include <dm/device_compat.h>
25 #include <linux/bitops.h>
26 #include <linux/delay.h>
27 #include <linux/err.h>
28 #include <malloc.h>
29 #include <miiphy.h>
30 #include <net.h>
31 #include <reset.h>
32 #include <dt-bindings/pinctrl/sun4i-a10.h>
33 #include <wait_bit.h>
34
35 #define MDIO_CMD_MII_BUSY               BIT(0)
36 #define MDIO_CMD_MII_WRITE              BIT(1)
37
38 #define MDIO_CMD_MII_PHY_REG_ADDR_MASK  0x000001f0
39 #define MDIO_CMD_MII_PHY_REG_ADDR_SHIFT 4
40 #define MDIO_CMD_MII_PHY_ADDR_MASK      0x0001f000
41 #define MDIO_CMD_MII_PHY_ADDR_SHIFT     12
42 #define MDIO_CMD_MII_CLK_CSR_DIV_16     0x0
43 #define MDIO_CMD_MII_CLK_CSR_DIV_32     0x1
44 #define MDIO_CMD_MII_CLK_CSR_DIV_64     0x2
45 #define MDIO_CMD_MII_CLK_CSR_DIV_128    0x3
46 #define MDIO_CMD_MII_CLK_CSR_SHIFT      20
47
48 #define CONFIG_TX_DESCR_NUM     32
49 #define CONFIG_RX_DESCR_NUM     32
50 #define CONFIG_ETH_BUFSIZE      2048 /* Note must be dma aligned */
51
52 /*
53  * The datasheet says that each descriptor can transfers up to 4096 bytes
54  * But later, the register documentation reduces that value to 2048,
55  * using 2048 cause strange behaviours and even BSP driver use 2047
56  */
57 #define CONFIG_ETH_RXSIZE       2044 /* Note must fit in ETH_BUFSIZE */
58
59 #define TX_TOTAL_BUFSIZE        (CONFIG_ETH_BUFSIZE * CONFIG_TX_DESCR_NUM)
60 #define RX_TOTAL_BUFSIZE        (CONFIG_ETH_BUFSIZE * CONFIG_RX_DESCR_NUM)
61
62 #define H3_EPHY_DEFAULT_VALUE   0x58000
63 #define H3_EPHY_DEFAULT_MASK    GENMASK(31, 15)
64 #define H3_EPHY_ADDR_SHIFT      20
65 #define REG_PHY_ADDR_MASK       GENMASK(4, 0)
66 #define H3_EPHY_LED_POL         BIT(17) /* 1: active low, 0: active high */
67 #define H3_EPHY_SHUTDOWN        BIT(16) /* 1: shutdown, 0: power up */
68 #define H3_EPHY_SELECT          BIT(15) /* 1: internal PHY, 0: external PHY */
69
70 #define SC_RMII_EN              BIT(13)
71 #define SC_EPIT                 BIT(2) /* 1: RGMII, 0: MII */
72 #define SC_ETCS_MASK            GENMASK(1, 0)
73 #define SC_ETCS_EXT_GMII        0x1
74 #define SC_ETCS_INT_GMII        0x2
75 #define SC_ETXDC_MASK           GENMASK(12, 10)
76 #define SC_ETXDC_OFFSET         10
77 #define SC_ERXDC_MASK           GENMASK(9, 5)
78 #define SC_ERXDC_OFFSET         5
79
80 #define CONFIG_MDIO_TIMEOUT     (3 * CONFIG_SYS_HZ)
81
82 #define AHB_GATE_OFFSET_EPHY    0
83
84 /* IO mux settings */
85 #define SUN8I_IOMUX_H3          2
86 #define SUN8I_IOMUX_R40         5
87 #define SUN8I_IOMUX_H6          5
88 #define SUN8I_IOMUX_H616        2
89 #define SUN8I_IOMUX             4
90
91 /* H3/A64 EMAC Register's offset */
92 #define EMAC_CTL0               0x00
93 #define EMAC_CTL0_FULL_DUPLEX           BIT(0)
94 #define EMAC_CTL0_SPEED_MASK            GENMASK(3, 2)
95 #define EMAC_CTL0_SPEED_10              (0x2 << 2)
96 #define EMAC_CTL0_SPEED_100             (0x3 << 2)
97 #define EMAC_CTL0_SPEED_1000            (0x0 << 2)
98 #define EMAC_CTL1               0x04
99 #define EMAC_CTL1_SOFT_RST              BIT(0)
100 #define EMAC_CTL1_BURST_LEN_SHIFT       24
101 #define EMAC_INT_STA            0x08
102 #define EMAC_INT_EN             0x0c
103 #define EMAC_TX_CTL0            0x10
104 #define EMAC_TX_CTL0_TX_EN              BIT(31)
105 #define EMAC_TX_CTL1            0x14
106 #define EMAC_TX_CTL1_TX_MD              BIT(1)
107 #define EMAC_TX_CTL1_TX_DMA_EN          BIT(30)
108 #define EMAC_TX_CTL1_TX_DMA_START       BIT(31)
109 #define EMAC_TX_FLOW_CTL        0x1c
110 #define EMAC_TX_DMA_DESC        0x20
111 #define EMAC_RX_CTL0            0x24
112 #define EMAC_RX_CTL0_RX_EN              BIT(31)
113 #define EMAC_RX_CTL1            0x28
114 #define EMAC_RX_CTL1_RX_MD              BIT(1)
115 #define EMAC_RX_CTL1_RX_RUNT_FRM        BIT(2)
116 #define EMAC_RX_CTL1_RX_ERR_FRM         BIT(3)
117 #define EMAC_RX_CTL1_RX_DMA_EN          BIT(30)
118 #define EMAC_RX_CTL1_RX_DMA_START       BIT(31)
119 #define EMAC_RX_DMA_DESC        0x34
120 #define EMAC_MII_CMD            0x48
121 #define EMAC_MII_DATA           0x4c
122 #define EMAC_ADDR0_HIGH         0x50
123 #define EMAC_ADDR0_LOW          0x54
124 #define EMAC_TX_DMA_STA         0xb0
125 #define EMAC_TX_CUR_DESC        0xb4
126 #define EMAC_TX_CUR_BUF         0xb8
127 #define EMAC_RX_DMA_STA         0xc0
128 #define EMAC_RX_CUR_DESC        0xc4
129
130 #define EMAC_DESC_OWN_DMA       BIT(31)
131 #define EMAC_DESC_LAST_DESC     BIT(30)
132 #define EMAC_DESC_FIRST_DESC    BIT(29)
133 #define EMAC_DESC_CHAIN_SECOND  BIT(24)
134
135 #define EMAC_DESC_RX_ERROR_MASK 0x400068db
136
137 DECLARE_GLOBAL_DATA_PTR;
138
139 enum emac_variant {
140         A83T_EMAC = 1,
141         H3_EMAC,
142         A64_EMAC,
143         R40_GMAC,
144         H6_EMAC,
145 };
146
147 struct emac_dma_desc {
148         u32 status;
149         u32 ctl_size;
150         u32 buf_addr;
151         u32 next;
152 } __aligned(ARCH_DMA_MINALIGN);
153
154 struct emac_eth_dev {
155         struct emac_dma_desc rx_chain[CONFIG_TX_DESCR_NUM];
156         struct emac_dma_desc tx_chain[CONFIG_RX_DESCR_NUM];
157         char rxbuffer[RX_TOTAL_BUFSIZE] __aligned(ARCH_DMA_MINALIGN);
158         char txbuffer[TX_TOTAL_BUFSIZE] __aligned(ARCH_DMA_MINALIGN);
159
160         u32 interface;
161         u32 phyaddr;
162         u32 link;
163         u32 speed;
164         u32 duplex;
165         u32 phy_configured;
166         u32 tx_currdescnum;
167         u32 rx_currdescnum;
168         u32 addr;
169         u32 tx_slot;
170         bool use_internal_phy;
171
172         enum emac_variant variant;
173         void *mac_reg;
174         phys_addr_t sysctl_reg;
175         struct phy_device *phydev;
176         struct mii_dev *bus;
177         struct clk tx_clk;
178         struct clk ephy_clk;
179         struct reset_ctl tx_rst;
180         struct reset_ctl ephy_rst;
181 #if CONFIG_IS_ENABLED(DM_GPIO)
182         struct gpio_desc reset_gpio;
183 #endif
184 };
185
186
187 struct sun8i_eth_pdata {
188         struct eth_pdata eth_pdata;
189         u32 reset_delays[3];
190         int tx_delay_ps;
191         int rx_delay_ps;
192 };
193
194
195 static int sun8i_mdio_read(struct mii_dev *bus, int addr, int devad, int reg)
196 {
197         struct udevice *dev = bus->priv;
198         struct emac_eth_dev *priv = dev_get_priv(dev);
199         u32 mii_cmd;
200         int ret;
201
202         mii_cmd = (reg << MDIO_CMD_MII_PHY_REG_ADDR_SHIFT) &
203                 MDIO_CMD_MII_PHY_REG_ADDR_MASK;
204         mii_cmd |= (addr << MDIO_CMD_MII_PHY_ADDR_SHIFT) &
205                 MDIO_CMD_MII_PHY_ADDR_MASK;
206
207         /*
208          * The EMAC clock is either 200 or 300 MHz, so we need a divider
209          * of 128 to get the MDIO frequency below the required 2.5 MHz.
210          */
211         if (!priv->use_internal_phy)
212                 mii_cmd |= MDIO_CMD_MII_CLK_CSR_DIV_128 <<
213                            MDIO_CMD_MII_CLK_CSR_SHIFT;
214
215         mii_cmd |= MDIO_CMD_MII_BUSY;
216
217         writel(mii_cmd, priv->mac_reg + EMAC_MII_CMD);
218
219         ret = wait_for_bit_le32(priv->mac_reg + EMAC_MII_CMD,
220                                 MDIO_CMD_MII_BUSY, false,
221                                 CONFIG_MDIO_TIMEOUT, true);
222         if (ret < 0)
223                 return ret;
224
225         return readl(priv->mac_reg + EMAC_MII_DATA);
226 }
227
228 static int sun8i_mdio_write(struct mii_dev *bus, int addr, int devad, int reg,
229                             u16 val)
230 {
231         struct udevice *dev = bus->priv;
232         struct emac_eth_dev *priv = dev_get_priv(dev);
233         u32 mii_cmd;
234
235         mii_cmd = (reg << MDIO_CMD_MII_PHY_REG_ADDR_SHIFT) &
236                 MDIO_CMD_MII_PHY_REG_ADDR_MASK;
237         mii_cmd |= (addr << MDIO_CMD_MII_PHY_ADDR_SHIFT) &
238                 MDIO_CMD_MII_PHY_ADDR_MASK;
239
240         /*
241          * The EMAC clock is either 200 or 300 MHz, so we need a divider
242          * of 128 to get the MDIO frequency below the required 2.5 MHz.
243          */
244         if (!priv->use_internal_phy)
245                 mii_cmd |= MDIO_CMD_MII_CLK_CSR_DIV_128 <<
246                            MDIO_CMD_MII_CLK_CSR_SHIFT;
247
248         mii_cmd |= MDIO_CMD_MII_WRITE;
249         mii_cmd |= MDIO_CMD_MII_BUSY;
250
251         writel(val, priv->mac_reg + EMAC_MII_DATA);
252         writel(mii_cmd, priv->mac_reg + EMAC_MII_CMD);
253
254         return wait_for_bit_le32(priv->mac_reg + EMAC_MII_CMD,
255                                  MDIO_CMD_MII_BUSY, false,
256                                  CONFIG_MDIO_TIMEOUT, true);
257 }
258
259 static int sun8i_eth_write_hwaddr(struct udevice *dev)
260 {
261         struct emac_eth_dev *priv = dev_get_priv(dev);
262         struct eth_pdata *pdata = dev_get_plat(dev);
263         uchar *mac_id = pdata->enetaddr;
264         u32 macid_lo, macid_hi;
265
266         macid_lo = mac_id[0] + (mac_id[1] << 8) + (mac_id[2] << 16) +
267                 (mac_id[3] << 24);
268         macid_hi = mac_id[4] + (mac_id[5] << 8);
269
270         writel(macid_hi, priv->mac_reg + EMAC_ADDR0_HIGH);
271         writel(macid_lo, priv->mac_reg + EMAC_ADDR0_LOW);
272
273         return 0;
274 }
275
276 static void sun8i_adjust_link(struct emac_eth_dev *priv,
277                               struct phy_device *phydev)
278 {
279         u32 v;
280
281         v = readl(priv->mac_reg + EMAC_CTL0);
282
283         if (phydev->duplex)
284                 v |= EMAC_CTL0_FULL_DUPLEX;
285         else
286                 v &= ~EMAC_CTL0_FULL_DUPLEX;
287
288         v &= ~EMAC_CTL0_SPEED_MASK;
289
290         switch (phydev->speed) {
291         case 1000:
292                 v |= EMAC_CTL0_SPEED_1000;
293                 break;
294         case 100:
295                 v |= EMAC_CTL0_SPEED_100;
296                 break;
297         case 10:
298                 v |= EMAC_CTL0_SPEED_10;
299                 break;
300         }
301         writel(v, priv->mac_reg + EMAC_CTL0);
302 }
303
304 static u32 sun8i_emac_set_syscon_ephy(struct emac_eth_dev *priv, u32 reg)
305 {
306         if (priv->use_internal_phy) {
307                 /* H3 based SoC's that has an Internal 100MBit PHY
308                  * needs to be configured and powered up before use
309                 */
310                 reg &= ~H3_EPHY_DEFAULT_MASK;
311                 reg |=  H3_EPHY_DEFAULT_VALUE;
312                 reg |= priv->phyaddr << H3_EPHY_ADDR_SHIFT;
313                 reg &= ~H3_EPHY_SHUTDOWN;
314                 return reg | H3_EPHY_SELECT;
315         }
316
317         /* This is to select External Gigabit PHY on those boards with
318          * an internal PHY. Does not hurt on other SoCs. Linux does
319          * it as well.
320          */
321         return reg & ~H3_EPHY_SELECT;
322 }
323
324 static int sun8i_emac_set_syscon(struct sun8i_eth_pdata *pdata,
325                                  struct emac_eth_dev *priv)
326 {
327         u32 reg;
328
329         if (priv->variant == R40_GMAC) {
330                 /* Select RGMII for R40 */
331                 reg = readl(priv->sysctl_reg + 0x164);
332                 reg |= SC_ETCS_INT_GMII |
333                        SC_EPIT |
334                        (CONFIG_GMAC_TX_DELAY << SC_ETXDC_OFFSET);
335
336                 writel(reg, priv->sysctl_reg + 0x164);
337                 return 0;
338         }
339
340         reg = readl(priv->sysctl_reg + 0x30);
341
342         reg = sun8i_emac_set_syscon_ephy(priv, reg);
343
344         reg &= ~(SC_ETCS_MASK | SC_EPIT);
345         if (priv->variant == H3_EMAC ||
346             priv->variant == A64_EMAC ||
347             priv->variant == H6_EMAC)
348                 reg &= ~SC_RMII_EN;
349
350         switch (priv->interface) {
351         case PHY_INTERFACE_MODE_MII:
352                 /* default */
353                 break;
354         case PHY_INTERFACE_MODE_RGMII:
355         case PHY_INTERFACE_MODE_RGMII_ID:
356         case PHY_INTERFACE_MODE_RGMII_RXID:
357         case PHY_INTERFACE_MODE_RGMII_TXID:
358                 reg |= SC_EPIT | SC_ETCS_INT_GMII;
359                 break;
360         case PHY_INTERFACE_MODE_RMII:
361                 if (priv->variant == H3_EMAC ||
362                     priv->variant == A64_EMAC ||
363                     priv->variant == H6_EMAC) {
364                         reg |= SC_RMII_EN | SC_ETCS_EXT_GMII;
365                 break;
366                 }
367                 /* RMII not supported on A83T */
368         default:
369                 debug("%s: Invalid PHY interface\n", __func__);
370                 return -EINVAL;
371         }
372
373         if (pdata->tx_delay_ps)
374                 reg |= ((pdata->tx_delay_ps / 100) << SC_ETXDC_OFFSET)
375                          & SC_ETXDC_MASK;
376
377         if (pdata->rx_delay_ps)
378                 reg |= ((pdata->rx_delay_ps / 100) << SC_ERXDC_OFFSET)
379                          & SC_ERXDC_MASK;
380
381         writel(reg, priv->sysctl_reg + 0x30);
382
383         return 0;
384 }
385
386 static int sun8i_phy_init(struct emac_eth_dev *priv, void *dev)
387 {
388         struct phy_device *phydev;
389
390         phydev = phy_connect(priv->bus, priv->phyaddr, dev, priv->interface);
391         if (!phydev)
392                 return -ENODEV;
393
394         phy_connect_dev(phydev, dev);
395
396         priv->phydev = phydev;
397         phy_config(priv->phydev);
398
399         return 0;
400 }
401
402 #define cache_clean_descriptor(desc)                                    \
403         flush_dcache_range((uintptr_t)(desc),                           \
404                            (uintptr_t)(desc) + sizeof(struct emac_dma_desc))
405
406 #define cache_inv_descriptor(desc)                                      \
407         invalidate_dcache_range((uintptr_t)(desc),                      \
408                                (uintptr_t)(desc) + sizeof(struct emac_dma_desc))
409
410 static void rx_descs_init(struct emac_eth_dev *priv)
411 {
412         struct emac_dma_desc *desc_table_p = &priv->rx_chain[0];
413         char *rxbuffs = &priv->rxbuffer[0];
414         struct emac_dma_desc *desc_p;
415         int i;
416
417         /*
418          * Make sure we don't have dirty cache lines around, which could
419          * be cleaned to DRAM *after* the MAC has already written data to it.
420          */
421         invalidate_dcache_range((uintptr_t)desc_table_p,
422                               (uintptr_t)desc_table_p + sizeof(priv->rx_chain));
423         invalidate_dcache_range((uintptr_t)rxbuffs,
424                                 (uintptr_t)rxbuffs + sizeof(priv->rxbuffer));
425
426         for (i = 0; i < CONFIG_RX_DESCR_NUM; i++) {
427                 desc_p = &desc_table_p[i];
428                 desc_p->buf_addr = (uintptr_t)&rxbuffs[i * CONFIG_ETH_BUFSIZE];
429                 desc_p->next = (uintptr_t)&desc_table_p[i + 1];
430                 desc_p->ctl_size = CONFIG_ETH_RXSIZE;
431                 desc_p->status = EMAC_DESC_OWN_DMA;
432         }
433
434         /* Correcting the last pointer of the chain */
435         desc_p->next = (uintptr_t)&desc_table_p[0];
436
437         flush_dcache_range((uintptr_t)priv->rx_chain,
438                            (uintptr_t)priv->rx_chain +
439                         sizeof(priv->rx_chain));
440
441         writel((uintptr_t)&desc_table_p[0], (priv->mac_reg + EMAC_RX_DMA_DESC));
442         priv->rx_currdescnum = 0;
443 }
444
445 static void tx_descs_init(struct emac_eth_dev *priv)
446 {
447         struct emac_dma_desc *desc_table_p = &priv->tx_chain[0];
448         char *txbuffs = &priv->txbuffer[0];
449         struct emac_dma_desc *desc_p;
450         int i;
451
452         for (i = 0; i < CONFIG_TX_DESCR_NUM; i++) {
453                 desc_p = &desc_table_p[i];
454                 desc_p->buf_addr = (uintptr_t)&txbuffs[i * CONFIG_ETH_BUFSIZE];
455                 desc_p->next = (uintptr_t)&desc_table_p[i + 1];
456                 desc_p->ctl_size = 0;
457                 desc_p->status = 0;
458         }
459
460         /* Correcting the last pointer of the chain */
461         desc_p->next =  (uintptr_t)&desc_table_p[0];
462
463         /* Flush the first TX buffer descriptor we will tell the MAC about. */
464         cache_clean_descriptor(desc_table_p);
465
466         writel((uintptr_t)&desc_table_p[0], priv->mac_reg + EMAC_TX_DMA_DESC);
467         priv->tx_currdescnum = 0;
468 }
469
470 static int sun8i_emac_eth_start(struct udevice *dev)
471 {
472         struct emac_eth_dev *priv = dev_get_priv(dev);
473         int ret;
474
475         /* Soft reset MAC */
476         writel(EMAC_CTL1_SOFT_RST, priv->mac_reg + EMAC_CTL1);
477         ret = wait_for_bit_le32(priv->mac_reg + EMAC_CTL1,
478                                 EMAC_CTL1_SOFT_RST, false, 10, true);
479         if (ret) {
480                 printf("%s: Timeout\n", __func__);
481                 return ret;
482         }
483
484         /* Rewrite mac address after reset */
485         sun8i_eth_write_hwaddr(dev);
486
487         /* transmission starts after the full frame arrived in TX DMA FIFO */
488         setbits_le32(priv->mac_reg + EMAC_TX_CTL1, EMAC_TX_CTL1_TX_MD);
489
490         /*
491          * RX DMA reads data from RX DMA FIFO to host memory after a
492          * complete frame has been written to RX DMA FIFO
493          */
494         setbits_le32(priv->mac_reg + EMAC_RX_CTL1, EMAC_RX_CTL1_RX_MD);
495
496         /* DMA burst length */
497         writel(8 << EMAC_CTL1_BURST_LEN_SHIFT, priv->mac_reg + EMAC_CTL1);
498
499         /* Initialize rx/tx descriptors */
500         rx_descs_init(priv);
501         tx_descs_init(priv);
502
503         /* PHY Start Up */
504         ret = phy_startup(priv->phydev);
505         if (ret)
506                 return ret;
507
508         sun8i_adjust_link(priv, priv->phydev);
509
510         /* Start RX/TX DMA */
511         setbits_le32(priv->mac_reg + EMAC_RX_CTL1, EMAC_RX_CTL1_RX_DMA_EN |
512                      EMAC_RX_CTL1_RX_ERR_FRM | EMAC_RX_CTL1_RX_RUNT_FRM);
513         setbits_le32(priv->mac_reg + EMAC_TX_CTL1, EMAC_TX_CTL1_TX_DMA_EN);
514
515         /* Enable RX/TX */
516         setbits_le32(priv->mac_reg + EMAC_RX_CTL0, EMAC_RX_CTL0_RX_EN);
517         setbits_le32(priv->mac_reg + EMAC_TX_CTL0, EMAC_TX_CTL0_TX_EN);
518
519         return 0;
520 }
521
522 static int parse_phy_pins(struct udevice *dev)
523 {
524         int offset;
525         const char *pin_name;
526         int drive, pull = SUN4I_PINCTRL_NO_PULL, i;
527         u32 iomux;
528
529         offset = fdtdec_lookup_phandle(gd->fdt_blob, dev_of_offset(dev),
530                                        "pinctrl-0");
531         if (offset < 0) {
532                 printf("WARNING: emac: cannot find pinctrl-0 node\n");
533                 return offset;
534         }
535
536         drive = fdt_getprop_u32_default_node(gd->fdt_blob, offset, 0,
537                                              "drive-strength", ~0);
538         if (drive != ~0) {
539                 if (drive <= 10)
540                         drive = SUN4I_PINCTRL_10_MA;
541                 else if (drive <= 20)
542                         drive = SUN4I_PINCTRL_20_MA;
543                 else if (drive <= 30)
544                         drive = SUN4I_PINCTRL_30_MA;
545                 else
546                         drive = SUN4I_PINCTRL_40_MA;
547         }
548
549         if (fdt_get_property(gd->fdt_blob, offset, "bias-pull-up", NULL))
550                 pull = SUN4I_PINCTRL_PULL_UP;
551         else if (fdt_get_property(gd->fdt_blob, offset, "bias-pull-down", NULL))
552                 pull = SUN4I_PINCTRL_PULL_DOWN;
553
554         /*
555          * The GPIO pinmux value is an integration choice, so depends on the
556          * SoC, not the EMAC variant.
557          */
558         if (IS_ENABLED(CONFIG_MACH_SUNXI_H3_H5))
559                 iomux = SUN8I_IOMUX_H3;
560         else if (IS_ENABLED(CONFIG_MACH_SUN8I_R40))
561                 iomux = SUN8I_IOMUX_R40;
562         else if (IS_ENABLED(CONFIG_MACH_SUN50I_H6))
563                 iomux = SUN8I_IOMUX_H6;
564         else if (IS_ENABLED(CONFIG_MACH_SUN50I_H616))
565                 iomux = SUN8I_IOMUX_H616;
566         else if (IS_ENABLED(CONFIG_MACH_SUN8I_A83T))
567                 iomux = SUN8I_IOMUX;
568         else if (IS_ENABLED(CONFIG_MACH_SUN50I))
569                 iomux = SUN8I_IOMUX;
570         else
571                 BUILD_BUG_ON_MSG(1, "missing pinmux value for Ethernet pins");
572
573         for (i = 0; ; i++) {
574                 int pin;
575
576                 pin_name = fdt_stringlist_get(gd->fdt_blob, offset,
577                                               "pins", i, NULL);
578                 if (!pin_name)
579                         break;
580
581                 pin = sunxi_name_to_gpio(pin_name);
582                 if (pin < 0)
583                         continue;
584
585                 sunxi_gpio_set_cfgpin(pin, iomux);
586
587                 if (drive != ~0)
588                         sunxi_gpio_set_drv(pin, drive);
589                 if (pull != ~0)
590                         sunxi_gpio_set_pull(pin, pull);
591         }
592
593         if (!i) {
594                 printf("WARNING: emac: cannot find pins property\n");
595                 return -2;
596         }
597
598         return 0;
599 }
600
601 static int sun8i_emac_eth_recv(struct udevice *dev, int flags, uchar **packetp)
602 {
603         struct emac_eth_dev *priv = dev_get_priv(dev);
604         u32 status, desc_num = priv->rx_currdescnum;
605         struct emac_dma_desc *desc_p = &priv->rx_chain[desc_num];
606         uintptr_t data_start = (uintptr_t)desc_p->buf_addr;
607         int length;
608
609         /* Invalidate entire buffer descriptor */
610         cache_inv_descriptor(desc_p);
611
612         status = desc_p->status;
613
614         /* Check for DMA own bit */
615         if (status & EMAC_DESC_OWN_DMA)
616                 return -EAGAIN;
617
618         length = (status >> 16) & 0x3fff;
619
620         /* make sure we read from DRAM, not our cache */
621         invalidate_dcache_range(data_start,
622                                 data_start + roundup(length, ARCH_DMA_MINALIGN));
623
624         if (status & EMAC_DESC_RX_ERROR_MASK) {
625                 debug("RX: packet error: 0x%x\n",
626                       status & EMAC_DESC_RX_ERROR_MASK);
627                 return 0;
628         }
629         if (length < 0x40) {
630                 debug("RX: Bad Packet (runt)\n");
631                 return 0;
632         }
633
634         if (length > CONFIG_ETH_RXSIZE) {
635                 debug("RX: Too large packet (%d bytes)\n", length);
636                 return 0;
637         }
638
639         *packetp = (uchar *)(ulong)desc_p->buf_addr;
640
641         return length;
642 }
643
644 static int sun8i_emac_eth_send(struct udevice *dev, void *packet, int length)
645 {
646         struct emac_eth_dev *priv = dev_get_priv(dev);
647         u32 desc_num = priv->tx_currdescnum;
648         struct emac_dma_desc *desc_p = &priv->tx_chain[desc_num];
649         uintptr_t data_start = (uintptr_t)desc_p->buf_addr;
650         uintptr_t data_end = data_start +
651                 roundup(length, ARCH_DMA_MINALIGN);
652
653         desc_p->ctl_size = length | EMAC_DESC_CHAIN_SECOND;
654
655         memcpy((void *)data_start, packet, length);
656
657         /* Flush data to be sent */
658         flush_dcache_range(data_start, data_end);
659
660         /* frame begin and end */
661         desc_p->ctl_size |= EMAC_DESC_LAST_DESC | EMAC_DESC_FIRST_DESC;
662         desc_p->status = EMAC_DESC_OWN_DMA;
663
664         /* make sure the MAC reads the actual data from DRAM */
665         cache_clean_descriptor(desc_p);
666
667         /* Move to next Descriptor and wrap around */
668         if (++desc_num >= CONFIG_TX_DESCR_NUM)
669                 desc_num = 0;
670         priv->tx_currdescnum = desc_num;
671
672         /* Start the DMA */
673         setbits_le32(priv->mac_reg + EMAC_TX_CTL1, EMAC_TX_CTL1_TX_DMA_START);
674
675         /*
676          * Since we copied the data above, we return here without waiting
677          * for the packet to be actually send out.
678          */
679
680         return 0;
681 }
682
683 static int sun8i_emac_board_setup(struct udevice *dev,
684                                   struct emac_eth_dev *priv)
685 {
686         int ret;
687
688         ret = clk_enable(&priv->tx_clk);
689         if (ret) {
690                 dev_err(dev, "failed to enable TX clock\n");
691                 return ret;
692         }
693
694         if (reset_valid(&priv->tx_rst)) {
695                 ret = reset_deassert(&priv->tx_rst);
696                 if (ret) {
697                         dev_err(dev, "failed to deassert TX reset\n");
698                         goto err_tx_clk;
699                 }
700         }
701
702         /* Only H3/H5 have clock controls for internal EPHY */
703         if (clk_valid(&priv->ephy_clk)) {
704                 ret = clk_enable(&priv->ephy_clk);
705                 if (ret) {
706                         dev_err(dev, "failed to enable EPHY TX clock\n");
707                         return ret;
708                 }
709         }
710
711         if (reset_valid(&priv->ephy_rst)) {
712                 ret = reset_deassert(&priv->ephy_rst);
713                 if (ret) {
714                         dev_err(dev, "failed to deassert EPHY TX clock\n");
715                         return ret;
716                 }
717         }
718
719         return 0;
720
721 err_tx_clk:
722         clk_disable(&priv->tx_clk);
723         return ret;
724 }
725
726 #if CONFIG_IS_ENABLED(DM_GPIO)
727 static int sun8i_mdio_reset(struct mii_dev *bus)
728 {
729         struct udevice *dev = bus->priv;
730         struct emac_eth_dev *priv = dev_get_priv(dev);
731         struct sun8i_eth_pdata *pdata = dev_get_plat(dev);
732         int ret;
733
734         if (!dm_gpio_is_valid(&priv->reset_gpio))
735                 return 0;
736
737         /* reset the phy */
738         ret = dm_gpio_set_value(&priv->reset_gpio, 0);
739         if (ret)
740                 return ret;
741
742         udelay(pdata->reset_delays[0]);
743
744         ret = dm_gpio_set_value(&priv->reset_gpio, 1);
745         if (ret)
746                 return ret;
747
748         udelay(pdata->reset_delays[1]);
749
750         ret = dm_gpio_set_value(&priv->reset_gpio, 0);
751         if (ret)
752                 return ret;
753
754         udelay(pdata->reset_delays[2]);
755
756         return 0;
757 }
758 #endif
759
760 static int sun8i_mdio_init(const char *name, struct udevice *priv)
761 {
762         struct mii_dev *bus = mdio_alloc();
763
764         if (!bus) {
765                 debug("Failed to allocate MDIO bus\n");
766                 return -ENOMEM;
767         }
768
769         bus->read = sun8i_mdio_read;
770         bus->write = sun8i_mdio_write;
771         snprintf(bus->name, sizeof(bus->name), name);
772         bus->priv = (void *)priv;
773 #if CONFIG_IS_ENABLED(DM_GPIO)
774         bus->reset = sun8i_mdio_reset;
775 #endif
776
777         return  mdio_register(bus);
778 }
779
780 static int sun8i_eth_free_pkt(struct udevice *dev, uchar *packet,
781                               int length)
782 {
783         struct emac_eth_dev *priv = dev_get_priv(dev);
784         u32 desc_num = priv->rx_currdescnum;
785         struct emac_dma_desc *desc_p = &priv->rx_chain[desc_num];
786
787         /* give the current descriptor back to the MAC */
788         desc_p->status |= EMAC_DESC_OWN_DMA;
789
790         /* Flush Status field of descriptor */
791         cache_clean_descriptor(desc_p);
792
793         /* Move to next desc and wrap-around condition. */
794         if (++desc_num >= CONFIG_RX_DESCR_NUM)
795                 desc_num = 0;
796         priv->rx_currdescnum = desc_num;
797
798         return 0;
799 }
800
801 static void sun8i_emac_eth_stop(struct udevice *dev)
802 {
803         struct emac_eth_dev *priv = dev_get_priv(dev);
804
805         /* Stop Rx/Tx transmitter */
806         clrbits_le32(priv->mac_reg + EMAC_RX_CTL0, EMAC_RX_CTL0_RX_EN);
807         clrbits_le32(priv->mac_reg + EMAC_TX_CTL0, EMAC_TX_CTL0_TX_EN);
808
809         /* Stop RX/TX DMA */
810         clrbits_le32(priv->mac_reg + EMAC_TX_CTL1, EMAC_TX_CTL1_TX_DMA_EN);
811         clrbits_le32(priv->mac_reg + EMAC_RX_CTL1, EMAC_RX_CTL1_RX_DMA_EN);
812
813         phy_shutdown(priv->phydev);
814 }
815
816 static int sun8i_emac_eth_probe(struct udevice *dev)
817 {
818         struct sun8i_eth_pdata *sun8i_pdata = dev_get_plat(dev);
819         struct eth_pdata *pdata = &sun8i_pdata->eth_pdata;
820         struct emac_eth_dev *priv = dev_get_priv(dev);
821         int ret;
822
823         priv->mac_reg = (void *)pdata->iobase;
824
825         ret = sun8i_emac_board_setup(dev, priv);
826         if (ret)
827                 return ret;
828
829         sun8i_emac_set_syscon(sun8i_pdata, priv);
830
831         sun8i_mdio_init(dev->name, dev);
832         priv->bus = miiphy_get_dev_by_name(dev->name);
833
834         return sun8i_phy_init(priv, dev);
835 }
836
837 static const struct eth_ops sun8i_emac_eth_ops = {
838         .start                  = sun8i_emac_eth_start,
839         .write_hwaddr           = sun8i_eth_write_hwaddr,
840         .send                   = sun8i_emac_eth_send,
841         .recv                   = sun8i_emac_eth_recv,
842         .free_pkt               = sun8i_eth_free_pkt,
843         .stop                   = sun8i_emac_eth_stop,
844 };
845
846 static int sun8i_handle_internal_phy(struct udevice *dev, struct emac_eth_dev *priv)
847 {
848         struct ofnode_phandle_args phandle;
849         int ret;
850
851         ret = ofnode_parse_phandle_with_args(dev_ofnode(dev), "phy-handle",
852                                              NULL, 0, 0, &phandle);
853         if (ret)
854                 return ret;
855
856         /* If the PHY node is not a child of the internal MDIO bus, we are
857          * using some external PHY.
858          */
859         if (!ofnode_device_is_compatible(ofnode_get_parent(phandle.node),
860                                          "allwinner,sun8i-h3-mdio-internal"))
861                 return 0;
862
863         ret = clk_get_by_index_nodev(phandle.node, 0, &priv->ephy_clk);
864         if (ret) {
865                 dev_err(dev, "failed to get EPHY TX clock\n");
866                 return ret;
867         }
868
869         ret = reset_get_by_index_nodev(phandle.node, 0, &priv->ephy_rst);
870         if (ret) {
871                 dev_err(dev, "failed to get EPHY TX reset\n");
872                 return ret;
873         }
874
875         priv->use_internal_phy = true;
876
877         return 0;
878 }
879
880 static int sun8i_emac_eth_of_to_plat(struct udevice *dev)
881 {
882         struct sun8i_eth_pdata *sun8i_pdata = dev_get_plat(dev);
883         struct eth_pdata *pdata = &sun8i_pdata->eth_pdata;
884         struct emac_eth_dev *priv = dev_get_priv(dev);
885         const char *phy_mode;
886         const fdt32_t *reg;
887         int node = dev_of_offset(dev);
888         int offset = 0;
889 #if CONFIG_IS_ENABLED(DM_GPIO)
890         int reset_flags = GPIOD_IS_OUT;
891 #endif
892         int ret;
893
894         pdata->iobase = dev_read_addr(dev);
895         if (pdata->iobase == FDT_ADDR_T_NONE) {
896                 debug("%s: Cannot find MAC base address\n", __func__);
897                 return -EINVAL;
898         }
899
900         priv->variant = dev_get_driver_data(dev);
901
902         if (!priv->variant) {
903                 printf("%s: Missing variant\n", __func__);
904                 return -EINVAL;
905         }
906
907         ret = clk_get_by_name(dev, "stmmaceth", &priv->tx_clk);
908         if (ret) {
909                 dev_err(dev, "failed to get TX clock\n");
910                 return ret;
911         }
912
913         ret = reset_get_by_name(dev, "stmmaceth", &priv->tx_rst);
914         if (ret && ret != -ENOENT) {
915                 dev_err(dev, "failed to get TX reset\n");
916                 return ret;
917         }
918
919         offset = fdtdec_lookup_phandle(gd->fdt_blob, node, "syscon");
920         if (offset < 0) {
921                 debug("%s: cannot find syscon node\n", __func__);
922                 return -EINVAL;
923         }
924
925         reg = fdt_getprop(gd->fdt_blob, offset, "reg", NULL);
926         if (!reg) {
927                 debug("%s: cannot find reg property in syscon node\n",
928                       __func__);
929                 return -EINVAL;
930         }
931         priv->sysctl_reg = fdt_translate_address((void *)gd->fdt_blob,
932                                                  offset, reg);
933         if (priv->sysctl_reg == FDT_ADDR_T_NONE) {
934                 debug("%s: Cannot find syscon base address\n", __func__);
935                 return -EINVAL;
936         }
937
938         pdata->phy_interface = -1;
939         priv->phyaddr = -1;
940         priv->use_internal_phy = false;
941
942         offset = fdtdec_lookup_phandle(gd->fdt_blob, node, "phy-handle");
943         if (offset < 0) {
944                 debug("%s: Cannot find PHY address\n", __func__);
945                 return -EINVAL;
946         }
947         priv->phyaddr = fdtdec_get_int(gd->fdt_blob, offset, "reg", -1);
948
949         phy_mode = fdt_getprop(gd->fdt_blob, node, "phy-mode", NULL);
950
951         if (phy_mode)
952                 pdata->phy_interface = phy_get_interface_by_name(phy_mode);
953         printf("phy interface%d\n", pdata->phy_interface);
954
955         if (pdata->phy_interface == -1) {
956                 debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
957                 return -EINVAL;
958         }
959
960         if (priv->variant == H3_EMAC) {
961                 ret = sun8i_handle_internal_phy(dev, priv);
962                 if (ret)
963                         return ret;
964         }
965
966         priv->interface = pdata->phy_interface;
967
968         if (!priv->use_internal_phy)
969                 parse_phy_pins(dev);
970
971         sun8i_pdata->tx_delay_ps = fdtdec_get_int(gd->fdt_blob, node,
972                                                   "allwinner,tx-delay-ps", 0);
973         if (sun8i_pdata->tx_delay_ps < 0 || sun8i_pdata->tx_delay_ps > 700)
974                 printf("%s: Invalid TX delay value %d\n", __func__,
975                        sun8i_pdata->tx_delay_ps);
976
977         sun8i_pdata->rx_delay_ps = fdtdec_get_int(gd->fdt_blob, node,
978                                                   "allwinner,rx-delay-ps", 0);
979         if (sun8i_pdata->rx_delay_ps < 0 || sun8i_pdata->rx_delay_ps > 3100)
980                 printf("%s: Invalid RX delay value %d\n", __func__,
981                        sun8i_pdata->rx_delay_ps);
982
983 #if CONFIG_IS_ENABLED(DM_GPIO)
984         if (fdtdec_get_bool(gd->fdt_blob, dev_of_offset(dev),
985                             "snps,reset-active-low"))
986                 reset_flags |= GPIOD_ACTIVE_LOW;
987
988         ret = gpio_request_by_name(dev, "snps,reset-gpio", 0,
989                                    &priv->reset_gpio, reset_flags);
990
991         if (ret == 0) {
992                 ret = fdtdec_get_int_array(gd->fdt_blob, dev_of_offset(dev),
993                                            "snps,reset-delays-us",
994                                            sun8i_pdata->reset_delays, 3);
995         } else if (ret == -ENOENT) {
996                 ret = 0;
997         }
998 #endif
999
1000         return 0;
1001 }
1002
1003 static const struct udevice_id sun8i_emac_eth_ids[] = {
1004         {.compatible = "allwinner,sun8i-h3-emac", .data = (uintptr_t)H3_EMAC },
1005         {.compatible = "allwinner,sun50i-a64-emac",
1006                 .data = (uintptr_t)A64_EMAC },
1007         {.compatible = "allwinner,sun8i-a83t-emac",
1008                 .data = (uintptr_t)A83T_EMAC },
1009         {.compatible = "allwinner,sun8i-r40-gmac",
1010                 .data = (uintptr_t)R40_GMAC },
1011         {.compatible = "allwinner,sun50i-h6-emac",
1012                 .data = (uintptr_t)H6_EMAC },
1013         { }
1014 };
1015
1016 U_BOOT_DRIVER(eth_sun8i_emac) = {
1017         .name   = "eth_sun8i_emac",
1018         .id     = UCLASS_ETH,
1019         .of_match = sun8i_emac_eth_ids,
1020         .of_to_plat = sun8i_emac_eth_of_to_plat,
1021         .probe  = sun8i_emac_eth_probe,
1022         .ops    = &sun8i_emac_eth_ops,
1023         .priv_auto      = sizeof(struct emac_eth_dev),
1024         .plat_auto      = sizeof(struct sun8i_eth_pdata),
1025         .flags = DM_FLAG_ALLOC_PRIV_DMA,
1026 };