Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'arc_emac-next'

Caesar Wang says:

====================
arc_emac: fixes the emac issues and cleanup emac drivers

This series patches are based on kernel 4.5-rc7+ version.
Linux version 4.5.0-rc7-next-20160311+ (wxt@nb) (...) #45 SMP Sun Mar 13 16:17:56

The history patch in here:
Patch-v1: https://lkml.org/lkml/2016/3/11/209
Patch-v2: https://lkml.org/lkml/2016/3/13/39

Verified on kylin board with my github.
https://github.com/Caesar-github/rockchip/tree/kylin/next

That's verified on kylin board with ubuntu os.

This series patches are built all pass with Mr.robot on
https://github.com/Caesar-github/linux/tree/build-emac-v3

How to test and verify?

You can refer to the following wiki document.
http://rockchip.wikidot.com/linux-develop-guide

bootup log:
[ 1.264740] rockchip_emac 10200000.ethernet: no regulator found
[ 1.270908] rockchip_emac 10200000.ethernet: ARC EMAC detected with id: 0x7fd02
[ 1.278362] rockchip_emac 10200000.ethernet: IRQ is 29
[ 1.283747] rockchip_emac 10200000.ethernet: MAC address is now 06:5d:61:c7:39:41
[ 1.291314] rockchip_emac 10200000.ethernet: GPIO lookup for consumer phy-reset
[ 1.291333] rockchip_emac 10200000.ethernet: using device tree for GPIO lookup
[ 1.663155] rockchip_emac 10200000.ethernet: connected to Generic PHY phy with id 0xffffc816
[ 8.863448] rockchip_emac 10200000.ethernet eth0: Link is Up - 100Mbps/Full - flow control off

root@localhost:/# busybox ping www.baidu.com
PING www.baidu.com (14.215.177.38): 56 data bytes
64 bytes from 14.215.177.38: seq=0 ttl=48 time=35.046 ms
64 bytes from 14.215.177.38: seq=1 ttl=48 time=35.095 ms
64 bytes from 14.215.177.38: seq=2 ttl=48 time=34.203 ms
64 bytes from 14.215.177.38: seq=3 ttl=48 time=38.516 ms
...
---

1) This series has 6 patches: (1--->9)
net: arc_emac: make the rockchip emac document more compatible
net: arc_emac: add phy reset is optional for device tree
net: arc_emac: support the phy reset for emac driver
net: arc: trivial: cleanup the emac driver
clk: rockchip: add node-id for rk3036 emac hclk
clk: rockchip: associate the rk3036 HCLK_EMAC clock-id
clk: rockchip: add clock-id for rk3036 emac pll source clock
clk: rockchip: associate SCLK_MAC_PLL and disable reparenting on rk3036
ARM: dts: rockchip: add support emac for RK3036

2) This series patches have the following descriptions:

Hi Rob, David:
PATCH[1/9-2/9]: ====>
net: arc_emac: make the rockchip emac document more compatible
net: arc_emac: add phy reset is optional for device tree

The patches change the rockchip emac document for more compatible and
Add the phy reset property for document.
---

Hi David
PATCH[3/9]: ====>
net: arc_emac: support the phy reset for emac driver

The emac didn't work on kylin board since in some case the clocks parent changed.
The kylin hardware connects the phy reset pin, we should use it with real world.
As the previous patch discuss on https://patchwork.kernel.org/patch/8186801/

And as sergei/Heiko suggestions on
https://patchwork.kernel.org/patch/8564571/
---

Hi David
PATCH[4/9]: ====>
net: arc: trivial: cleanup the emac driver

The first time to look the emac drivers, I think that have to cleanup the drivers with scripts.
Although it's the trivial things, in order to be more read.
---

Hi Heiko,Michael,Stephen:
PATCH[5/9-8/9]: ====> clk: rockchip: rk3036: fix and add node id for emac clock

