1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * dwmac-sun8i.c - Allwinner sun8i DWMAC specific glue layer
5 * Copyright (C) 2017 Corentin Labbe <clabbe.montjoie@gmail.com>
10 #include <linux/iopoll.h>
11 #include <linux/mdio-mux.h>
12 #include <linux/mfd/syscon.h>
13 #include <linux/module.h>
14 #include <linux/of_device.h>
15 #include <linux/of_mdio.h>
16 #include <linux/of_net.h>
17 #include <linux/phy.h>
18 #include <linux/platform_device.h>
19 #include <linux/regulator/consumer.h>
20 #include <linux/regmap.h>
21 #include <linux/stmmac.h>
24 #include "stmmac_platform.h"
26 /* General notes on dwmac-sun8i:
27 * Locking: no locking is necessary in this file because all necessary locking
28 * is done in the "stmmac files"
31 /* struct emac_variant - Describe dwmac-sun8i hardware variant
32 * @default_syscon_value: The default value of the EMAC register in syscon
33 * This value is used for disabling properly EMAC
34 * and used as a good starting value in case of the
35 * boot process(uboot) leave some stuff.
36 * @syscon_field reg_field for the syscon's gmac register
37 * @soc_has_internal_phy: Does the MAC embed an internal PHY
38 * @support_mii: Does the MAC handle MII
39 * @support_rmii: Does the MAC handle RMII
40 * @support_rgmii: Does the MAC handle RGMII
42 * @rx_delay_max: Maximum raw value for RX delay chain
43 * @tx_delay_max: Maximum raw value for TX delay chain
44 * These two also indicate the bitmask for
45 * the RX and TX delay chain registers. A
46 * value of zero indicates this is not supported.
49 u32 default_syscon_value
;
50 const struct reg_field
*syscon_field
;
51 bool soc_has_internal_phy
;
59 /* struct sunxi_priv_data - hold all sunxi private data
60 * @tx_clk: reference to MAC TX clock
61 * @ephy_clk: reference to the optional EPHY clock for the internal PHY
62 * @regulator: reference to the optional regulator
63 * @rst_ephy: reference to the optional EPHY reset for the internal PHY
64 * @variant: reference to the current board variant
65 * @regmap: regmap for using the syscon
66 * @internal_phy_powered: Does the internal PHY is enabled
67 * @use_internal_phy: Is the internal PHY selected for use
68 * @mux_handle: Internal pointer used by mdio-mux lib
70 struct sunxi_priv_data
{
73 struct regulator
*regulator
;
74 struct reset_control
*rst_ephy
;
75 const struct emac_variant
*variant
;
76 struct regmap_field
*regmap_field
;
77 bool internal_phy_powered
;
78 bool use_internal_phy
;
82 /* EMAC clock register @ 0x30 in the "system control" address range */
83 static const struct reg_field sun8i_syscon_reg_field
= {
89 /* EMAC clock register @ 0x164 in the CCU address range */
90 static const struct reg_field sun8i_ccu_reg_field
= {
96 static const struct emac_variant emac_variant_h3
= {
97 .default_syscon_value
= 0x58000,
98 .syscon_field
= &sun8i_syscon_reg_field
,
99 .soc_has_internal_phy
= true,
101 .support_rmii
= true,
102 .support_rgmii
= true,
107 static const struct emac_variant emac_variant_v3s
= {
108 .default_syscon_value
= 0x38000,
109 .syscon_field
= &sun8i_syscon_reg_field
,
110 .soc_has_internal_phy
= true,
114 static const struct emac_variant emac_variant_a83t
= {
115 .default_syscon_value
= 0,
116 .syscon_field
= &sun8i_syscon_reg_field
,
117 .soc_has_internal_phy
= false,
119 .support_rgmii
= true,
124 static const struct emac_variant emac_variant_r40
= {
125 .default_syscon_value
= 0,
126 .syscon_field
= &sun8i_ccu_reg_field
,
128 .support_rgmii
= true,
132 static const struct emac_variant emac_variant_a64
= {
133 .default_syscon_value
= 0,
134 .syscon_field
= &sun8i_syscon_reg_field
,
135 .soc_has_internal_phy
= false,
137 .support_rmii
= true,
138 .support_rgmii
= true,
143 static const struct emac_variant emac_variant_h6
= {
144 .default_syscon_value
= 0x50000,
145 .syscon_field
= &sun8i_syscon_reg_field
,
146 /* The "Internal PHY" of H6 is not on the die. It's on the
147 * co-packaged AC200 chip instead.
149 .soc_has_internal_phy
= false,
151 .support_rmii
= true,
152 .support_rgmii
= true,
157 #define EMAC_BASIC_CTL0 0x00
158 #define EMAC_BASIC_CTL1 0x04
159 #define EMAC_INT_STA 0x08
160 #define EMAC_INT_EN 0x0C
161 #define EMAC_TX_CTL0 0x10
162 #define EMAC_TX_CTL1 0x14
163 #define EMAC_TX_FLOW_CTL 0x1C
164 #define EMAC_TX_DESC_LIST 0x20
165 #define EMAC_RX_CTL0 0x24
166 #define EMAC_RX_CTL1 0x28
167 #define EMAC_RX_DESC_LIST 0x34
168 #define EMAC_RX_FRM_FLT 0x38
169 #define EMAC_MDIO_CMD 0x48
170 #define EMAC_MDIO_DATA 0x4C
171 #define EMAC_MACADDR_HI(reg) (0x50 + (reg) * 8)
172 #define EMAC_MACADDR_LO(reg) (0x54 + (reg) * 8)
173 #define EMAC_TX_DMA_STA 0xB0
174 #define EMAC_TX_CUR_DESC 0xB4
175 #define EMAC_TX_CUR_BUF 0xB8
176 #define EMAC_RX_DMA_STA 0xC0
177 #define EMAC_RX_CUR_DESC 0xC4
178 #define EMAC_RX_CUR_BUF 0xC8
180 /* Use in EMAC_BASIC_CTL0 */
181 #define EMAC_DUPLEX_FULL BIT(0)
182 #define EMAC_LOOPBACK BIT(1)
183 #define EMAC_SPEED_1000 0
184 #define EMAC_SPEED_100 (0x03 << 2)
185 #define EMAC_SPEED_10 (0x02 << 2)
187 /* Use in EMAC_BASIC_CTL1 */
188 #define EMAC_BURSTLEN_SHIFT 24
190 /* Used in EMAC_RX_FRM_FLT */
191 #define EMAC_FRM_FLT_RXALL BIT(0)
192 #define EMAC_FRM_FLT_CTL BIT(13)
193 #define EMAC_FRM_FLT_MULTICAST BIT(16)
196 #define EMAC_RX_MD BIT(1)
197 #define EMAC_RX_TH_MASK GENMASK(5, 4)
198 #define EMAC_RX_TH_32 0
199 #define EMAC_RX_TH_64 (0x1 << 4)
200 #define EMAC_RX_TH_96 (0x2 << 4)
201 #define EMAC_RX_TH_128 (0x3 << 4)
202 #define EMAC_RX_DMA_EN BIT(30)
203 #define EMAC_RX_DMA_START BIT(31)
206 #define EMAC_TX_MD BIT(1)
207 #define EMAC_TX_NEXT_FRM BIT(2)
208 #define EMAC_TX_TH_MASK GENMASK(10, 8)
209 #define EMAC_TX_TH_64 0
210 #define EMAC_TX_TH_128 (0x1 << 8)
211 #define EMAC_TX_TH_192 (0x2 << 8)
212 #define EMAC_TX_TH_256 (0x3 << 8)
213 #define EMAC_TX_DMA_EN BIT(30)
214 #define EMAC_TX_DMA_START BIT(31)
216 /* Used in RX_CTL0 */
217 #define EMAC_RX_RECEIVER_EN BIT(31)
218 #define EMAC_RX_DO_CRC BIT(27)
219 #define EMAC_RX_FLOW_CTL_EN BIT(16)
221 /* Used in TX_CTL0 */
222 #define EMAC_TX_TRANSMITTER_EN BIT(31)
224 /* Used in EMAC_TX_FLOW_CTL */
225 #define EMAC_TX_FLOW_CTL_EN BIT(0)
227 /* Used in EMAC_INT_STA */
228 #define EMAC_TX_INT BIT(0)
229 #define EMAC_TX_DMA_STOP_INT BIT(1)
230 #define EMAC_TX_BUF_UA_INT BIT(2)
231 #define EMAC_TX_TIMEOUT_INT BIT(3)
232 #define EMAC_TX_UNDERFLOW_INT BIT(4)
233 #define EMAC_TX_EARLY_INT BIT(5)
234 #define EMAC_RX_INT BIT(8)
235 #define EMAC_RX_BUF_UA_INT BIT(9)
236 #define EMAC_RX_DMA_STOP_INT BIT(10)
237 #define EMAC_RX_TIMEOUT_INT BIT(11)
238 #define EMAC_RX_OVERFLOW_INT BIT(12)
239 #define EMAC_RX_EARLY_INT BIT(13)
240 #define EMAC_RGMII_STA_INT BIT(16)
242 #define MAC_ADDR_TYPE_DST BIT(31)
244 /* H3 specific bits for EPHY */
245 #define H3_EPHY_ADDR_SHIFT 20
246 #define H3_EPHY_CLK_SEL BIT(18) /* 1: 24MHz, 0: 25MHz */
247 #define H3_EPHY_LED_POL BIT(17) /* 1: active low, 0: active high */
248 #define H3_EPHY_SHUTDOWN BIT(16) /* 1: shutdown, 0: power up */
249 #define H3_EPHY_SELECT BIT(15) /* 1: internal PHY, 0: external PHY */
250 #define H3_EPHY_MUX_MASK (H3_EPHY_SHUTDOWN | H3_EPHY_SELECT)
251 #define DWMAC_SUN8I_MDIO_MUX_INTERNAL_ID 1
252 #define DWMAC_SUN8I_MDIO_MUX_EXTERNAL_ID 2
254 /* H3/A64 specific bits */
255 #define SYSCON_RMII_EN BIT(13) /* 1: enable RMII (overrides EPIT) */
257 /* Generic system control EMAC_CLK bits */
258 #define SYSCON_ETXDC_SHIFT 10
259 #define SYSCON_ERXDC_SHIFT 5
260 /* EMAC PHY Interface Type */
261 #define SYSCON_EPIT BIT(2) /* 1: RGMII, 0: MII */
262 #define SYSCON_ETCS_MASK GENMASK(1, 0)
263 #define SYSCON_ETCS_MII 0x0
264 #define SYSCON_ETCS_EXT_GMII 0x1
265 #define SYSCON_ETCS_INT_GMII 0x2
267 /* sun8i_dwmac_dma_reset() - reset the EMAC
268 * Called from stmmac via stmmac_dma_ops->reset
270 static int sun8i_dwmac_dma_reset(void __iomem
*ioaddr
)
272 writel(0, ioaddr
+ EMAC_RX_CTL1
);
273 writel(0, ioaddr
+ EMAC_TX_CTL1
);
274 writel(0, ioaddr
+ EMAC_RX_FRM_FLT
);
275 writel(0, ioaddr
+ EMAC_RX_DESC_LIST
);
276 writel(0, ioaddr
+ EMAC_TX_DESC_LIST
);
277 writel(0, ioaddr
+ EMAC_INT_EN
);
278 writel(0x1FFFFFF, ioaddr
+ EMAC_INT_STA
);
282 /* sun8i_dwmac_dma_init() - initialize the EMAC
283 * Called from stmmac via stmmac_dma_ops->init
285 static void sun8i_dwmac_dma_init(void __iomem
*ioaddr
,
286 struct stmmac_dma_cfg
*dma_cfg
, int atds
)
288 writel(EMAC_RX_INT
| EMAC_TX_INT
, ioaddr
+ EMAC_INT_EN
);
289 writel(0x1FFFFFF, ioaddr
+ EMAC_INT_STA
);
292 static void sun8i_dwmac_dma_init_rx(void __iomem
*ioaddr
,
293 struct stmmac_dma_cfg
*dma_cfg
,
294 dma_addr_t dma_rx_phy
, u32 chan
)
296 /* Write RX descriptors address */
297 writel(lower_32_bits(dma_rx_phy
), ioaddr
+ EMAC_RX_DESC_LIST
);
300 static void sun8i_dwmac_dma_init_tx(void __iomem
*ioaddr
,
301 struct stmmac_dma_cfg
*dma_cfg
,
302 dma_addr_t dma_tx_phy
, u32 chan
)
304 /* Write TX descriptors address */
305 writel(lower_32_bits(dma_tx_phy
), ioaddr
+ EMAC_TX_DESC_LIST
);
308 /* sun8i_dwmac_dump_regs() - Dump EMAC address space
309 * Called from stmmac_dma_ops->dump_regs
312 static void sun8i_dwmac_dump_regs(void __iomem
*ioaddr
, u32
*reg_space
)
316 for (i
= 0; i
< 0xC8; i
+= 4) {
317 if (i
== 0x32 || i
== 0x3C)
319 reg_space
[i
/ 4] = readl(ioaddr
+ i
);
323 /* sun8i_dwmac_dump_mac_regs() - Dump EMAC address space
324 * Called from stmmac_ops->dump_regs
327 static void sun8i_dwmac_dump_mac_regs(struct mac_device_info
*hw
,
331 void __iomem
*ioaddr
= hw
->pcsr
;
333 for (i
= 0; i
< 0xC8; i
+= 4) {
334 if (i
== 0x32 || i
== 0x3C)
336 reg_space
[i
/ 4] = readl(ioaddr
+ i
);
340 static void sun8i_dwmac_enable_dma_irq(void __iomem
*ioaddr
, u32 chan
,
343 u32 value
= readl(ioaddr
+ EMAC_INT_EN
);
346 value
|= EMAC_RX_INT
;
348 value
|= EMAC_TX_INT
;
350 writel(value
, ioaddr
+ EMAC_INT_EN
);
353 static void sun8i_dwmac_disable_dma_irq(void __iomem
*ioaddr
, u32 chan
,
356 u32 value
= readl(ioaddr
+ EMAC_INT_EN
);
359 value
&= ~EMAC_RX_INT
;
361 value
&= ~EMAC_TX_INT
;
363 writel(value
, ioaddr
+ EMAC_INT_EN
);
366 static void sun8i_dwmac_dma_start_tx(void __iomem
*ioaddr
, u32 chan
)
370 v
= readl(ioaddr
+ EMAC_TX_CTL1
);
371 v
|= EMAC_TX_DMA_START
;
373 writel(v
, ioaddr
+ EMAC_TX_CTL1
);
376 static void sun8i_dwmac_enable_dma_transmission(void __iomem
*ioaddr
)
380 v
= readl(ioaddr
+ EMAC_TX_CTL1
);
381 v
|= EMAC_TX_DMA_START
;
383 writel(v
, ioaddr
+ EMAC_TX_CTL1
);
386 static void sun8i_dwmac_dma_stop_tx(void __iomem
*ioaddr
, u32 chan
)
390 v
= readl(ioaddr
+ EMAC_TX_CTL1
);
391 v
&= ~EMAC_TX_DMA_EN
;
392 writel(v
, ioaddr
+ EMAC_TX_CTL1
);
395 static void sun8i_dwmac_dma_start_rx(void __iomem
*ioaddr
, u32 chan
)
399 v
= readl(ioaddr
+ EMAC_RX_CTL1
);
400 v
|= EMAC_RX_DMA_START
;
402 writel(v
, ioaddr
+ EMAC_RX_CTL1
);
405 static void sun8i_dwmac_dma_stop_rx(void __iomem
*ioaddr
, u32 chan
)
409 v
= readl(ioaddr
+ EMAC_RX_CTL1
);
410 v
&= ~EMAC_RX_DMA_EN
;
411 writel(v
, ioaddr
+ EMAC_RX_CTL1
);
414 static int sun8i_dwmac_dma_interrupt(void __iomem
*ioaddr
,
415 struct stmmac_extra_stats
*x
, u32 chan
)
420 v
= readl(ioaddr
+ EMAC_INT_STA
);
422 if (v
& EMAC_TX_INT
) {
424 x
->tx_normal_irq_n
++;
427 if (v
& EMAC_TX_DMA_STOP_INT
)
428 x
->tx_process_stopped_irq
++;
430 if (v
& EMAC_TX_BUF_UA_INT
)
431 x
->tx_process_stopped_irq
++;
433 if (v
& EMAC_TX_TIMEOUT_INT
)
434 ret
|= tx_hard_error
;
436 if (v
& EMAC_TX_UNDERFLOW_INT
) {
437 ret
|= tx_hard_error
;
438 x
->tx_undeflow_irq
++;
441 if (v
& EMAC_TX_EARLY_INT
)
444 if (v
& EMAC_RX_INT
) {
446 x
->rx_normal_irq_n
++;
449 if (v
& EMAC_RX_BUF_UA_INT
)
450 x
->rx_buf_unav_irq
++;
452 if (v
& EMAC_RX_DMA_STOP_INT
)
453 x
->rx_process_stopped_irq
++;
455 if (v
& EMAC_RX_TIMEOUT_INT
)
456 ret
|= tx_hard_error
;
458 if (v
& EMAC_RX_OVERFLOW_INT
) {
459 ret
|= tx_hard_error
;
460 x
->rx_overflow_irq
++;
463 if (v
& EMAC_RX_EARLY_INT
)
466 if (v
& EMAC_RGMII_STA_INT
)
469 writel(v
, ioaddr
+ EMAC_INT_STA
);
474 static void sun8i_dwmac_dma_operation_mode_rx(void __iomem
*ioaddr
, int mode
,
475 u32 channel
, int fifosz
, u8 qmode
)
479 v
= readl(ioaddr
+ EMAC_RX_CTL1
);
480 if (mode
== SF_DMA_MODE
) {
484 v
&= ~EMAC_RX_TH_MASK
;
494 writel(v
, ioaddr
+ EMAC_RX_CTL1
);
497 static void sun8i_dwmac_dma_operation_mode_tx(void __iomem
*ioaddr
, int mode
,
498 u32 channel
, int fifosz
, u8 qmode
)
502 v
= readl(ioaddr
+ EMAC_TX_CTL1
);
503 if (mode
== SF_DMA_MODE
) {
505 /* Undocumented bit (called TX_NEXT_FRM in BSP), the original
507 * "Operating on second frame increase the performance
508 * especially when transmit store-and-forward is used."
510 v
|= EMAC_TX_NEXT_FRM
;
513 v
&= ~EMAC_TX_TH_MASK
;
523 writel(v
, ioaddr
+ EMAC_TX_CTL1
);
526 static const struct stmmac_dma_ops sun8i_dwmac_dma_ops
= {
527 .reset
= sun8i_dwmac_dma_reset
,
528 .init
= sun8i_dwmac_dma_init
,
529 .init_rx_chan
= sun8i_dwmac_dma_init_rx
,
530 .init_tx_chan
= sun8i_dwmac_dma_init_tx
,
531 .dump_regs
= sun8i_dwmac_dump_regs
,
532 .dma_rx_mode
= sun8i_dwmac_dma_operation_mode_rx
,
533 .dma_tx_mode
= sun8i_dwmac_dma_operation_mode_tx
,
534 .enable_dma_transmission
= sun8i_dwmac_enable_dma_transmission
,
535 .enable_dma_irq
= sun8i_dwmac_enable_dma_irq
,
536 .disable_dma_irq
= sun8i_dwmac_disable_dma_irq
,
537 .start_tx
= sun8i_dwmac_dma_start_tx
,
538 .stop_tx
= sun8i_dwmac_dma_stop_tx
,
539 .start_rx
= sun8i_dwmac_dma_start_rx
,
540 .stop_rx
= sun8i_dwmac_dma_stop_rx
,
541 .dma_interrupt
= sun8i_dwmac_dma_interrupt
,
544 static int sun8i_dwmac_power_internal_phy(struct stmmac_priv
*priv
);
546 static int sun8i_dwmac_init(struct platform_device
*pdev
, void *priv
)
548 struct net_device
*ndev
= platform_get_drvdata(pdev
);
549 struct sunxi_priv_data
*gmac
= priv
;
552 if (gmac
->regulator
) {
553 ret
= regulator_enable(gmac
->regulator
);
555 dev_err(&pdev
->dev
, "Fail to enable regulator\n");
560 ret
= clk_prepare_enable(gmac
->tx_clk
);
562 dev_err(&pdev
->dev
, "Could not enable AHB clock\n");
563 goto err_disable_regulator
;
566 if (gmac
->use_internal_phy
) {
567 ret
= sun8i_dwmac_power_internal_phy(netdev_priv(ndev
));
569 goto err_disable_clk
;
575 clk_disable_unprepare(gmac
->tx_clk
);
576 err_disable_regulator
:
578 regulator_disable(gmac
->regulator
);
583 static void sun8i_dwmac_core_init(struct mac_device_info
*hw
,
584 struct net_device
*dev
)
586 void __iomem
*ioaddr
= hw
->pcsr
;
589 v
= (8 << EMAC_BURSTLEN_SHIFT
); /* burst len */
590 writel(v
, ioaddr
+ EMAC_BASIC_CTL1
);
593 static void sun8i_dwmac_set_mac(void __iomem
*ioaddr
, bool enable
)
597 t
= readl(ioaddr
+ EMAC_TX_CTL0
);
598 r
= readl(ioaddr
+ EMAC_RX_CTL0
);
600 t
|= EMAC_TX_TRANSMITTER_EN
;
601 r
|= EMAC_RX_RECEIVER_EN
;
603 t
&= ~EMAC_TX_TRANSMITTER_EN
;
604 r
&= ~EMAC_RX_RECEIVER_EN
;
606 writel(t
, ioaddr
+ EMAC_TX_CTL0
);
607 writel(r
, ioaddr
+ EMAC_RX_CTL0
);
610 /* Set MAC address at slot reg_n
611 * All slot > 0 need to be enabled with MAC_ADDR_TYPE_DST
612 * If addr is NULL, clear the slot
614 static void sun8i_dwmac_set_umac_addr(struct mac_device_info
*hw
,
618 void __iomem
*ioaddr
= hw
->pcsr
;
622 writel(0, ioaddr
+ EMAC_MACADDR_HI(reg_n
));
626 stmmac_set_mac_addr(ioaddr
, addr
, EMAC_MACADDR_HI(reg_n
),
627 EMAC_MACADDR_LO(reg_n
));
629 v
= readl(ioaddr
+ EMAC_MACADDR_HI(reg_n
));
630 v
|= MAC_ADDR_TYPE_DST
;
631 writel(v
, ioaddr
+ EMAC_MACADDR_HI(reg_n
));
635 static void sun8i_dwmac_get_umac_addr(struct mac_device_info
*hw
,
639 void __iomem
*ioaddr
= hw
->pcsr
;
641 stmmac_get_mac_addr(ioaddr
, addr
, EMAC_MACADDR_HI(reg_n
),
642 EMAC_MACADDR_LO(reg_n
));
645 /* caution this function must return non 0 to work */
646 static int sun8i_dwmac_rx_ipc_enable(struct mac_device_info
*hw
)
648 void __iomem
*ioaddr
= hw
->pcsr
;
651 v
= readl(ioaddr
+ EMAC_RX_CTL0
);
653 writel(v
, ioaddr
+ EMAC_RX_CTL0
);
658 static void sun8i_dwmac_set_filter(struct mac_device_info
*hw
,
659 struct net_device
*dev
)
661 void __iomem
*ioaddr
= hw
->pcsr
;
664 struct netdev_hw_addr
*ha
;
665 int macaddrs
= netdev_uc_count(dev
) + netdev_mc_count(dev
) + 1;
667 v
= EMAC_FRM_FLT_CTL
;
669 if (dev
->flags
& IFF_PROMISC
) {
670 v
= EMAC_FRM_FLT_RXALL
;
671 } else if (dev
->flags
& IFF_ALLMULTI
) {
672 v
|= EMAC_FRM_FLT_MULTICAST
;
673 } else if (macaddrs
<= hw
->unicast_filter_entries
) {
674 if (!netdev_mc_empty(dev
)) {
675 netdev_for_each_mc_addr(ha
, dev
) {
676 sun8i_dwmac_set_umac_addr(hw
, ha
->addr
, i
);
680 if (!netdev_uc_empty(dev
)) {
681 netdev_for_each_uc_addr(ha
, dev
) {
682 sun8i_dwmac_set_umac_addr(hw
, ha
->addr
, i
);
687 if (!(readl(ioaddr
+ EMAC_RX_FRM_FLT
) & EMAC_FRM_FLT_RXALL
))
688 netdev_info(dev
, "Too many address, switching to promiscuous\n");
689 v
= EMAC_FRM_FLT_RXALL
;
692 /* Disable unused address filter slots */
693 while (i
< hw
->unicast_filter_entries
)
694 sun8i_dwmac_set_umac_addr(hw
, NULL
, i
++);
696 writel(v
, ioaddr
+ EMAC_RX_FRM_FLT
);
699 static void sun8i_dwmac_flow_ctrl(struct mac_device_info
*hw
,
700 unsigned int duplex
, unsigned int fc
,
701 unsigned int pause_time
, u32 tx_cnt
)
703 void __iomem
*ioaddr
= hw
->pcsr
;
706 v
= readl(ioaddr
+ EMAC_RX_CTL0
);
708 v
|= EMAC_RX_FLOW_CTL_EN
;
710 v
&= ~EMAC_RX_FLOW_CTL_EN
;
711 writel(v
, ioaddr
+ EMAC_RX_CTL0
);
713 v
= readl(ioaddr
+ EMAC_TX_FLOW_CTL
);
715 v
|= EMAC_TX_FLOW_CTL_EN
;
717 v
&= ~EMAC_TX_FLOW_CTL_EN
;
718 writel(v
, ioaddr
+ EMAC_TX_FLOW_CTL
);
721 static int sun8i_dwmac_reset(struct stmmac_priv
*priv
)
726 v
= readl(priv
->ioaddr
+ EMAC_BASIC_CTL1
);
727 writel(v
| 0x01, priv
->ioaddr
+ EMAC_BASIC_CTL1
);
729 /* The timeout was previoulsy set to 10ms, but some board (OrangePI0)
730 * need more if no cable plugged. 100ms seems OK
732 err
= readl_poll_timeout(priv
->ioaddr
+ EMAC_BASIC_CTL1
, v
,
733 !(v
& 0x01), 100, 100000);
736 dev_err(priv
->device
, "EMAC reset timeout\n");
742 /* Search in mdio-mux node for internal PHY node and get its clk/reset */
743 static int get_ephy_nodes(struct stmmac_priv
*priv
)
745 struct sunxi_priv_data
*gmac
= priv
->plat
->bsp_priv
;
746 struct device_node
*mdio_mux
, *iphynode
;
747 struct device_node
*mdio_internal
;
750 mdio_mux
= of_get_child_by_name(priv
->device
->of_node
, "mdio-mux");
752 dev_err(priv
->device
, "Cannot get mdio-mux node\n");
756 mdio_internal
= of_get_compatible_child(mdio_mux
,
757 "allwinner,sun8i-h3-mdio-internal");
758 of_node_put(mdio_mux
);
759 if (!mdio_internal
) {
760 dev_err(priv
->device
, "Cannot get internal_mdio node\n");
764 /* Seek for internal PHY */
765 for_each_child_of_node(mdio_internal
, iphynode
) {
766 gmac
->ephy_clk
= of_clk_get(iphynode
, 0);
767 if (IS_ERR(gmac
->ephy_clk
))
769 gmac
->rst_ephy
= of_reset_control_get_exclusive(iphynode
, NULL
);
770 if (IS_ERR(gmac
->rst_ephy
)) {
771 ret
= PTR_ERR(gmac
->rst_ephy
);
772 if (ret
== -EPROBE_DEFER
) {
773 of_node_put(iphynode
);
774 of_node_put(mdio_internal
);
779 dev_info(priv
->device
, "Found internal PHY node\n");
780 of_node_put(iphynode
);
781 of_node_put(mdio_internal
);
785 of_node_put(mdio_internal
);
789 static int sun8i_dwmac_power_internal_phy(struct stmmac_priv
*priv
)
791 struct sunxi_priv_data
*gmac
= priv
->plat
->bsp_priv
;
794 if (gmac
->internal_phy_powered
) {
795 dev_warn(priv
->device
, "Internal PHY already powered\n");
799 dev_info(priv
->device
, "Powering internal PHY\n");
800 ret
= clk_prepare_enable(gmac
->ephy_clk
);
802 dev_err(priv
->device
, "Cannot enable internal PHY\n");
806 /* Make sure the EPHY is properly reseted, as U-Boot may leave
807 * it at deasserted state, and thus it may fail to reset EMAC.
809 reset_control_assert(gmac
->rst_ephy
);
811 ret
= reset_control_deassert(gmac
->rst_ephy
);
813 dev_err(priv
->device
, "Cannot deassert internal phy\n");
814 clk_disable_unprepare(gmac
->ephy_clk
);
818 gmac
->internal_phy_powered
= true;
823 static int sun8i_dwmac_unpower_internal_phy(struct sunxi_priv_data
*gmac
)
825 if (!gmac
->internal_phy_powered
)
828 clk_disable_unprepare(gmac
->ephy_clk
);
829 reset_control_assert(gmac
->rst_ephy
);
830 gmac
->internal_phy_powered
= false;
834 /* MDIO multiplexing switch function
835 * This function is called by the mdio-mux layer when it thinks the mdio bus
836 * multiplexer needs to switch.
837 * 'current_child' is the current value of the mux register
838 * 'desired_child' is the value of the 'reg' property of the target child MDIO
840 * The first time this function is called, current_child == -1.
841 * If current_child == desired_child, then the mux is already set to the
844 static int mdio_mux_syscon_switch_fn(int current_child
, int desired_child
,
847 struct stmmac_priv
*priv
= data
;
848 struct sunxi_priv_data
*gmac
= priv
->plat
->bsp_priv
;
852 if (current_child
^ desired_child
) {
853 regmap_field_read(gmac
->regmap_field
, ®
);
854 switch (desired_child
) {
855 case DWMAC_SUN8I_MDIO_MUX_INTERNAL_ID
:
856 dev_info(priv
->device
, "Switch mux to internal PHY");
857 val
= (reg
& ~H3_EPHY_MUX_MASK
) | H3_EPHY_SELECT
;
858 gmac
->use_internal_phy
= true;
860 case DWMAC_SUN8I_MDIO_MUX_EXTERNAL_ID
:
861 dev_info(priv
->device
, "Switch mux to external PHY");
862 val
= (reg
& ~H3_EPHY_MUX_MASK
) | H3_EPHY_SHUTDOWN
;
863 gmac
->use_internal_phy
= false;
866 dev_err(priv
->device
, "Invalid child ID %x\n",
870 regmap_field_write(gmac
->regmap_field
, val
);
871 if (gmac
->use_internal_phy
) {
872 ret
= sun8i_dwmac_power_internal_phy(priv
);
876 sun8i_dwmac_unpower_internal_phy(gmac
);
878 /* After changing syscon value, the MAC need reset or it will
879 * use the last value (and so the last PHY set).
881 ret
= sun8i_dwmac_reset(priv
);
886 static int sun8i_dwmac_register_mdio_mux(struct stmmac_priv
*priv
)
889 struct device_node
*mdio_mux
;
890 struct sunxi_priv_data
*gmac
= priv
->plat
->bsp_priv
;
892 mdio_mux
= of_get_child_by_name(priv
->device
->of_node
, "mdio-mux");
896 ret
= mdio_mux_init(priv
->device
, mdio_mux
, mdio_mux_syscon_switch_fn
,
897 &gmac
->mux_handle
, priv
, priv
->mii
);
901 static int sun8i_dwmac_set_syscon(struct device
*dev
,
902 struct plat_stmmacenet_data
*plat
)
904 struct sunxi_priv_data
*gmac
= plat
->bsp_priv
;
905 struct device_node
*node
= dev
->of_node
;
909 ret
= regmap_field_read(gmac
->regmap_field
, &val
);
911 dev_err(dev
, "Fail to read from regmap field.\n");
915 reg
= gmac
->variant
->default_syscon_value
;
918 "Current syscon value is not the default %x (expect %x)\n",
921 if (gmac
->variant
->soc_has_internal_phy
) {
922 if (of_property_read_bool(node
, "allwinner,leds-active-low"))
923 reg
|= H3_EPHY_LED_POL
;
925 reg
&= ~H3_EPHY_LED_POL
;
927 /* Force EPHY xtal frequency to 24MHz. */
928 reg
|= H3_EPHY_CLK_SEL
;
930 ret
= of_mdio_parse_addr(dev
, plat
->phy_node
);
932 dev_err(dev
, "Could not parse MDIO addr\n");
935 /* of_mdio_parse_addr returns a valid (0 ~ 31) PHY
936 * address. No need to mask it again.
938 reg
|= 1 << H3_EPHY_ADDR_SHIFT
;
940 /* For SoCs without internal PHY the PHY selection bit should be
941 * set to 0 (external PHY).
943 reg
&= ~H3_EPHY_SELECT
;
946 if (!of_property_read_u32(node
, "allwinner,tx-delay-ps", &val
)) {
948 dev_err(dev
, "tx-delay must be a multiple of 100\n");
952 dev_dbg(dev
, "set tx-delay to %x\n", val
);
953 if (val
<= gmac
->variant
->tx_delay_max
) {
954 reg
&= ~(gmac
->variant
->tx_delay_max
<<
956 reg
|= (val
<< SYSCON_ETXDC_SHIFT
);
958 dev_err(dev
, "Invalid TX clock delay: %d\n",
964 if (!of_property_read_u32(node
, "allwinner,rx-delay-ps", &val
)) {
966 dev_err(dev
, "rx-delay must be a multiple of 100\n");
970 dev_dbg(dev
, "set rx-delay to %x\n", val
);
971 if (val
<= gmac
->variant
->rx_delay_max
) {
972 reg
&= ~(gmac
->variant
->rx_delay_max
<<
974 reg
|= (val
<< SYSCON_ERXDC_SHIFT
);
976 dev_err(dev
, "Invalid RX clock delay: %d\n",
982 /* Clear interface mode bits */
983 reg
&= ~(SYSCON_ETCS_MASK
| SYSCON_EPIT
);
984 if (gmac
->variant
->support_rmii
)
985 reg
&= ~SYSCON_RMII_EN
;
987 switch (plat
->interface
) {
988 case PHY_INTERFACE_MODE_MII
:
991 case PHY_INTERFACE_MODE_RGMII
:
992 case PHY_INTERFACE_MODE_RGMII_ID
:
993 case PHY_INTERFACE_MODE_RGMII_RXID
:
994 case PHY_INTERFACE_MODE_RGMII_TXID
:
995 reg
|= SYSCON_EPIT
| SYSCON_ETCS_INT_GMII
;
997 case PHY_INTERFACE_MODE_RMII
:
998 reg
|= SYSCON_RMII_EN
| SYSCON_ETCS_EXT_GMII
;
1001 dev_err(dev
, "Unsupported interface mode: %s",
1002 phy_modes(plat
->interface
));
1006 regmap_field_write(gmac
->regmap_field
, reg
);
1011 static void sun8i_dwmac_unset_syscon(struct sunxi_priv_data
*gmac
)
1013 u32 reg
= gmac
->variant
->default_syscon_value
;
1015 regmap_field_write(gmac
->regmap_field
, reg
);
1018 static void sun8i_dwmac_exit(struct platform_device
*pdev
, void *priv
)
1020 struct sunxi_priv_data
*gmac
= priv
;
1022 if (gmac
->variant
->soc_has_internal_phy
) {
1023 if (gmac
->internal_phy_powered
)
1024 sun8i_dwmac_unpower_internal_phy(gmac
);
1027 clk_disable_unprepare(gmac
->tx_clk
);
1029 if (gmac
->regulator
)
1030 regulator_disable(gmac
->regulator
);
1033 static void sun8i_dwmac_set_mac_loopback(void __iomem
*ioaddr
, bool enable
)
1035 u32 value
= readl(ioaddr
+ EMAC_BASIC_CTL0
);
1038 value
|= EMAC_LOOPBACK
;
1040 value
&= ~EMAC_LOOPBACK
;
1042 writel(value
, ioaddr
+ EMAC_BASIC_CTL0
);
1045 static const struct stmmac_ops sun8i_dwmac_ops
= {
1046 .core_init
= sun8i_dwmac_core_init
,
1047 .set_mac
= sun8i_dwmac_set_mac
,
1048 .dump_regs
= sun8i_dwmac_dump_mac_regs
,
1049 .rx_ipc
= sun8i_dwmac_rx_ipc_enable
,
1050 .set_filter
= sun8i_dwmac_set_filter
,
1051 .flow_ctrl
= sun8i_dwmac_flow_ctrl
,
1052 .set_umac_addr
= sun8i_dwmac_set_umac_addr
,
1053 .get_umac_addr
= sun8i_dwmac_get_umac_addr
,
1054 .set_mac_loopback
= sun8i_dwmac_set_mac_loopback
,
1057 static struct mac_device_info
*sun8i_dwmac_setup(void *ppriv
)
1059 struct mac_device_info
*mac
;
1060 struct stmmac_priv
*priv
= ppriv
;
1062 mac
= devm_kzalloc(priv
->device
, sizeof(*mac
), GFP_KERNEL
);
1066 mac
->pcsr
= priv
->ioaddr
;
1067 mac
->mac
= &sun8i_dwmac_ops
;
1068 mac
->dma
= &sun8i_dwmac_dma_ops
;
1070 priv
->dev
->priv_flags
|= IFF_UNICAST_FLT
;
1072 /* The loopback bit seems to be re-set when link change
1073 * Simply mask it each time
1074 * Speed 10/100/1000 are set in BIT(2)/BIT(3)
1076 mac
->link
.speed_mask
= GENMASK(3, 2) | EMAC_LOOPBACK
;
1077 mac
->link
.speed10
= EMAC_SPEED_10
;
1078 mac
->link
.speed100
= EMAC_SPEED_100
;
1079 mac
->link
.speed1000
= EMAC_SPEED_1000
;
1080 mac
->link
.duplex
= EMAC_DUPLEX_FULL
;
1081 mac
->mii
.addr
= EMAC_MDIO_CMD
;
1082 mac
->mii
.data
= EMAC_MDIO_DATA
;
1083 mac
->mii
.reg_shift
= 4;
1084 mac
->mii
.reg_mask
= GENMASK(8, 4);
1085 mac
->mii
.addr_shift
= 12;
1086 mac
->mii
.addr_mask
= GENMASK(16, 12);
1087 mac
->mii
.clk_csr_shift
= 20;
1088 mac
->mii
.clk_csr_mask
= GENMASK(22, 20);
1089 mac
->unicast_filter_entries
= 8;
1091 /* Synopsys Id is not available */
1092 priv
->synopsys_id
= 0;
1097 static struct regmap
*sun8i_dwmac_get_syscon_from_dev(struct device_node
*node
)
1099 struct device_node
*syscon_node
;
1100 struct platform_device
*syscon_pdev
;
1101 struct regmap
*regmap
= NULL
;
1103 syscon_node
= of_parse_phandle(node
, "syscon", 0);
1105 return ERR_PTR(-ENODEV
);
1107 syscon_pdev
= of_find_device_by_node(syscon_node
);
1109 /* platform device might not be probed yet */
1110 regmap
= ERR_PTR(-EPROBE_DEFER
);
1114 /* If no regmap is found then the other device driver is at fault */
1115 regmap
= dev_get_regmap(&syscon_pdev
->dev
, NULL
);
1117 regmap
= ERR_PTR(-EINVAL
);
1119 platform_device_put(syscon_pdev
);
1121 of_node_put(syscon_node
);
1125 static int sun8i_dwmac_probe(struct platform_device
*pdev
)
1127 struct plat_stmmacenet_data
*plat_dat
;
1128 struct stmmac_resources stmmac_res
;
1129 struct sunxi_priv_data
*gmac
;
1130 struct device
*dev
= &pdev
->dev
;
1131 phy_interface_t interface
;
1133 struct stmmac_priv
*priv
;
1134 struct net_device
*ndev
;
1135 struct regmap
*regmap
;
1137 ret
= stmmac_get_platform_resources(pdev
, &stmmac_res
);
1141 gmac
= devm_kzalloc(dev
, sizeof(*gmac
), GFP_KERNEL
);
1145 gmac
->variant
= of_device_get_match_data(&pdev
->dev
);
1146 if (!gmac
->variant
) {
1147 dev_err(&pdev
->dev
, "Missing dwmac-sun8i variant\n");
1151 gmac
->tx_clk
= devm_clk_get(dev
, "stmmaceth");
1152 if (IS_ERR(gmac
->tx_clk
)) {
1153 dev_err(dev
, "Could not get TX clock\n");
1154 return PTR_ERR(gmac
->tx_clk
);
1157 /* Optional regulator for PHY */
1158 gmac
->regulator
= devm_regulator_get_optional(dev
, "phy");
1159 if (IS_ERR(gmac
->regulator
)) {
1160 if (PTR_ERR(gmac
->regulator
) == -EPROBE_DEFER
)
1161 return -EPROBE_DEFER
;
1162 dev_info(dev
, "No regulator found\n");
1163 gmac
->regulator
= NULL
;
1166 /* The "GMAC clock control" register might be located in the
1167 * CCU address range (on the R40), or the system control address
1168 * range (on most other sun8i and later SoCs).
1170 * The former controls most if not all clocks in the SoC. The
1171 * latter has an SoC identification register, and on some SoCs,
1172 * controls to map device specific SRAM to either the intended
1173 * peripheral, or the CPU address space.
1175 * In either case, there should be a coordinated and restricted
1176 * method of accessing the register needed here. This is done by
1177 * having the device export a custom regmap, instead of a generic
1178 * syscon, which grants all access to all registers.
1180 * To support old device trees, we fall back to using the syscon
1181 * interface if possible.
1183 regmap
= sun8i_dwmac_get_syscon_from_dev(pdev
->dev
.of_node
);
1185 regmap
= syscon_regmap_lookup_by_phandle(pdev
->dev
.of_node
,
1187 if (IS_ERR(regmap
)) {
1188 ret
= PTR_ERR(regmap
);
1189 dev_err(&pdev
->dev
, "Unable to map syscon: %d\n", ret
);
1193 gmac
->regmap_field
= devm_regmap_field_alloc(dev
, regmap
,
1194 *gmac
->variant
->syscon_field
);
1195 if (IS_ERR(gmac
->regmap_field
)) {
1196 ret
= PTR_ERR(gmac
->regmap_field
);
1197 dev_err(dev
, "Unable to map syscon register: %d\n", ret
);
1201 ret
= of_get_phy_mode(dev
->of_node
, &interface
);
1205 plat_dat
= stmmac_probe_config_dt(pdev
, &stmmac_res
.mac
);
1206 if (IS_ERR(plat_dat
))
1207 return PTR_ERR(plat_dat
);
1209 /* platform data specifying hardware features and callbacks.
1210 * hardware features were copied from Allwinner drivers.
1212 plat_dat
->interface
= interface
;
1213 plat_dat
->rx_coe
= STMMAC_RX_COE_TYPE2
;
1214 plat_dat
->tx_coe
= 1;
1215 plat_dat
->has_sun8i
= true;
1216 plat_dat
->bsp_priv
= gmac
;
1217 plat_dat
->init
= sun8i_dwmac_init
;
1218 plat_dat
->exit
= sun8i_dwmac_exit
;
1219 plat_dat
->setup
= sun8i_dwmac_setup
;
1221 ret
= sun8i_dwmac_set_syscon(&pdev
->dev
, plat_dat
);
1223 goto dwmac_deconfig
;
1225 ret
= sun8i_dwmac_init(pdev
, plat_dat
->bsp_priv
);
1229 ret
= stmmac_dvr_probe(&pdev
->dev
, plat_dat
, &stmmac_res
);
1233 ndev
= dev_get_drvdata(&pdev
->dev
);
1234 priv
= netdev_priv(ndev
);
1235 /* The mux must be registered after parent MDIO
1236 * so after stmmac_dvr_probe()
1238 if (gmac
->variant
->soc_has_internal_phy
) {
1239 ret
= get_ephy_nodes(priv
);
1242 ret
= sun8i_dwmac_register_mdio_mux(priv
);
1244 dev_err(&pdev
->dev
, "Failed to register mux\n");
1248 ret
= sun8i_dwmac_reset(priv
);
1255 reset_control_put(gmac
->rst_ephy
);
1256 clk_put(gmac
->ephy_clk
);
1258 stmmac_dvr_remove(&pdev
->dev
);
1260 sun8i_dwmac_exit(pdev
, gmac
);
1262 sun8i_dwmac_unset_syscon(gmac
);
1264 stmmac_remove_config_dt(pdev
, plat_dat
);
1269 static int sun8i_dwmac_remove(struct platform_device
*pdev
)
1271 struct net_device
*ndev
= platform_get_drvdata(pdev
);
1272 struct stmmac_priv
*priv
= netdev_priv(ndev
);
1273 struct sunxi_priv_data
*gmac
= priv
->plat
->bsp_priv
;
1275 if (gmac
->variant
->soc_has_internal_phy
) {
1276 mdio_mux_uninit(gmac
->mux_handle
);
1277 sun8i_dwmac_unpower_internal_phy(gmac
);
1278 reset_control_put(gmac
->rst_ephy
);
1279 clk_put(gmac
->ephy_clk
);
1282 stmmac_pltfr_remove(pdev
);
1283 sun8i_dwmac_unset_syscon(gmac
);
1288 static const struct of_device_id sun8i_dwmac_match
[] = {
1289 { .compatible
= "allwinner,sun8i-h3-emac",
1290 .data
= &emac_variant_h3
},
1291 { .compatible
= "allwinner,sun8i-v3s-emac",
1292 .data
= &emac_variant_v3s
},
1293 { .compatible
= "allwinner,sun8i-a83t-emac",
1294 .data
= &emac_variant_a83t
},
1295 { .compatible
= "allwinner,sun8i-r40-gmac",
1296 .data
= &emac_variant_r40
},
1297 { .compatible
= "allwinner,sun50i-a64-emac",
1298 .data
= &emac_variant_a64
},
1299 { .compatible
= "allwinner,sun50i-h6-emac",
1300 .data
= &emac_variant_h6
},
1303 MODULE_DEVICE_TABLE(of
, sun8i_dwmac_match
);
1305 static struct platform_driver sun8i_dwmac_driver
= {
1306 .probe
= sun8i_dwmac_probe
,
1307 .remove
= sun8i_dwmac_remove
,
1309 .name
= "dwmac-sun8i",
1310 .pm
= &stmmac_pltfr_pm_ops
,
1311 .of_match_table
= sun8i_dwmac_match
,
1314 module_platform_driver(sun8i_dwmac_driver
);
1316 MODULE_AUTHOR("Corentin Labbe <clabbe.montjoie@gmail.com>");
1317 MODULE_DESCRIPTION("Allwinner sun8i DWMAC specific glue layer");
1318 MODULE_LICENSE("GPL");