driver: net: ti: keystone_net: Convert to ofnode functions

Convert fdt parsing functions to ofnode parsing functions.

Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
This commit is contained in:
Marek Behún 2022-04-11 21:20:54 +02:00 committed by Ramon Fried
parent 71f473916d
commit 71b65d8210

View File

@ -23,7 +23,6 @@
#include <asm/ti-common/keystone_net.h> #include <asm/ti-common/keystone_net.h>
#include <asm/ti-common/keystone_serdes.h> #include <asm/ti-common/keystone_serdes.h>
#include <asm/arch/psc_defs.h> #include <asm/arch/psc_defs.h>
#include <linux/libfdt.h>
#include "cpsw_mdio.h" #include "cpsw_mdio.h"
@ -91,9 +90,9 @@ struct ks2_eth_priv {
struct mii_dev *mdio_bus; struct mii_dev *mdio_bus;
int phy_addr; int phy_addr;
phy_interface_t phy_if; phy_interface_t phy_if;
int phy_of_handle; ofnode phy_ofnode;
int sgmii_link_type; int sgmii_link_type;
void *mdio_base; void * mdio_base;
struct rx_buff_desc net_rx_buffs; struct rx_buff_desc net_rx_buffs;
struct pktdma_cfg *netcp_pktdma; struct pktdma_cfg *netcp_pktdma;
void *hd; void *hd;
@ -593,8 +592,8 @@ static int ks2_eth_probe(struct udevice *dev)
priv->phydev = phy_connect(priv->mdio_bus, priv->phy_addr, priv->phydev = phy_connect(priv->mdio_bus, priv->phy_addr,
dev, priv->phy_if); dev, priv->phy_if);
#ifdef CONFIG_DM_ETH #ifdef CONFIG_DM_ETH
if (priv->phy_of_handle) if (ofnode_valid(priv->phy_ofnode))
priv->phydev->node = offset_to_ofnode(priv->phy_of_handle); priv->phydev->node = priv->phy_ofnode;
#endif #endif
phy_config(priv->phydev); phy_config(priv->phydev);
} }
@ -621,15 +620,13 @@ static const struct eth_ops ks2_eth_ops = {
.write_hwaddr = ks2_eth_write_hwaddr, .write_hwaddr = ks2_eth_write_hwaddr,
}; };
static int ks2_bind_one_slave(struct udevice *dev, int slave, int *gbe_0) static int ks2_bind_one_slave(struct udevice *dev, ofnode slave, ofnode *gbe_0)
{ {
const void *fdt = gd->fdt_blob;
char *slave_name; char *slave_name;
int slave_no; u32 slave_no;
int ret; int ret;
slave_no = fdtdec_get_int(fdt, slave, "slave-port", -ENOENT); if (ofnode_read_u32(slave, "slave-port", &slave_no))
if (slave_no == -ENOENT)
return 0; return 0;
if (gbe_0 && slave_no == 0) { if (gbe_0 && slave_no == 0) {
@ -641,28 +638,28 @@ static int ks2_bind_one_slave(struct udevice *dev, int slave, int *gbe_0)
/* Slave devices to be registered */ /* Slave devices to be registered */
slave_name = malloc(20); slave_name = malloc(20);
snprintf(slave_name, 20, "netcp@slave-%d", slave_no); snprintf(slave_name, 20, "netcp@slave-%d", slave_no);
ret = device_bind_driver_to_node(dev, "eth_ks2_sl", slave_name, ret = device_bind_driver_to_node(dev, "eth_ks2_sl", slave_name, slave,
offset_to_ofnode(slave), NULL); NULL);
if (ret) if (ret)
pr_err("ks2_net - not able to bind slave interfaces\n"); pr_err("ks2_net - not able to bind slave interfaces\n");
return ret; return ret;
} }
static int ks2_eth_bind_slaves(struct udevice *dev, int gbe, int *gbe_0) static int ks2_eth_bind_slaves(struct udevice *dev, ofnode gbe, ofnode *gbe_0)
{ {
int interfaces, sec_slave, slave, ret; ofnode interfaces, sec_slave, slave;
const void *fdt = gd->fdt_blob; int ret;
interfaces = fdt_subnode_offset(fdt, gbe, "interfaces"); interfaces = ofnode_find_subnode(gbe, "interfaces");
fdt_for_each_subnode(slave, fdt, interfaces) { ofnode_for_each_subnode(slave, interfaces) {
ret = ks2_bind_one_slave(dev, slave, gbe_0); ret = ks2_bind_one_slave(dev, slave, gbe_0);
if (ret) if (ret)
return ret; return ret;
} }
sec_slave = fdt_subnode_offset(fdt, gbe, "secondary-slave-ports"); sec_slave = ofnode_find_subnode(gbe, "secondary-slave-ports");
fdt_for_each_subnode(slave, fdt, sec_slave) { ofnode_for_each_subnode(slave, sec_slave) {
ret = ks2_bind_one_slave(dev, slave, NULL); ret = ks2_bind_one_slave(dev, slave, NULL);
if (ret) if (ret)
return ret; return ret;
@ -671,47 +668,40 @@ static int ks2_eth_bind_slaves(struct udevice *dev, int gbe, int *gbe_0)
return 0; return 0;
} }
static int ks2_eth_parse_slave_interface(int netcp, int slave, static int ks2_eth_parse_slave_interface(ofnode netcp, ofnode slave,
struct ks2_eth_priv *priv, struct ks2_eth_priv *priv,
struct eth_pdata *pdata) struct eth_pdata *pdata)
{ {
const void *fdt = gd->fdt_blob; struct ofnode_phandle_args dma_args;
int mdio; ofnode phy, mdio;
int phy;
int dma_count; int dma_count;
u32 dma_channel[8];
priv->slave_port = fdtdec_get_int(fdt, slave, "slave-port", -1); priv->slave_port = ofnode_read_s32_default(slave, "slave-port", -1);
priv->net_rx_buffs.rx_flow = priv->slave_port * 8; priv->net_rx_buffs.rx_flow = priv->slave_port * 8;
/* U-Boot slave port number starts with 1 instead of 0 */ /* U-Boot slave port number starts with 1 instead of 0 */
priv->slave_port += 1; priv->slave_port += 1;
dma_count = fdtdec_get_int_array_count(fdt, netcp, dma_count = ofnode_count_phandle_with_args(netcp, "ti,navigator-dmas",
"ti,navigator-dmas", NULL, 1);
dma_channel, 8); if (priv->slave_port < dma_count &&
!ofnode_parse_phandle_with_args(netcp, "ti,navigator-dmas", NULL, 1,
priv->slave_port - 1, &dma_args))
priv->net_rx_buffs.rx_flow = dma_args.args[0];
if (dma_count > (2 * priv->slave_port)) { priv->link_type = ofnode_read_s32_default(slave, "link-interface", -1);
int dma_idx;
dma_idx = priv->slave_port * 2 - 1; phy = ofnode_get_phy_node(slave);
priv->net_rx_buffs.rx_flow = dma_channel[dma_idx]; priv->phy_ofnode = phy;
} if (ofnode_valid(phy)) {
priv->phy_addr = ofnode_read_s32_default(phy, "reg", -1);
priv->link_type = fdtdec_get_int(fdt, slave, "link-interface", -1); mdio = ofnode_get_parent(phy);
if (!ofnode_valid(mdio)) {
phy = fdtdec_lookup_phandle(fdt, slave, "phy-handle");
if (phy >= 0) {
priv->phy_of_handle = phy;
priv->phy_addr = fdtdec_get_int(fdt, phy, "reg", -1);
mdio = fdt_parent_offset(fdt, phy);
if (mdio < 0) {
pr_err("mdio dt not found\n"); pr_err("mdio dt not found\n");
return -ENODEV; return -ENODEV;
} }
priv->mdio_base = (void *)fdtdec_get_addr(fdt, mdio, "reg"); priv->mdio_base = (void *)ofnode_get_addr(mdio);
} }
if (priv->link_type == LINK_TYPE_SGMII_MAC_TO_PHY_MODE) { if (priv->link_type == LINK_TYPE_SGMII_MAC_TO_PHY_MODE) {
@ -720,7 +710,7 @@ static int ks2_eth_parse_slave_interface(int netcp, int slave,
priv->sgmii_link_type = SGMII_LINK_MAC_PHY; priv->sgmii_link_type = SGMII_LINK_MAC_PHY;
priv->has_mdio = true; priv->has_mdio = true;
} else if (priv->link_type == LINK_TYPE_RGMII_LINK_MAC_PHY) { } else if (priv->link_type == LINK_TYPE_RGMII_LINK_MAC_PHY) {
priv->phy_if = ofnode_read_phy_mode(offset_to_ofnode(slave)); priv->phy_if = ofnode_read_phy_mode(slave);
if (priv->phy_if == PHY_INTERFACE_MODE_NA) if (priv->phy_if == PHY_INTERFACE_MODE_NA)
priv->phy_if = PHY_INTERFACE_MODE_RGMII; priv->phy_if = PHY_INTERFACE_MODE_RGMII;
pdata->phy_interface = priv->phy_if; pdata->phy_interface = priv->phy_if;
@ -741,23 +731,19 @@ static int ks2_eth_parse_slave_interface(int netcp, int slave,
static int ks2_sl_eth_of_to_plat(struct udevice *dev) static int ks2_sl_eth_of_to_plat(struct udevice *dev)
{ {
ofnode slave, interfaces, gbe, netcp_devices, netcp;
struct ks2_eth_priv *priv = dev_get_priv(dev); struct ks2_eth_priv *priv = dev_get_priv(dev);
struct eth_pdata *pdata = dev_get_plat(dev); struct eth_pdata *pdata = dev_get_plat(dev);
const void *fdt = gd->fdt_blob;
int slave = dev_of_offset(dev);
int interfaces;
int gbe;
int netcp_devices;
int netcp;
interfaces = fdt_parent_offset(fdt, slave); slave = dev_ofnode(dev);
gbe = fdt_parent_offset(fdt, interfaces); interfaces = ofnode_get_parent(slave);
netcp_devices = fdt_parent_offset(fdt, gbe); gbe = ofnode_get_parent(interfaces);
netcp = fdt_parent_offset(fdt, netcp_devices); netcp_devices = ofnode_get_parent(gbe);
netcp = ofnode_get_parent(netcp_devices);
ks2_eth_parse_slave_interface(netcp, slave, priv, pdata); ks2_eth_parse_slave_interface(netcp, slave, priv, pdata);
pdata->iobase = fdtdec_get_addr(fdt, netcp, "reg"); pdata->iobase = ofnode_get_addr(netcp);
return 0; return 0;
} }
@ -766,18 +752,15 @@ static int ks2_eth_of_to_plat(struct udevice *dev)
{ {
struct ks2_eth_priv *priv = dev_get_priv(dev); struct ks2_eth_priv *priv = dev_get_priv(dev);
struct eth_pdata *pdata = dev_get_plat(dev); struct eth_pdata *pdata = dev_get_plat(dev);
const void *fdt = gd->fdt_blob; ofnode netcp_devices, gbe, gbe_0;
int gbe_0 = -ENODEV;
int netcp_devices;
int gbe;
netcp_devices = fdt_subnode_offset(fdt, dev_of_offset(dev), netcp_devices = dev_read_subnode(dev, "netcp-devices");
"netcp-devices"); gbe = ofnode_find_subnode(netcp_devices, "gbe");
gbe = fdt_subnode_offset(fdt, netcp_devices, "gbe");
gbe_0 = ofnode_null();
ks2_eth_bind_slaves(dev, gbe, &gbe_0); ks2_eth_bind_slaves(dev, gbe, &gbe_0);
ks2_eth_parse_slave_interface(dev_of_offset(dev), gbe_0, priv, pdata); ks2_eth_parse_slave_interface(dev_ofnode(dev), gbe_0, priv, pdata);
pdata->iobase = dev_read_addr(dev); pdata->iobase = dev_read_addr(dev);