diff options
author | Grygorii Strashko | 2018-10-31 16:21:45 -0500 |
---|---|---|
committer | Joe Hershberger | 2018-11-05 10:42:01 -0600 |
commit | 79d8127168e211f4745bd2183a3338c6c4e2d003 (patch) | |
tree | 14bd35ecfad5852cc7dead96a75adf9821e4fc90 /drivers | |
parent | 4f41cd9a95c01c276c2d2ecbe0c78d722fe2e9ef (diff) | |
download | u-boot-79d8127168e211f4745bd2183a3338c6c4e2d003.tar.gz u-boot-79d8127168e211f4745bd2183a3338c6c4e2d003.tar.xz u-boot-79d8127168e211f4745bd2183a3338c6c4e2d003.zip |
driver: net: ti: keystone_net: switch to use common mdio lib
Update TI Keystone 2 driver to re-use common mdio lib.
Reviewed-by: Tom Rini <trini@konsulko.com>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/ti/Makefile | 2 | ||||
-rw-r--r-- | drivers/net/ti/keystone_net.c | 118 |
2 files changed, 18 insertions, 102 deletions
diff --git a/drivers/net/ti/Makefile b/drivers/net/ti/Makefile index d2b6f2022b..ee3e4eb5d6 100644 --- a/drivers/net/ti/Makefile +++ b/drivers/net/ti/Makefile | |||
@@ -4,4 +4,4 @@ | |||
4 | 4 | ||
5 | obj-$(CONFIG_DRIVER_TI_CPSW) += cpsw.o cpsw-common.o cpsw_mdio.o | 5 | obj-$(CONFIG_DRIVER_TI_CPSW) += cpsw.o cpsw-common.o cpsw_mdio.o |
6 | obj-$(CONFIG_DRIVER_TI_EMAC) += davinci_emac.o | 6 | obj-$(CONFIG_DRIVER_TI_EMAC) += davinci_emac.o |
7 | obj-$(CONFIG_DRIVER_TI_KEYSTONE_NET) += keystone_net.o | 7 | obj-$(CONFIG_DRIVER_TI_KEYSTONE_NET) += keystone_net.o cpsw_mdio.o |
diff --git a/drivers/net/ti/keystone_net.c b/drivers/net/ti/keystone_net.c index 5550572207..a3ba91cc3f 100644 --- a/drivers/net/ti/keystone_net.c +++ b/drivers/net/ti/keystone_net.c | |||
@@ -22,6 +22,8 @@ | |||
22 | #include <asm/ti-common/keystone_serdes.h> | 22 | #include <asm/ti-common/keystone_serdes.h> |
23 | #include <asm/arch/psc_defs.h> | 23 | #include <asm/arch/psc_defs.h> |
24 | 24 | ||
25 | #include "cpsw_mdio.h" | ||
26 | |||
25 | DECLARE_GLOBAL_DATA_PTR; | 27 | DECLARE_GLOBAL_DATA_PTR; |
26 | 28 | ||
27 | #ifdef KEYSTONE2_EMAC_GIG_ENABLE | 29 | #ifdef KEYSTONE2_EMAC_GIG_ENABLE |
@@ -97,93 +99,20 @@ struct ks2_eth_priv { | |||
97 | bool has_mdio; | 99 | bool has_mdio; |
98 | }; | 100 | }; |
99 | 101 | ||
100 | /* MDIO */ | ||
101 | |||
102 | static int keystone2_mdio_reset(struct mii_dev *bus) | ||
103 | { | ||
104 | u_int32_t clkdiv; | ||
105 | struct mdio_regs *adap_mdio = bus->priv; | ||
106 | |||
107 | clkdiv = (EMAC_MDIO_BUS_FREQ / EMAC_MDIO_CLOCK_FREQ) - 1; | ||
108 | |||
109 | writel((clkdiv & 0xffff) | MDIO_CONTROL_ENABLE | | ||
110 | MDIO_CONTROL_FAULT | MDIO_CONTROL_FAULT_ENABLE, | ||
111 | &adap_mdio->control); | ||
112 | |||
113 | while (readl(&adap_mdio->control) & MDIO_CONTROL_IDLE) | ||
114 | ; | ||
115 | |||
116 | return 0; | ||
117 | } | ||
118 | |||
119 | /** | ||
120 | * keystone2_mdio_read - read a PHY register via MDIO interface. | ||
121 | * Blocks until operation is complete. | ||
122 | */ | ||
123 | static int keystone2_mdio_read(struct mii_dev *bus, | ||
124 | int addr, int devad, int reg) | ||
125 | { | ||
126 | int tmp; | ||
127 | struct mdio_regs *adap_mdio = bus->priv; | ||
128 | |||
129 | while (readl(&adap_mdio->useraccess0) & MDIO_USERACCESS0_GO) | ||
130 | ; | ||
131 | |||
132 | writel(MDIO_USERACCESS0_GO | MDIO_USERACCESS0_WRITE_READ | | ||
133 | ((reg & 0x1f) << 21) | ((addr & 0x1f) << 16), | ||
134 | &adap_mdio->useraccess0); | ||
135 | |||
136 | /* Wait for command to complete */ | ||
137 | while ((tmp = readl(&adap_mdio->useraccess0)) & MDIO_USERACCESS0_GO) | ||
138 | ; | ||
139 | |||
140 | if (tmp & MDIO_USERACCESS0_ACK) | ||
141 | return tmp & 0xffff; | ||
142 | |||
143 | return -1; | ||
144 | } | ||
145 | |||
146 | /** | ||
147 | * keystone2_mdio_write - write to a PHY register via MDIO interface. | ||
148 | * Blocks until operation is complete. | ||
149 | */ | ||
150 | static int keystone2_mdio_write(struct mii_dev *bus, | ||
151 | int addr, int devad, int reg, u16 val) | ||
152 | { | ||
153 | struct mdio_regs *adap_mdio = bus->priv; | ||
154 | |||
155 | while (readl(&adap_mdio->useraccess0) & MDIO_USERACCESS0_GO) | ||
156 | ; | ||
157 | |||
158 | writel(MDIO_USERACCESS0_GO | MDIO_USERACCESS0_WRITE_WRITE | | ||
159 | ((reg & 0x1f) << 21) | ((addr & 0x1f) << 16) | | ||
160 | (val & 0xffff), &adap_mdio->useraccess0); | ||
161 | |||
162 | /* Wait for command to complete */ | ||
163 | while (readl(&adap_mdio->useraccess0) & MDIO_USERACCESS0_GO) | ||
164 | ; | ||
165 | |||
166 | return 0; | ||
167 | } | ||
168 | |||
169 | static void __attribute__((unused)) | 102 | static void __attribute__((unused)) |
170 | keystone2_eth_gigabit_enable(struct udevice *dev) | 103 | keystone2_eth_gigabit_enable(struct udevice *dev) |
171 | { | 104 | { |
172 | struct ks2_eth_priv *priv = dev_get_priv(dev); | 105 | struct ks2_eth_priv *priv = dev_get_priv(dev); |
173 | u_int16_t data; | ||
174 | |||
175 | if (priv->has_mdio) { | ||
176 | data = keystone2_mdio_read(priv->mdio_bus, priv->phy_addr, | ||
177 | MDIO_DEVAD_NONE, 0); | ||
178 | /* speed selection MSB */ | ||
179 | if (!(data & (1 << 6))) | ||
180 | return; | ||
181 | } | ||
182 | 106 | ||
183 | /* | 107 | /* |
184 | * Check if link detected is giga-bit | 108 | * Check if link detected is giga-bit |
185 | * If Gigabit mode detected, enable gigbit in MAC | 109 | * If Gigabit mode detected, enable gigbit in MAC |
186 | */ | 110 | */ |
111 | if (priv->has_mdio) { | ||
112 | if (priv->phydev->speed != 1000) | ||
113 | return; | ||
114 | } | ||
115 | |||
187 | writel(readl(DEVICE_EMACSL_BASE(priv->slave_port - 1) + | 116 | writel(readl(DEVICE_EMACSL_BASE(priv->slave_port - 1) + |
188 | CPGMACSL_REG_CTL) | | 117 | CPGMACSL_REG_CTL) | |
189 | EMAC_MACCONTROL_GIGFORCE | EMAC_MACCONTROL_GIGABIT_ENABLE, | 118 | EMAC_MACCONTROL_GIGFORCE | EMAC_MACCONTROL_GIGABIT_ENABLE, |
@@ -484,8 +413,6 @@ static int ks2_eth_start(struct udevice *dev) | |||
484 | hw_config_streaming_switch(); | 413 | hw_config_streaming_switch(); |
485 | 414 | ||
486 | if (priv->has_mdio) { | 415 | if (priv->has_mdio) { |
487 | keystone2_mdio_reset(priv->mdio_bus); | ||
488 | |||
489 | phy_startup(priv->phydev); | 416 | phy_startup(priv->phydev); |
490 | if (priv->phydev->link == 0) { | 417 | if (priv->phydev->link == 0) { |
491 | pr_err("phy startup failed\n"); | 418 | pr_err("phy startup failed\n"); |
@@ -605,9 +532,9 @@ static int ks2_eth_probe(struct udevice *dev) | |||
605 | { | 532 | { |
606 | struct ks2_eth_priv *priv = dev_get_priv(dev); | 533 | struct ks2_eth_priv *priv = dev_get_priv(dev); |
607 | struct mii_dev *mdio_bus; | 534 | struct mii_dev *mdio_bus; |
608 | int ret; | ||
609 | 535 | ||
610 | priv->dev = dev; | 536 | priv->dev = dev; |
537 | priv->emac_open = false; | ||
611 | 538 | ||
612 | /* These clock enables has to be moved to common location */ | 539 | /* These clock enables has to be moved to common location */ |
613 | if (cpu_is_k2g()) | 540 | if (cpu_is_k2g()) |
@@ -626,45 +553,36 @@ static int ks2_eth_probe(struct udevice *dev) | |||
626 | if (cpu_is_k2e() || cpu_is_k2l()) | 553 | if (cpu_is_k2e() || cpu_is_k2l()) |
627 | pll_pa_clk_sel(); | 554 | pll_pa_clk_sel(); |
628 | 555 | ||
629 | |||
630 | priv->net_rx_buffs.buff_ptr = rx_buffs; | 556 | priv->net_rx_buffs.buff_ptr = rx_buffs; |
631 | priv->net_rx_buffs.num_buffs = RX_BUFF_NUMS; | 557 | priv->net_rx_buffs.num_buffs = RX_BUFF_NUMS; |
632 | priv->net_rx_buffs.buff_len = RX_BUFF_LEN; | 558 | priv->net_rx_buffs.buff_len = RX_BUFF_LEN; |
633 | 559 | ||
634 | if (priv->slave_port == 1) { | 560 | if (priv->slave_port == 1) { |
561 | #ifndef CONFIG_SOC_K2G | ||
562 | keystone2_net_serdes_setup(); | ||
563 | #endif | ||
635 | /* | 564 | /* |
636 | * Register MDIO bus for slave 0 only, other slave have | 565 | * Register MDIO bus for slave 0 only, other slave have |
637 | * to re-use the same | 566 | * to re-use the same |
638 | */ | 567 | */ |
639 | mdio_bus = mdio_alloc(); | 568 | mdio_bus = cpsw_mdio_init("ethernet-mdio", |
569 | (u32)priv->mdio_base, | ||
570 | EMAC_MDIO_CLOCK_FREQ, | ||
571 | EMAC_MDIO_BUS_FREQ); | ||
640 | if (!mdio_bus) { | 572 | if (!mdio_bus) { |
641 | pr_err("MDIO alloc failed\n"); | 573 | pr_err("MDIO alloc failed\n"); |
642 | return -ENOMEM; | 574 | return -ENOMEM; |
643 | } | 575 | } |
644 | priv->mdio_bus = mdio_bus; | 576 | priv->mdio_bus = mdio_bus; |
645 | mdio_bus->read = keystone2_mdio_read; | ||
646 | mdio_bus->write = keystone2_mdio_write; | ||
647 | mdio_bus->reset = keystone2_mdio_reset; | ||
648 | mdio_bus->priv = priv->mdio_base; | ||
649 | sprintf(mdio_bus->name, "ethernet-mdio"); | ||
650 | |||
651 | ret = mdio_register(mdio_bus); | ||
652 | if (ret) { | ||
653 | pr_err("MDIO bus register failed\n"); | ||
654 | return ret; | ||
655 | } | ||
656 | } else { | 577 | } else { |
657 | /* Get the MDIO bus from slave 0 device */ | 578 | /* Get the MDIO bus from slave 0 device */ |
658 | struct ks2_eth_priv *parent_priv; | 579 | struct ks2_eth_priv *parent_priv; |
659 | 580 | ||
660 | parent_priv = dev_get_priv(dev->parent); | 581 | parent_priv = dev_get_priv(dev->parent); |
661 | priv->mdio_bus = parent_priv->mdio_bus; | 582 | priv->mdio_bus = parent_priv->mdio_bus; |
583 | priv->mdio_base = parent_priv->mdio_base; | ||
662 | } | 584 | } |
663 | 585 | ||
664 | #ifndef CONFIG_SOC_K2G | ||
665 | keystone2_net_serdes_setup(); | ||
666 | #endif | ||
667 | |||
668 | priv->netcp_pktdma = &netcp_pktdma; | 586 | priv->netcp_pktdma = &netcp_pktdma; |
669 | 587 | ||
670 | if (priv->has_mdio) { | 588 | if (priv->has_mdio) { |
@@ -680,9 +598,7 @@ int ks2_eth_remove(struct udevice *dev) | |||
680 | { | 598 | { |
681 | struct ks2_eth_priv *priv = dev_get_priv(dev); | 599 | struct ks2_eth_priv *priv = dev_get_priv(dev); |
682 | 600 | ||
683 | free(priv->phydev); | 601 | cpsw_mdio_free(priv->mdio_bus); |
684 | mdio_unregister(priv->mdio_bus); | ||
685 | mdio_free(priv->mdio_bus); | ||
686 | 602 | ||
687 | return 0; | 603 | return 0; |
688 | } | 604 | } |