aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGrygorii Strashko2018-10-31 16:21:45 -0500
committerJoe Hershberger2018-11-05 10:42:01 -0600
commit79d8127168e211f4745bd2183a3338c6c4e2d003 (patch)
tree14bd35ecfad5852cc7dead96a75adf9821e4fc90 /drivers
parent4f41cd9a95c01c276c2d2ecbe0c78d722fe2e9ef (diff)
downloadu-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/Makefile2
-rw-r--r--drivers/net/ti/keystone_net.c118
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
5obj-$(CONFIG_DRIVER_TI_CPSW) += cpsw.o cpsw-common.o cpsw_mdio.o 5obj-$(CONFIG_DRIVER_TI_CPSW) += cpsw.o cpsw-common.o cpsw_mdio.o
6obj-$(CONFIG_DRIVER_TI_EMAC) += davinci_emac.o 6obj-$(CONFIG_DRIVER_TI_EMAC) += davinci_emac.o
7obj-$(CONFIG_DRIVER_TI_KEYSTONE_NET) += keystone_net.o 7obj-$(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
25DECLARE_GLOBAL_DATA_PTR; 27DECLARE_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
102static 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 */
123static 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 */
150static 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
169static void __attribute__((unused)) 102static 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}