Four-part from https://patchwork.kernel.org/patch/8564581/
clk: rockchip: add node-id for rk3036 emac hclk
clk: rockchip: associate the rk3036 HCLK_EMAC clock-id
clk: rockchip: add clock-id for rk3036 emac pll source clock
clk: rockchip: associate SCLK_MAC_PLL and disable reparenting on rk3036

Add the emac needed clocks for rk3036 SoCs
---

Hi Heiko:
PATCH[9/9]: ====>
ARM: dts: rockchip: add support emac for RK3036

Add the emac needed main info for rk3036 dts.
---

Thanks your reviewing! :)

Changes in v3:
- %s/he/the
- Add the Cc people
- As Sergei comments, the original name is better, so
%s/reset-gpios/phy-reset-gpios
- Add the Cc people.
- Caused the build error since the missing include head file.
- %s/reset/phy-reset to match the device tree.
- Add the Cc people
- Add the Cc people.
- Add the Cc people.
- Add the Cc people.
- Add the Cc people.
- Add the Cc people.
- rename reset-gpio to phy-reset-gpios.
- change the commit.
- remove the pcfg_output_high, that's really not needed for emac.
- Add the Cc people.
- Fixes the 'zhengxing' to 'Xing Zheng'.

Changes in v2:
- change the commit and remove the repeat the name 'rockchip'.
- %s/phy-reset-gpios/reset-gpios
- As the pervious version, Sergei and Heiko comments on
https://patchwork.kernel.org/patch/8564571/.
- Nevermind, add signed-off since Heiko the original patch,
refer the Heiko's test patch on
https://github.com/mmind/linux-rockchip/commit/a943c588783438ff1c508dfa8c79f1709aa5775e
:)
- As the robot notice the build error since overflow in implicit
constant conversion.
- rename phy-reset-gpio to reset-gpios.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+201 -62
+7
Documentation/devicetree/bindings/net/arc_emac.txt
··· 7 7 - max-speed: see ethernet.txt file in the same directory. 8 8 - phy: see ethernet.txt file in the same directory. 9 9 10 + Optional properties: 11 + - phy-reset-gpios : Should specify the gpio for phy reset 12 + - phy-reset-duration : Reset duration in milliseconds. Should present 13 + only if property "phy-reset-gpios" is available. Missing the property 14 + will have the duration be 1 millisecond. Numbers greater than 1000 are 15 + invalid and 1 millisecond will be used instead. 16 + 10 17 Clock handling: 11 18 The clock frequency is needed to calculate and set polling period of EMAC. 12 19 It must be provided by one of:
+5 -3
Documentation/devicetree/bindings/net/emac_rockchip.txt
··· 1 - * ARC EMAC 10/100 Ethernet platform driver for Rockchip Rk3066/RK3188 SoCs 1 + * ARC EMAC 10/100 Ethernet platform driver for Rockchip RK3036/RK3066/RK3188 SoCs 2 2 3 3 Required properties: 4 - - compatible: Should be "rockchip,rk3066-emac" or "rockchip,rk3188-emac" 5 - according to the target SoC. 4 + - compatible: should be "rockchip,<name>-emac" 5 + "rockchip,rk3036-emac": found on RK3036 SoCs 6 + "rockchip,rk3066-emac": found on RK3066 SoCs 7 + "rockchip,rk3188-emac": found on RK3188 SoCs 6 8 - reg: Address and length of the register set for the device 7 9 - interrupts: Should contain the EMAC interrupts 8 10 - rockchip,grf: phandle to the syscon grf used to control speed and mode
+14
arch/arm/boot/dts/rk3036-evb.dts
··· 47 47 compatible = "rockchip,rk3036-evb", "rockchip,rk3036"; 48 48 }; 49 49 50 + &emac { 51 + pinctrl-names = "default"; 52 + pinctrl-0 = <&emac_xfer>, <&emac_mdio>; 53 + phy = <&phy0>; 54 + phy-reset-gpios = <&gpio2 22 GPIO_ACTIVE_LOW>; /* PHY_RST */ 55 + phy-reset-duration = <10>; /* millisecond */ 56 + 57 + status = "okay"; 58 + 59 + phy0: ethernet-phy@0 { 60 + reg = <0>; 61 + }; 62 + }; 63 + 50 64 &i2c1 { 51 65 status = "okay"; 52 66
+14
arch/arm/boot/dts/rk3036-kylin.dts
··· 60 60 status = "okay"; 61 61 }; 62 62 63 + &emac { 64 + pinctrl-names = "default"; 65 + pinctrl-0 = <&emac_xfer>, <&emac_mdio>; 66 + phy = <&phy0>; 67 + phy-reset-gpios = <&gpio2 22 GPIO_ACTIVE_LOW>; /* PHY_RST */ 68 + phy-reset-duration = <10>; /* millisecond */ 69 + 70 + status = "okay"; 71 + 72 + phy0: ethernet-phy@0 { 73 + reg = <0>; 74 + }; 75 + }; 76 + 63 77 &emmc { 64 78 status = "okay"; 65 79 };
+39
arch/arm/boot/dts/rk3036.dtsi
··· 186 186 status = "disabled"; 187 187 }; 188 188 189 + emac: ethernet@10200000 { 190 + compatible = "rockchip,rk3036-emac", "snps,arc-emac"; 191 + reg = <0x10200000 0x4000>; 192 + interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>; 193 + #address-cells = <1>; 194 + #size-cells = <0>; 195 + rockchip,grf = <&grf>; 196 + clocks = <&cru HCLK_MAC>, <&cru SCLK_MACREF>, <&cru SCLK_MAC>; 197 + clock-names = "hclk", "macref", "macclk"; 198 + /* 199 + * Fix the emac parent clock is DPLL instead of APLL. 200 + * since that will cause some unstable things if the cpufreq 201 + * is working. (e.g: the accurate 50MHz what mac_ref need) 202 + */ 203 + assigned-clocks = <&cru SCLK_MACPLL>; 204 + assigned-clock-parents = <&cru PLL_DPLL>; 205 + max-speed = <100>; 206 + phy-mode = "rmii"; 207 + status = "disabled"; 208 + }; 209 + 189 210 sdmmc: dwmmc@10214000 { 190 211 compatible = "rockchip,rk3036-dw-mshc", "rockchip,rk3288-dw-mshc"; 191 212 reg = <0x10214000 0x4000>; ··· 574 553 <1 29 RK_FUNC_2 &pcfg_pull_default>, 575 554 <1 30 RK_FUNC_2 &pcfg_pull_default>, 576 555 <1 31 RK_FUNC_2 &pcfg_pull_default>; 556 + }; 557 + }; 558 + 559 + emac { 560 + emac_xfer: emac-xfer { 561 + rockchip,pins = <2 10 RK_FUNC_1 &pcfg_pull_default>, /* crs_dvalid */ 562 + <2 13 RK_FUNC_1 &pcfg_pull_default>, /* tx_en */ 563 + <2 14 RK_FUNC_1 &pcfg_pull_default>, /* mac_clk */ 564 + <2 15 RK_FUNC_1 &pcfg_pull_default>, /* rx_err */ 565 + <2 16 RK_FUNC_1 &pcfg_pull_default>, /* rxd1 */ 566 + <2 17 RK_FUNC_1 &pcfg_pull_default>, /* rxd0 */ 567 + <2 18 RK_FUNC_1 &pcfg_pull_default>, /* txd1 */ 568 + <2 19 RK_FUNC_1 &pcfg_pull_default>; /* txd0 */ 569 + }; 570 + 571 + emac_mdio: emac-mdio { 572 + rockchip,pins = <2 12 RK_FUNC_1 &pcfg_pull_default>, /* mac_md */ 573 + <2 25 RK_FUNC_1 &pcfg_pull_default>; /* mac_mdclk */ 577 574 }; 578 575 }; 579 576
+2 -2
drivers/clk/rockchip/clk-rk3036.c
··· 343 343 RK2928_CLKSEL_CON(16), 0, 2, MFLAGS, 2, 5, DFLAGS, 344 344 RK2928_CLKGATE_CON(10), 5, GFLAGS), 345 345 346 - COMPOSITE_NOGATE(0, "mac_pll_src", mux_pll_src_3plls_p, 0, 346 + COMPOSITE_NOGATE(SCLK_MACPLL, "mac_pll_src", mux_pll_src_3plls_p, CLK_SET_RATE_NO_REPARENT, 347 347 RK2928_CLKSEL_CON(21), 0, 2, MFLAGS, 9, 5, DFLAGS), 348 348 MUX(SCLK_MACREF, "mac_clk_ref", mux_mac_p, CLK_SET_RATE_PARENT, 349 349 RK2928_CLKSEL_CON(21), 3, 1, MFLAGS), ··· 404 404 GATE(HCLK_OTG1, "hclk_otg1", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(7), 3, GFLAGS), 405 405 GATE(HCLK_I2S, "hclk_i2s", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 2, GFLAGS), 406 406 GATE(0, "hclk_sfc", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(3), 14, GFLAGS), 407 - GATE(0, "hclk_mac", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(3), 15, GFLAGS), 407 + GATE(HCLK_MAC, "hclk_mac", "hclk_peri", 0, RK2928_CLKGATE_CON(3), 5, GFLAGS), 408 408 409 409 /* pclk_peri gates */ 410 410 GATE(0, "pclk_peri_matrix", "pclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 1, GFLAGS),
+34 -26
drivers/net/ethernet/arc/emac.h
··· 14 14 #include <linux/clk.h> 15 15 16 16 /* STATUS and ENABLE Register bit masks */ 17 - #define TXINT_MASK (1<<0) /* Transmit interrupt */ 18 - #define RXINT_MASK (1<<1) /* Receive interrupt */ 19 - #define ERR_MASK (1<<2) /* Error interrupt */ 20 - #define TXCH_MASK (1<<3) /* Transmit chaining error interrupt */ 21 - #define MSER_MASK (1<<4) /* Missed packet counter error */ 22 - #define RXCR_MASK (1<<8) /* RXCRCERR counter rolled over */ 23 - #define RXFR_MASK (1<<9) /* RXFRAMEERR counter rolled over */ 24 - #define RXFL_MASK (1<<10) /* RXOFLOWERR counter rolled over */ 25 - #define MDIO_MASK (1<<12) /* MDIO complete interrupt */ 26 - #define TXPL_MASK (1<<31) /* Force polling of BD by EMAC */ 17 + #define TXINT_MASK (1 << 0) /* Transmit interrupt */ 18 + #define RXINT_MASK (1 << 1) /* Receive interrupt */ 19 + #define ERR_MASK (1 << 2) /* Error interrupt */ 20 + #define TXCH_MASK (1 << 3) /* Transmit chaining error interrupt */ 21 + #define MSER_MASK (1 << 4) /* Missed packet counter error */ 22 + #define RXCR_MASK (1 << 8) /* RXCRCERR counter rolled over */ 23 + #define RXFR_MASK (1 << 9) /* RXFRAMEERR counter rolled over */ 24 + #define RXFL_MASK (1 << 10) /* RXOFLOWERR counter rolled over */ 25 + #define MDIO_MASK (1 << 12) /* MDIO complete interrupt */ 26 + #define TXPL_MASK (1 << 31) /* Force polling of BD by EMAC */ 27 27 28 28 /* CONTROL Register bit masks */ 29 - #define EN_MASK (1<<0) /* VMAC enable */ 30 - #define TXRN_MASK (1<<3) /* TX enable */ 31 - #define RXRN_MASK (1<<4) /* RX enable */ 32 - #define DSBC_MASK (1<<8) /* Disable receive broadcast */ 33 - #define ENFL_MASK (1<<10) /* Enable Full-duplex */ 34 - #define PROM_MASK (1<<11) /* Promiscuous mode */ 29 + #define EN_MASK (1 << 0) /* VMAC enable */ 30 + #define TXRN_MASK (1 << 3) /* TX enable */ 31 + #define RXRN_MASK (1 << 4) /* RX enable */ 32 + #define DSBC_MASK (1 << 8) /* Disable receive broadcast */ 33 + #define ENFL_MASK (1 << 10) /* Enable Full-duplex */ 34 + #define PROM_MASK (1 << 11) /* Promiscuous mode */ 35 35 36 36 /* Buffer descriptor INFO bit masks */ 37 - #define OWN_MASK (1<<31) /* 0-CPU owns buffer, 1-EMAC owns buffer */ 38 - #define FIRST_MASK (1<<16) /* First buffer in chain */ 39 - #define LAST_MASK (1<<17) /* Last buffer in chain */ 37 + #define OWN_MASK (1 << 31) /* 0-CPU or 1-EMAC owns buffer */ 38 + #define FIRST_MASK (1 << 16) /* First buffer in chain */ 39 + #define LAST_MASK (1 << 17) /* Last buffer in chain */ 40 40 #define LEN_MASK 0x000007FF /* last 11 bits */ 41 - #define CRLS (1<<21) 42 - #define DEFR (1<<22) 43 - #define DROP (1<<23) 44 - #define RTRY (1<<24) 45 - #define LTCL (1<<28) 46 - #define UFLO (1<<29) 41 + #define CRLS (1 << 21) 42 + #define DEFR (1 << 22) 43 + #define DROP (1 << 23) 44 + #define RTRY (1 << 24) 45 + #define LTCL (1 << 28) 46 + #define UFLO (1 << 29) 47 47 48 48 #define FOR_EMAC OWN_MASK 49 49 #define FOR_CPU 0 ··· 66 66 R_MDIO, 67 67 }; 68 68 69 - #define TX_TIMEOUT (400*HZ/1000) /* Transmission timeout */ 69 + #define TX_TIMEOUT (400 * HZ / 1000) /* Transmission timeout */ 70 70 71 71 #define ARC_EMAC_NAPI_WEIGHT 40 /* Workload for NAPI */ 72 72 ··· 102 102 DEFINE_DMA_UNMAP_LEN(len); 103 103 }; 104 104 105 + struct arc_emac_mdio_bus_data { 106 + struct gpio_desc *reset_gpio; 107 + int msec; 108 + }; 109 + 105 110 /** 106 111 * struct arc_emac_priv - Storage of EMAC's private information. 107 112 * @dev: Pointer to the current device. ··· 136 131 struct device *dev; 137 132 struct phy_device *phy_dev; 138 133 struct mii_bus *bus; 134 + struct arc_emac_mdio_bus_data bus_data; 139 135 140 136 void __iomem *regs; 141 137 struct clk *clk; ··· 196 190 static inline void arc_reg_or(struct arc_emac_priv *priv, int reg, int mask) 197 191 { 198 192 unsigned int value = arc_reg_get(priv, reg); 193 + 199 194 arc_reg_set(priv, reg, value | mask); 200 195 } 201 196 ··· 212 205 static inline void arc_reg_clr(struct arc_emac_priv *priv, int reg, int mask) 213 206 { 214 207 unsigned int value = arc_reg_get(priv, reg); 208 + 215 209 arc_reg_set(priv, reg, value & ~mask); 216 210 } 217 211
+17 -18
drivers/net/ethernet/arc/emac_main.c
··· 26 26 27 27 #include "emac.h" 28 28 29 - 30 29 /** 31 30 * arc_emac_tx_avail - Return the number of available slots in the tx ring. 32 31 * @priv: Pointer to ARC EMAC private data structure. ··· 65 66 if (priv->duplex != phy_dev->duplex) { 66 67 reg = arc_reg_get(priv, R_CTRL); 67 68 68 - if (DUPLEX_FULL == phy_dev->duplex) 69 + if (phy_dev->duplex == DUPLEX_FULL) 69 70 reg |= ENFL_MASK; 70 71 else 71 72 reg &= ~ENFL_MASK; ··· 465 466 466 467 /* Set CONTROL */ 467 468 arc_reg_set(priv, R_CTRL, 468 - (RX_BD_NUM << 24) | /* RX BD table length */ 469 - (TX_BD_NUM << 16) | /* TX BD table length */ 470 - TXRN_MASK | RXRN_MASK); 469 + (RX_BD_NUM << 24) | /* RX BD table length */ 470 + (TX_BD_NUM << 16) | /* TX BD table length */ 471 + TXRN_MASK | RXRN_MASK); 471 472 472 473 napi_enable(&priv->napi); 473 474 ··· 532 533 struct buffer_state *tx_buff = &priv->tx_buff[i]; 533 534 534 535 if (tx_buff->skb) { 535 - dma_unmap_single(&ndev->dev, dma_unmap_addr(tx_buff, addr), 536 - dma_unmap_len(tx_buff, len), DMA_TO_DEVICE); 536 + dma_unmap_single(&ndev->dev, 537 + dma_unmap_addr(tx_buff, addr), 538 + dma_unmap_len(tx_buff, len), 539 + DMA_TO_DEVICE); 537 540 538 541 /* return the sk_buff to system */ 539 542 dev_kfree_skb_irq(tx_buff->skb); ··· 563 562 struct buffer_state *rx_buff = &priv->rx_buff[i]; 564 563 565 564 if (rx_buff->skb) { 566 - dma_unmap_single(&ndev->dev, dma_unmap_addr(rx_buff, addr), 567 - dma_unmap_len(rx_buff, len), DMA_FROM_DEVICE); 565 + dma_unmap_single(&ndev->dev, 566 + dma_unmap_addr(rx_buff, addr), 567 + dma_unmap_len(rx_buff, len), 568 + DMA_FROM_DEVICE); 568 569 569 570 /* return the sk_buff to system */ 570 571 dev_kfree_skb_irq(rx_buff->skb); ··· 720 717 struct arc_emac_priv *priv = netdev_priv(ndev); 721 718 unsigned int addr_low, addr_hi; 722 719 723 - addr_low = le32_to_cpu(*(__le32 *) &ndev->dev_addr[0]); 724 - addr_hi = le16_to_cpu(*(__le16 *) &ndev->dev_addr[4]); 720 + addr_low = le32_to_cpu(*(__le32 *)&ndev->dev_addr[0]); 721 + addr_hi = le16_to_cpu(*(__le16 *)&ndev->dev_addr[4]); 725 722 726 723 arc_reg_set(priv, R_ADDRL, addr_low); 727 724 arc_reg_set(priv, R_ADDRH, addr_hi); ··· 777 774 unsigned int id, clock_frequency, irq; 778 775 int err; 779 776 780 - 781 777 /* Get PHY from device tree */ 782 778 phy_node = of_parse_phandle(dev->of_node, "phy", 0); 783 779 if (!phy_node) { ··· 798 796 return -ENODEV; 799 797 } 800 798 801 - 802 799 ndev->netdev_ops = &arc_emac_netdev_ops; 803 800 ndev->ethtool_ops = &arc_emac_ethtool_ops; 804 801 ndev->watchdog_timeo = TX_TIMEOUT; ··· 808 807 priv->dev = dev; 809 808 810 809 priv->regs = devm_ioremap_resource(dev, &res_regs); 811 - if (IS_ERR(priv->regs)) { 810 + if (IS_ERR(priv->regs)) 812 811 return PTR_ERR(priv->regs); 813 - } 812 + 814 813 dev_dbg(dev, "Registers base address is 0x%p\n", priv->regs); 815 814 816 815 if (priv->clk) { ··· 931 930 unregister_netdev(ndev); 932 931 netif_napi_del(&priv->napi); 933 932 934 - if (!IS_ERR(priv->clk)) { 933 + if (!IS_ERR(priv->clk)) 935 934 clk_disable_unprepare(priv->clk); 936 - } 937 - 938 935 939 936 return 0; 940 937 }
+38 -1
drivers/net/ethernet/arc/emac_mdio.c
··· 7 7 #include <linux/delay.h> 8 8 #include <linux/of_mdio.h> 9 9 #include <linux/platform_device.h> 10 + #include <linux/gpio/consumer.h> 10 11 11 12 #include "emac.h" 12 13 ··· 94 93 phy_addr, reg_num, value); 95 94 96 95 arc_reg_set(priv, R_MDIO, 97 - 0x50020000 | (phy_addr << 23) | (reg_num << 18) | value); 96 + 0x50020000 | (phy_addr << 23) | (reg_num << 18) | value); 98 97 99 98 return arc_mdio_complete_wait(priv); 99 + } 100 + 101 + /** 102 + * arc_mdio_reset 103 + * @bus: points to the mii_bus structure 104 + * Description: reset the MII bus 105 + */ 106 + int arc_mdio_reset(struct mii_bus *bus) 107 + { 108 + struct arc_emac_priv *priv = bus->priv; 109 + struct arc_emac_mdio_bus_data *data = &priv->bus_data; 110 + 111 + if (data->reset_gpio) { 112 + gpiod_set_value_cansleep(data->reset_gpio, 1); 113 + msleep(data->msec); 114 + gpiod_set_value_cansleep(data->reset_gpio, 0); 115 + } 116 + 117 + return 0; 100 118 } 101 119 102 120 /** ··· 129 109 */ 130 110 int arc_mdio_probe(struct arc_emac_priv *priv) 131 111 { 112 + struct arc_emac_mdio_bus_data *data = &priv->bus_data; 113 + struct device_node *np = priv->dev->of_node; 132 114 struct mii_bus *bus; 133 115 int error; 134 116 ··· 144 122 bus->name = "Synopsys MII Bus", 145 123 bus->read = &arc_mdio_read; 146 124 bus->write = &arc_mdio_write; 125 + bus->reset = &arc_mdio_reset; 126 + 127 + /* optional reset-related properties */ 128 + data->reset_gpio = devm_gpiod_get_optional(priv->dev, "phy-reset", 129 + GPIOD_OUT_LOW); 130 + if (IS_ERR(data->reset_gpio)) { 131 + error = PTR_ERR(data->reset_gpio); 132 + dev_err(priv->dev, "Failed to request gpio: %d\n", error); 133 + return error; 134 + } 135 + 136 + of_property_read_u32(np, "phy-reset-duration", &data->msec); 137 + /* A sane reset duration should not be longer than 1s */ 138 + if (data->msec > 1000) 139 + data->msec = 1; 147 140 148 141 snprintf(bus->id, MII_BUS_ID_SIZE, "%s", bus->name); 149 142
+29 -12
drivers/net/ethernet/arc/emac_rockchip.c
··· 50 50 u32 data; 51 51 int err = 0; 52 52 53 - switch(speed) { 53 + switch (speed) { 54 54 case 10: 55 55 data = (1 << (speed_offset + 16)) | (0 << speed_offset); 56 56 break; ··· 83 83 }; 84 84 85 85 static const struct of_device_id emac_rockchip_dt_ids[] = { 86 - { .compatible = "rockchip,rk3036-emac", .data = &emac_rk3036_emac_data }, 87 - { .compatible = "rockchip,rk3066-emac", .data = &emac_rk3066_emac_data }, 88 - { .compatible = "rockchip,rk3188-emac", .data = &emac_rk3188_emac_data }, 86 + { 87 + .compatible = "rockchip,rk3036-emac", 88 + .data = &emac_rk3036_emac_data, 89 + }, 90 + { 91 + .compatible = "rockchip,rk3066-emac", 92 + .data = &emac_rk3066_emac_data, 93 + }, 94 + { 95 + .compatible = "rockchip,rk3188-emac", 96 + .data = &emac_rk3188_emac_data, 97 + }, 89 98 { /* Sentinel */ } 90 99 }; 91 100 ··· 132 123 goto out_netdev; 133 124 } 134 125 135 - priv->grf = syscon_regmap_lookup_by_phandle(dev->of_node, "rockchip,grf"); 126 + priv->grf = syscon_regmap_lookup_by_phandle(dev->of_node, 127 + "rockchip,grf"); 136 128 if (IS_ERR(priv->grf)) { 137 - dev_err(dev, "failed to retrieve global register file (%ld)\n", PTR_ERR(priv->grf)); 129 + dev_err(dev, "failed to retrieve global register file (%ld)\n", 130 + PTR_ERR(priv->grf)); 138 131 err = PTR_ERR(priv->grf); 139 132 goto out_netdev; 140 133 } ··· 146 135 147 136 priv->emac.clk = devm_clk_get(dev, "hclk"); 148 137 if (IS_ERR(priv->emac.clk)) { 149 - dev_err(dev, "failed to retrieve host clock (%ld)\n", PTR_ERR(priv->emac.clk)); 138 + dev_err(dev, "failed to retrieve host clock (%ld)\n", 139 + PTR_ERR(priv->emac.clk)); 150 140 err = PTR_ERR(priv->emac.clk); 151 141 goto out_netdev; 152 142 } 153 143 154 144 priv->refclk = devm_clk_get(dev, "macref"); 155 145 if (IS_ERR(priv->refclk)) { 156 - dev_err(dev, "failed to retrieve reference clock (%ld)\n", PTR_ERR(priv->refclk)); 146 + dev_err(dev, "failed to retrieve reference clock (%ld)\n", 147 + PTR_ERR(priv->refclk)); 157 148 err = PTR_ERR(priv->refclk); 158 149 goto out_netdev; 159 150 } ··· 192 179 193 180 err = regmap_write(priv->grf, priv->soc_data->grf_offset, data); 194 181 if (err) { 195 - dev_err(dev, "unable to apply initial settings to grf (%d)\n", err); 182 + dev_err(dev, "unable to apply initial settings to grf (%d)\n", 183 + err); 196 184 goto out_regulator_disable; 197 185 } 198 186 199 187 /* RMII interface needs always a rate of 50MHz */ 200 188 err = clk_set_rate(priv->refclk, 50000000); 201 189 if (err) 202 - dev_err(dev, "failed to change reference clock rate (%d)\n", err); 190 + dev_err(dev, 191 + "failed to change reference clock rate (%d)\n", err); 203 192 204 193 if (priv->soc_data->need_div_macclk) { 205 194 priv->macclk = devm_clk_get(dev, "macclk"); 206 195 if (IS_ERR(priv->macclk)) { 207 - dev_err(dev, "failed to retrieve mac clock (%ld)\n", PTR_ERR(priv->macclk)); 196 + dev_err(dev, "failed to retrieve mac clock (%ld)\n", 197 + PTR_ERR(priv->macclk)); 208 198 err = PTR_ERR(priv->macclk); 209 199 goto out_regulator_disable; 210 200 } ··· 221 205 /* RMII TX/RX needs always a rate of 25MHz */ 222 206 err = clk_set_rate(priv->macclk, 25000000); 223 207 if (err) 224 - dev_err(dev, "failed to change mac clock rate (%d)\n", err); 208 + dev_err(dev, 209 + "failed to change mac clock rate (%d)\n", err); 225 210 } 226 211 227 212 err = arc_emac_probe(ndev, interface);
+2
include/dt-bindings/clock/rk3036-cru.h
··· 54 54 #define SCLK_PVTM_VIDEO 125 55 55 #define SCLK_MAC 151 56 56 #define SCLK_MACREF 152 57 + #define SCLK_MACPLL 153 57 58 #define SCLK_SFC 160 58 59 59 60 /* aclk gates */ ··· 93 92 #define HCLK_SDMMC 456 94 93 #define HCLK_SDIO 457 95 94 #define HCLK_EMMC 459 95 + #define HCLK_MAC 460 96 96 #define HCLK_I2S 462 97 97 #define HCLK_LCDC 465 98 98 #define HCLK_ROM 467