1 // SPDX-License-Identifier: GPL-2.0+
4 * Author: Amit Singh Tomar, amittomer25@gmail.com
6 * Ethernet driver for H3/A64/A83T based SoC's
8 * It is derived from the work done by
9 * LABBE Corentin & Chen-Yu Tsai for Linux, THANKS!
15 #include <asm/cache.h>
16 #include <asm/global_data.h>
19 #include <asm/arch/clock.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>
34 #define MDIO_CMD_MII_BUSY BIT(0)
35 #define MDIO_CMD_MII_WRITE BIT(1)
37 #define MDIO_CMD_MII_PHY_REG_ADDR_MASK 0x000001f0
38 #define MDIO_CMD_MII_PHY_REG_ADDR_SHIFT 4
39 #define MDIO_CMD_MII_PHY_ADDR_MASK 0x0001f000
40 #define MDIO_CMD_MII_PHY_ADDR_SHIFT 12
41 #define MDIO_CMD_MII_CLK_CSR_DIV_16 0x0
42 #define MDIO_CMD_MII_CLK_CSR_DIV_32 0x1
43 #define MDIO_CMD_MII_CLK_CSR_DIV_64 0x2
44 #define MDIO_CMD_MII_CLK_CSR_DIV_128 0x3
45 #define MDIO_CMD_MII_CLK_CSR_SHIFT 20
47 #define CONFIG_TX_DESCR_NUM 32
48 #define CONFIG_RX_DESCR_NUM 32
49 #define CONFIG_ETH_BUFSIZE 2048 /* Note must be dma aligned */
52 * The datasheet says that each descriptor can transfers up to 4096 bytes
53 * But later, the register documentation reduces that value to 2048,
54 * using 2048 cause strange behaviours and even BSP driver use 2047
56 #define CONFIG_ETH_RXSIZE 2044 /* Note must fit in ETH_BUFSIZE */
58 #define TX_TOTAL_BUFSIZE (CONFIG_ETH_BUFSIZE * CONFIG_TX_DESCR_NUM)
59 #define RX_TOTAL_BUFSIZE (CONFIG_ETH_BUFSIZE * CONFIG_RX_DESCR_NUM)
61 #define H3_EPHY_DEFAULT_VALUE 0x58000
62 #define H3_EPHY_DEFAULT_MASK GENMASK(31, 15)
63 #define H3_EPHY_ADDR_SHIFT 20
64 #define REG_PHY_ADDR_MASK GENMASK(4, 0)
65 #define H3_EPHY_LED_POL BIT(17) /* 1: active low, 0: active high */
66 #define H3_EPHY_SHUTDOWN BIT(16) /* 1: shutdown, 0: power up */
67 #define H3_EPHY_SELECT BIT(15) /* 1: internal PHY, 0: external PHY */
69 #define SC_RMII_EN BIT(13)
70 #define SC_EPIT BIT(2) /* 1: RGMII, 0: MII */
71 #define SC_ETCS_MASK GENMASK(1, 0)
72 #define SC_ETCS_EXT_GMII 0x1
73 #define SC_ETCS_INT_GMII 0x2
74 #define SC_ETXDC_MASK GENMASK(12, 10)
75 #define SC_ETXDC_OFFSET 10
76 #define SC_ERXDC_MASK GENMASK(9, 5)
77 #define SC_ERXDC_OFFSET 5
79 #define CONFIG_MDIO_TIMEOUT (3 * CONFIG_SYS_HZ)
81 #define AHB_GATE_OFFSET_EPHY 0
83 /* H3/A64 EMAC Register's offset */
84 #define EMAC_CTL0 0x00
85 #define EMAC_CTL0_FULL_DUPLEX BIT(0)
86 #define EMAC_CTL0_SPEED_MASK GENMASK(3, 2)
87 #define EMAC_CTL0_SPEED_10 (0x2 << 2)
88 #define EMAC_CTL0_SPEED_100 (0x3 << 2)
89 #define EMAC_CTL0_SPEED_1000 (0x0 << 2)
90 #define EMAC_CTL1 0x04
91 #define EMAC_CTL1_SOFT_RST BIT(0)
92 #define EMAC_CTL1_BURST_LEN_SHIFT 24
93 #define EMAC_INT_STA 0x08
94 #define EMAC_INT_EN 0x0c
95 #define EMAC_TX_CTL0 0x10
96 #define EMAC_TX_CTL0_TX_EN BIT(31)
97 #define EMAC_TX_CTL1 0x14
98 #define EMAC_TX_CTL1_TX_MD BIT(1)
99 #define EMAC_TX_CTL1_TX_DMA_EN BIT(30)
100 #define EMAC_TX_CTL1_TX_DMA_START BIT(31)
101 #define EMAC_TX_FLOW_CTL 0x1c
102 #define EMAC_TX_DMA_DESC 0x20
103 #define EMAC_RX_CTL0 0x24
104 #define EMAC_RX_CTL0_RX_EN BIT(31)
105 #define EMAC_RX_CTL1 0x28
106 #define EMAC_RX_CTL1_RX_MD BIT(1)
107 #define EMAC_RX_CTL1_RX_RUNT_FRM BIT(2)
108 #define EMAC_RX_CTL1_RX_ERR_FRM BIT(3)
109 #define EMAC_RX_CTL1_RX_DMA_EN BIT(30)
110 #define EMAC_RX_CTL1_RX_DMA_START BIT(31)
111 #define EMAC_RX_DMA_DESC 0x34
112 #define EMAC_MII_CMD 0x48
113 #define EMAC_MII_DATA 0x4c
114 #define EMAC_ADDR0_HIGH 0x50
115 #define EMAC_ADDR0_LOW 0x54
116 #define EMAC_TX_DMA_STA 0xb0
117 #define EMAC_TX_CUR_DESC 0xb4
118 #define EMAC_TX_CUR_BUF 0xb8
119 #define EMAC_RX_DMA_STA 0xc0
120 #define EMAC_RX_CUR_DESC 0xc4
122 #define EMAC_DESC_OWN_DMA BIT(31)
123 #define EMAC_DESC_LAST_DESC BIT(30)
124 #define EMAC_DESC_FIRST_DESC BIT(29)
125 #define EMAC_DESC_CHAIN_SECOND BIT(24)
127 #define EMAC_DESC_RX_ERROR_MASK 0x400068db
129 DECLARE_GLOBAL_DATA_PTR;
139 struct emac_dma_desc {
144 } __aligned(ARCH_DMA_MINALIGN);
146 struct emac_eth_dev {
147 struct emac_dma_desc rx_chain[CONFIG_TX_DESCR_NUM];
148 struct emac_dma_desc tx_chain[CONFIG_RX_DESCR_NUM];
149 char rxbuffer[RX_TOTAL_BUFSIZE] __aligned(ARCH_DMA_MINALIGN);
150 char txbuffer[TX_TOTAL_BUFSIZE] __aligned(ARCH_DMA_MINALIGN);
162 bool use_internal_phy;
164 enum emac_variant variant;
166 phys_addr_t sysctl_reg;
167 struct phy_device *phydev;
171 struct reset_ctl tx_rst;
172 struct reset_ctl ephy_rst;
173 #if CONFIG_IS_ENABLED(DM_GPIO)
174 struct gpio_desc reset_gpio;
179 struct sun8i_eth_pdata {
180 struct eth_pdata eth_pdata;
187 static int sun8i_mdio_read(struct mii_dev *bus, int addr, int devad, int reg)
189 struct udevice *dev = bus->priv;
190 struct emac_eth_dev *priv = dev_get_priv(dev);
194 mii_cmd = (reg << MDIO_CMD_MII_PHY_REG_ADDR_SHIFT) &
195 MDIO_CMD_MII_PHY_REG_ADDR_MASK;
196 mii_cmd |= (addr << MDIO_CMD_MII_PHY_ADDR_SHIFT) &
197 MDIO_CMD_MII_PHY_ADDR_MASK;
200 * The EMAC clock is either 200 or 300 MHz, so we need a divider
201 * of 128 to get the MDIO frequency below the required 2.5 MHz.
203 if (!priv->use_internal_phy)
204 mii_cmd |= MDIO_CMD_MII_CLK_CSR_DIV_128 <<
205 MDIO_CMD_MII_CLK_CSR_SHIFT;
207 mii_cmd |= MDIO_CMD_MII_BUSY;
209 writel(mii_cmd, priv->mac_reg + EMAC_MII_CMD);
211 ret = wait_for_bit_le32(priv->mac_reg + EMAC_MII_CMD,
212 MDIO_CMD_MII_BUSY, false,
213 CONFIG_MDIO_TIMEOUT, true);
217 return readl(priv->mac_reg + EMAC_MII_DATA);
220 static int sun8i_mdio_write(struct mii_dev *bus, int addr, int devad, int reg,
223 struct udevice *dev = bus->priv;
224 struct emac_eth_dev *priv = dev_get_priv(dev);
227 mii_cmd = (reg << MDIO_CMD_MII_PHY_REG_ADDR_SHIFT) &
228 MDIO_CMD_MII_PHY_REG_ADDR_MASK;
229 mii_cmd |= (addr << MDIO_CMD_MII_PHY_ADDR_SHIFT) &
230 MDIO_CMD_MII_PHY_ADDR_MASK;
233 * The EMAC clock is either 200 or 300 MHz, so we need a divider
234 * of 128 to get the MDIO frequency below the required 2.5 MHz.
236 if (!priv->use_internal_phy)
237 mii_cmd |= MDIO_CMD_MII_CLK_CSR_DIV_128 <<
238 MDIO_CMD_MII_CLK_CSR_SHIFT;
240 mii_cmd |= MDIO_CMD_MII_WRITE;
241 mii_cmd |= MDIO_CMD_MII_BUSY;
243 writel(val, priv->mac_reg + EMAC_MII_DATA);
244 writel(mii_cmd, priv->mac_reg + EMAC_MII_CMD);
246 return wait_for_bit_le32(priv->mac_reg + EMAC_MII_CMD,
247 MDIO_CMD_MII_BUSY, false,
248 CONFIG_MDIO_TIMEOUT, true);
251 static int sun8i_eth_write_hwaddr(struct udevice *dev)
253 struct emac_eth_dev *priv = dev_get_priv(dev);
254 struct eth_pdata *pdata = dev_get_plat(dev);
255 uchar *mac_id = pdata->enetaddr;
256 u32 macid_lo, macid_hi;
258 macid_lo = mac_id[0] + (mac_id[1] << 8) + (mac_id[2] << 16) +
260 macid_hi = mac_id[4] + (mac_id[5] << 8);
262 writel(macid_hi, priv->mac_reg + EMAC_ADDR0_HIGH);
263 writel(macid_lo, priv->mac_reg + EMAC_ADDR0_LOW);
268 static void sun8i_adjust_link(struct emac_eth_dev *priv,
269 struct phy_device *phydev)
273 v = readl(priv->mac_reg + EMAC_CTL0);
276 v |= EMAC_CTL0_FULL_DUPLEX;
278 v &= ~EMAC_CTL0_FULL_DUPLEX;
280 v &= ~EMAC_CTL0_SPEED_MASK;
282 switch (phydev->speed) {
284 v |= EMAC_CTL0_SPEED_1000;
287 v |= EMAC_CTL0_SPEED_100;
290 v |= EMAC_CTL0_SPEED_10;
293 writel(v, priv->mac_reg + EMAC_CTL0);
296 static u32 sun8i_emac_set_syscon_ephy(struct emac_eth_dev *priv, u32 reg)
298 if (priv->use_internal_phy) {
299 /* H3 based SoC's that has an Internal 100MBit PHY
300 * needs to be configured and powered up before use
302 reg &= ~H3_EPHY_DEFAULT_MASK;
303 reg |= H3_EPHY_DEFAULT_VALUE;
304 reg |= priv->phyaddr << H3_EPHY_ADDR_SHIFT;
305 reg &= ~H3_EPHY_SHUTDOWN;
306 return reg | H3_EPHY_SELECT;
309 /* This is to select External Gigabit PHY on those boards with
310 * an internal PHY. Does not hurt on other SoCs. Linux does
313 return reg & ~H3_EPHY_SELECT;
316 static int sun8i_emac_set_syscon(struct sun8i_eth_pdata *pdata,
317 struct emac_eth_dev *priv)
321 if (priv->variant == R40_GMAC) {
322 /* Select RGMII for R40 */
323 reg = readl(priv->sysctl_reg + 0x164);
324 reg |= SC_ETCS_INT_GMII |
326 (CONFIG_GMAC_TX_DELAY << SC_ETXDC_OFFSET);
328 writel(reg, priv->sysctl_reg + 0x164);
332 reg = readl(priv->sysctl_reg + 0x30);
334 reg = sun8i_emac_set_syscon_ephy(priv, reg);
336 reg &= ~(SC_ETCS_MASK | SC_EPIT);
337 if (priv->variant == H3_EMAC ||
338 priv->variant == A64_EMAC ||
339 priv->variant == H6_EMAC)
342 switch (priv->interface) {
343 case PHY_INTERFACE_MODE_MII:
346 case PHY_INTERFACE_MODE_RGMII:
347 case PHY_INTERFACE_MODE_RGMII_ID:
348 case PHY_INTERFACE_MODE_RGMII_RXID:
349 case PHY_INTERFACE_MODE_RGMII_TXID:
350 reg |= SC_EPIT | SC_ETCS_INT_GMII;
352 case PHY_INTERFACE_MODE_RMII:
353 if (priv->variant == H3_EMAC ||
354 priv->variant == A64_EMAC ||
355 priv->variant == H6_EMAC) {
356 reg |= SC_RMII_EN | SC_ETCS_EXT_GMII;
359 /* RMII not supported on A83T */
361 debug("%s: Invalid PHY interface\n", __func__);
365 if (pdata->tx_delay_ps)
366 reg |= ((pdata->tx_delay_ps / 100) << SC_ETXDC_OFFSET)
369 if (pdata->rx_delay_ps)
370 reg |= ((pdata->rx_delay_ps / 100) << SC_ERXDC_OFFSET)
373 writel(reg, priv->sysctl_reg + 0x30);
378 static int sun8i_phy_init(struct emac_eth_dev *priv, void *dev)
380 struct phy_device *phydev;
382 phydev = phy_connect(priv->bus, priv->phyaddr, dev, priv->interface);
386 priv->phydev = phydev;
387 phy_config(priv->phydev);
392 #define cache_clean_descriptor(desc) \
393 flush_dcache_range((uintptr_t)(desc), \
394 (uintptr_t)(desc) + sizeof(struct emac_dma_desc))
396 #define cache_inv_descriptor(desc) \
397 invalidate_dcache_range((uintptr_t)(desc), \
398 (uintptr_t)(desc) + sizeof(struct emac_dma_desc))
400 static void rx_descs_init(struct emac_eth_dev *priv)
402 struct emac_dma_desc *desc_table_p = &priv->rx_chain[0];
403 char *rxbuffs = &priv->rxbuffer[0];
404 struct emac_dma_desc *desc_p;
408 * Make sure we don't have dirty cache lines around, which could
409 * be cleaned to DRAM *after* the MAC has already written data to it.
411 invalidate_dcache_range((uintptr_t)desc_table_p,
412 (uintptr_t)desc_table_p + sizeof(priv->rx_chain));
413 invalidate_dcache_range((uintptr_t)rxbuffs,
414 (uintptr_t)rxbuffs + sizeof(priv->rxbuffer));
416 for (i = 0; i < CONFIG_RX_DESCR_NUM; i++) {
417 desc_p = &desc_table_p[i];
418 desc_p->buf_addr = (uintptr_t)&rxbuffs[i * CONFIG_ETH_BUFSIZE];
419 desc_p->next = (uintptr_t)&desc_table_p[i + 1];
420 desc_p->ctl_size = CONFIG_ETH_RXSIZE;
421 desc_p->status = EMAC_DESC_OWN_DMA;
424 /* Correcting the last pointer of the chain */
425 desc_p->next = (uintptr_t)&desc_table_p[0];
427 flush_dcache_range((uintptr_t)priv->rx_chain,
428 (uintptr_t)priv->rx_chain +
429 sizeof(priv->rx_chain));
431 writel((uintptr_t)&desc_table_p[0], (priv->mac_reg + EMAC_RX_DMA_DESC));
432 priv->rx_currdescnum = 0;
435 static void tx_descs_init(struct emac_eth_dev *priv)
437 struct emac_dma_desc *desc_table_p = &priv->tx_chain[0];
438 char *txbuffs = &priv->txbuffer[0];
439 struct emac_dma_desc *desc_p;
442 for (i = 0; i < CONFIG_TX_DESCR_NUM; i++) {
443 desc_p = &desc_table_p[i];
444 desc_p->buf_addr = (uintptr_t)&txbuffs[i * CONFIG_ETH_BUFSIZE];
445 desc_p->next = (uintptr_t)&desc_table_p[i + 1];
446 desc_p->ctl_size = 0;
450 /* Correcting the last pointer of the chain */
451 desc_p->next = (uintptr_t)&desc_table_p[0];
453 /* Flush the first TX buffer descriptor we will tell the MAC about. */
454 cache_clean_descriptor(desc_table_p);
456 writel((uintptr_t)&desc_table_p[0], priv->mac_reg + EMAC_TX_DMA_DESC);
457 priv->tx_currdescnum = 0;
460 static int sun8i_emac_eth_start(struct udevice *dev)
462 struct emac_eth_dev *priv = dev_get_priv(dev);
466 writel(EMAC_CTL1_SOFT_RST, priv->mac_reg + EMAC_CTL1);
467 ret = wait_for_bit_le32(priv->mac_reg + EMAC_CTL1,
468 EMAC_CTL1_SOFT_RST, false, 10, true);
470 printf("%s: Timeout\n", __func__);
474 /* Rewrite mac address after reset */
475 sun8i_eth_write_hwaddr(dev);
477 /* transmission starts after the full frame arrived in TX DMA FIFO */
478 setbits_le32(priv->mac_reg + EMAC_TX_CTL1, EMAC_TX_CTL1_TX_MD);
481 * RX DMA reads data from RX DMA FIFO to host memory after a
482 * complete frame has been written to RX DMA FIFO
484 setbits_le32(priv->mac_reg + EMAC_RX_CTL1, EMAC_RX_CTL1_RX_MD);
486 /* DMA burst length */
487 writel(8 << EMAC_CTL1_BURST_LEN_SHIFT, priv->mac_reg + EMAC_CTL1);
489 /* Initialize rx/tx descriptors */
494 ret = phy_startup(priv->phydev);
498 sun8i_adjust_link(priv, priv->phydev);
500 /* Start RX/TX DMA */
501 setbits_le32(priv->mac_reg + EMAC_RX_CTL1, EMAC_RX_CTL1_RX_DMA_EN |
502 EMAC_RX_CTL1_RX_ERR_FRM | EMAC_RX_CTL1_RX_RUNT_FRM);
503 setbits_le32(priv->mac_reg + EMAC_TX_CTL1, EMAC_TX_CTL1_TX_DMA_EN);
506 setbits_le32(priv->mac_reg + EMAC_RX_CTL0, EMAC_RX_CTL0_RX_EN);
507 setbits_le32(priv->mac_reg + EMAC_TX_CTL0, EMAC_TX_CTL0_TX_EN);
512 static int sun8i_emac_eth_recv(struct udevice *dev, int flags, uchar **packetp)
514 struct emac_eth_dev *priv = dev_get_priv(dev);
515 u32 status, desc_num = priv->rx_currdescnum;
516 struct emac_dma_desc *desc_p = &priv->rx_chain[desc_num];
517 uintptr_t data_start = (uintptr_t)desc_p->buf_addr;
520 /* Invalidate entire buffer descriptor */
521 cache_inv_descriptor(desc_p);
523 status = desc_p->status;
525 /* Check for DMA own bit */
526 if (status & EMAC_DESC_OWN_DMA)
529 length = (status >> 16) & 0x3fff;
531 /* make sure we read from DRAM, not our cache */
532 invalidate_dcache_range(data_start,
533 data_start + roundup(length, ARCH_DMA_MINALIGN));
535 if (status & EMAC_DESC_RX_ERROR_MASK) {
536 debug("RX: packet error: 0x%x\n",
537 status & EMAC_DESC_RX_ERROR_MASK);
541 debug("RX: Bad Packet (runt)\n");
545 if (length > CONFIG_ETH_RXSIZE) {
546 debug("RX: Too large packet (%d bytes)\n", length);
550 *packetp = (uchar *)(ulong)desc_p->buf_addr;
555 static int sun8i_emac_eth_send(struct udevice *dev, void *packet, int length)
557 struct emac_eth_dev *priv = dev_get_priv(dev);
558 u32 desc_num = priv->tx_currdescnum;
559 struct emac_dma_desc *desc_p = &priv->tx_chain[desc_num];
560 uintptr_t data_start = (uintptr_t)desc_p->buf_addr;
561 uintptr_t data_end = data_start +
562 roundup(length, ARCH_DMA_MINALIGN);
564 desc_p->ctl_size = length | EMAC_DESC_CHAIN_SECOND;
566 memcpy((void *)data_start, packet, length);
568 /* Flush data to be sent */
569 flush_dcache_range(data_start, data_end);
571 /* frame begin and end */
572 desc_p->ctl_size |= EMAC_DESC_LAST_DESC | EMAC_DESC_FIRST_DESC;
573 desc_p->status = EMAC_DESC_OWN_DMA;
575 /* make sure the MAC reads the actual data from DRAM */
576 cache_clean_descriptor(desc_p);
578 /* Move to next Descriptor and wrap around */
579 if (++desc_num >= CONFIG_TX_DESCR_NUM)
581 priv->tx_currdescnum = desc_num;
584 setbits_le32(priv->mac_reg + EMAC_TX_CTL1, EMAC_TX_CTL1_TX_DMA_START);
587 * Since we copied the data above, we return here without waiting
588 * for the packet to be actually send out.
594 static int sun8i_emac_board_setup(struct udevice *dev,
595 struct emac_eth_dev *priv)
599 ret = clk_enable(&priv->tx_clk);
601 dev_err(dev, "failed to enable TX clock\n");
605 if (reset_valid(&priv->tx_rst)) {
606 ret = reset_deassert(&priv->tx_rst);
608 dev_err(dev, "failed to deassert TX reset\n");
613 /* Only H3/H5 have clock controls for internal EPHY */
614 if (clk_valid(&priv->ephy_clk)) {
615 ret = clk_enable(&priv->ephy_clk);
617 dev_err(dev, "failed to enable EPHY TX clock\n");
622 if (reset_valid(&priv->ephy_rst)) {
623 ret = reset_deassert(&priv->ephy_rst);
625 dev_err(dev, "failed to deassert EPHY TX clock\n");
633 clk_disable(&priv->tx_clk);
637 #if CONFIG_IS_ENABLED(DM_GPIO)
638 static int sun8i_mdio_reset(struct mii_dev *bus)
640 struct udevice *dev = bus->priv;
641 struct emac_eth_dev *priv = dev_get_priv(dev);
642 struct sun8i_eth_pdata *pdata = dev_get_plat(dev);
645 if (!dm_gpio_is_valid(&priv->reset_gpio))
649 ret = dm_gpio_set_value(&priv->reset_gpio, 0);
653 udelay(pdata->reset_delays[0]);
655 ret = dm_gpio_set_value(&priv->reset_gpio, 1);
659 udelay(pdata->reset_delays[1]);
661 ret = dm_gpio_set_value(&priv->reset_gpio, 0);
665 udelay(pdata->reset_delays[2]);
671 static int sun8i_mdio_init(const char *name, struct udevice *priv)
673 struct mii_dev *bus = mdio_alloc();
676 debug("Failed to allocate MDIO bus\n");
680 bus->read = sun8i_mdio_read;
681 bus->write = sun8i_mdio_write;
682 snprintf(bus->name, sizeof(bus->name), name);
683 bus->priv = (void *)priv;
684 #if CONFIG_IS_ENABLED(DM_GPIO)
685 bus->reset = sun8i_mdio_reset;
688 return mdio_register(bus);
691 static int sun8i_eth_free_pkt(struct udevice *dev, uchar *packet,
694 struct emac_eth_dev *priv = dev_get_priv(dev);
695 u32 desc_num = priv->rx_currdescnum;
696 struct emac_dma_desc *desc_p = &priv->rx_chain[desc_num];
698 /* give the current descriptor back to the MAC */
699 desc_p->status |= EMAC_DESC_OWN_DMA;
701 /* Flush Status field of descriptor */
702 cache_clean_descriptor(desc_p);
704 /* Move to next desc and wrap-around condition. */
705 if (++desc_num >= CONFIG_RX_DESCR_NUM)
707 priv->rx_currdescnum = desc_num;
712 static void sun8i_emac_eth_stop(struct udevice *dev)
714 struct emac_eth_dev *priv = dev_get_priv(dev);
716 /* Stop Rx/Tx transmitter */
717 clrbits_le32(priv->mac_reg + EMAC_RX_CTL0, EMAC_RX_CTL0_RX_EN);
718 clrbits_le32(priv->mac_reg + EMAC_TX_CTL0, EMAC_TX_CTL0_TX_EN);
721 clrbits_le32(priv->mac_reg + EMAC_TX_CTL1, EMAC_TX_CTL1_TX_DMA_EN);
722 clrbits_le32(priv->mac_reg + EMAC_RX_CTL1, EMAC_RX_CTL1_RX_DMA_EN);
724 phy_shutdown(priv->phydev);
727 static int sun8i_emac_eth_probe(struct udevice *dev)
729 struct sun8i_eth_pdata *sun8i_pdata = dev_get_plat(dev);
730 struct eth_pdata *pdata = &sun8i_pdata->eth_pdata;
731 struct emac_eth_dev *priv = dev_get_priv(dev);
734 priv->mac_reg = (void *)pdata->iobase;
736 ret = sun8i_emac_board_setup(dev, priv);
740 sun8i_emac_set_syscon(sun8i_pdata, priv);
742 sun8i_mdio_init(dev->name, dev);
743 priv->bus = miiphy_get_dev_by_name(dev->name);
745 return sun8i_phy_init(priv, dev);
748 static const struct eth_ops sun8i_emac_eth_ops = {
749 .start = sun8i_emac_eth_start,
750 .write_hwaddr = sun8i_eth_write_hwaddr,
751 .send = sun8i_emac_eth_send,
752 .recv = sun8i_emac_eth_recv,
753 .free_pkt = sun8i_eth_free_pkt,
754 .stop = sun8i_emac_eth_stop,
757 static int sun8i_handle_internal_phy(struct udevice *dev, struct emac_eth_dev *priv)
759 struct ofnode_phandle_args phandle;
762 ret = ofnode_parse_phandle_with_args(dev_ofnode(dev), "phy-handle",
763 NULL, 0, 0, &phandle);
767 /* If the PHY node is not a child of the internal MDIO bus, we are
768 * using some external PHY.
770 if (!ofnode_device_is_compatible(ofnode_get_parent(phandle.node),
771 "allwinner,sun8i-h3-mdio-internal"))
774 ret = clk_get_by_index_nodev(phandle.node, 0, &priv->ephy_clk);
776 dev_err(dev, "failed to get EPHY TX clock\n");
780 ret = reset_get_by_index_nodev(phandle.node, 0, &priv->ephy_rst);
782 dev_err(dev, "failed to get EPHY TX reset\n");
786 priv->use_internal_phy = true;
791 static int sun8i_emac_eth_of_to_plat(struct udevice *dev)
793 struct sun8i_eth_pdata *sun8i_pdata = dev_get_plat(dev);
794 struct eth_pdata *pdata = &sun8i_pdata->eth_pdata;
795 struct emac_eth_dev *priv = dev_get_priv(dev);
797 int node = dev_of_offset(dev);
799 #if CONFIG_IS_ENABLED(DM_GPIO)
800 int reset_flags = GPIOD_IS_OUT;
804 pdata->iobase = dev_read_addr(dev);
805 if (pdata->iobase == FDT_ADDR_T_NONE) {
806 debug("%s: Cannot find MAC base address\n", __func__);
810 priv->variant = dev_get_driver_data(dev);
812 if (!priv->variant) {
813 printf("%s: Missing variant\n", __func__);
817 ret = clk_get_by_name(dev, "stmmaceth", &priv->tx_clk);
819 dev_err(dev, "failed to get TX clock\n");
823 ret = reset_get_by_name(dev, "stmmaceth", &priv->tx_rst);
824 if (ret && ret != -ENOENT) {
825 dev_err(dev, "failed to get TX reset\n");
829 offset = fdtdec_lookup_phandle(gd->fdt_blob, node, "syscon");
831 debug("%s: cannot find syscon node\n", __func__);
835 reg = fdt_getprop(gd->fdt_blob, offset, "reg", NULL);
837 debug("%s: cannot find reg property in syscon node\n",
841 priv->sysctl_reg = fdt_translate_address((void *)gd->fdt_blob,
843 if (priv->sysctl_reg == FDT_ADDR_T_NONE) {
844 debug("%s: Cannot find syscon base address\n", __func__);
848 pdata->phy_interface = -1;
850 priv->use_internal_phy = false;
852 offset = fdtdec_lookup_phandle(gd->fdt_blob, node, "phy-handle");
854 debug("%s: Cannot find PHY address\n", __func__);
857 priv->phyaddr = fdtdec_get_int(gd->fdt_blob, offset, "reg", -1);
859 pdata->phy_interface = dev_read_phy_mode(dev);
860 printf("phy interface%d\n", pdata->phy_interface);
861 if (pdata->phy_interface == PHY_INTERFACE_MODE_NA)
864 if (priv->variant == H3_EMAC) {
865 ret = sun8i_handle_internal_phy(dev, priv);
870 priv->interface = pdata->phy_interface;
872 sun8i_pdata->tx_delay_ps = fdtdec_get_int(gd->fdt_blob, node,
873 "allwinner,tx-delay-ps", 0);
874 if (sun8i_pdata->tx_delay_ps < 0 || sun8i_pdata->tx_delay_ps > 700)
875 printf("%s: Invalid TX delay value %d\n", __func__,
876 sun8i_pdata->tx_delay_ps);
878 sun8i_pdata->rx_delay_ps = fdtdec_get_int(gd->fdt_blob, node,
879 "allwinner,rx-delay-ps", 0);
880 if (sun8i_pdata->rx_delay_ps < 0 || sun8i_pdata->rx_delay_ps > 3100)
881 printf("%s: Invalid RX delay value %d\n", __func__,
882 sun8i_pdata->rx_delay_ps);
884 #if CONFIG_IS_ENABLED(DM_GPIO)
885 if (fdtdec_get_bool(gd->fdt_blob, dev_of_offset(dev),
886 "snps,reset-active-low"))
887 reset_flags |= GPIOD_ACTIVE_LOW;
889 ret = gpio_request_by_name(dev, "snps,reset-gpio", 0,
890 &priv->reset_gpio, reset_flags);
893 ret = fdtdec_get_int_array(gd->fdt_blob, dev_of_offset(dev),
894 "snps,reset-delays-us",
895 sun8i_pdata->reset_delays, 3);
896 } else if (ret == -ENOENT) {
904 static const struct udevice_id sun8i_emac_eth_ids[] = {
905 {.compatible = "allwinner,sun8i-h3-emac", .data = (uintptr_t)H3_EMAC },
906 {.compatible = "allwinner,sun50i-a64-emac",
907 .data = (uintptr_t)A64_EMAC },
908 {.compatible = "allwinner,sun8i-a83t-emac",
909 .data = (uintptr_t)A83T_EMAC },
910 {.compatible = "allwinner,sun8i-r40-gmac",
911 .data = (uintptr_t)R40_GMAC },
912 {.compatible = "allwinner,sun50i-h6-emac",
913 .data = (uintptr_t)H6_EMAC },
917 U_BOOT_DRIVER(eth_sun8i_emac) = {
918 .name = "eth_sun8i_emac",
920 .of_match = sun8i_emac_eth_ids,
921 .of_to_plat = sun8i_emac_eth_of_to_plat,
922 .probe = sun8i_emac_eth_probe,
923 .ops = &sun8i_emac_eth_ops,
924 .priv_auto = sizeof(struct emac_eth_dev),
925 .plat_auto = sizeof(struct sun8i_eth_pdata),
926 .flags = DM_FLAG_ALLOC_PRIV_DMA,