xref: /rk3399_rockchip-uboot/drivers/net/ldpaa_eth/ldpaa_wriop.c (revision 1670c8c219f6e47de624b4ed557b5a995265cd40)
19cc2c471SPrabhakar Kushwaha /*
29cc2c471SPrabhakar Kushwaha  * Copyright (C) 2015 Freescale Semiconductor
39cc2c471SPrabhakar Kushwaha  *
49cc2c471SPrabhakar Kushwaha  * SPDX-License-Identifier:	GPL-2.0+
59cc2c471SPrabhakar Kushwaha  */
69cc2c471SPrabhakar Kushwaha 
79cc2c471SPrabhakar Kushwaha #include <common.h>
89cc2c471SPrabhakar Kushwaha #include <asm/io.h>
99cc2c471SPrabhakar Kushwaha #include <asm/types.h>
109cc2c471SPrabhakar Kushwaha #include <malloc.h>
119cc2c471SPrabhakar Kushwaha #include <net.h>
129cc2c471SPrabhakar Kushwaha #include <linux/compat.h>
139cc2c471SPrabhakar Kushwaha #include <asm/arch/fsl_serdes.h>
149cc2c471SPrabhakar Kushwaha #include <fsl-mc/ldpaa_wriop.h>
159cc2c471SPrabhakar Kushwaha 
169cc2c471SPrabhakar Kushwaha struct wriop_dpmac_info dpmac_info[NUM_WRIOP_PORTS];
179cc2c471SPrabhakar Kushwaha 
wriop_dpmac_enet_if(int dpmac_id,int lane_prtc)189cc2c471SPrabhakar Kushwaha __weak phy_interface_t wriop_dpmac_enet_if(int dpmac_id, int lane_prtc)
199cc2c471SPrabhakar Kushwaha {
209cc2c471SPrabhakar Kushwaha 	return PHY_INTERFACE_MODE_NONE;
219cc2c471SPrabhakar Kushwaha }
229cc2c471SPrabhakar Kushwaha 
wriop_init_dpmac(int sd,int dpmac_id,int lane_prtcl)239cc2c471SPrabhakar Kushwaha void wriop_init_dpmac(int sd, int dpmac_id, int lane_prtcl)
249cc2c471SPrabhakar Kushwaha {
259cc2c471SPrabhakar Kushwaha 	phy_interface_t enet_if;
269cc2c471SPrabhakar Kushwaha 
2799e904c1SPrabhakar Kushwaha 	dpmac_info[dpmac_id].enabled = 0;
2899e904c1SPrabhakar Kushwaha 	dpmac_info[dpmac_id].id = 0;
29*f9127a04SPrabhakar Kushwaha 	dpmac_info[dpmac_id].phy_addr = -1;
3099e904c1SPrabhakar Kushwaha 	dpmac_info[dpmac_id].enet_if = PHY_INTERFACE_MODE_NONE;
319cc2c471SPrabhakar Kushwaha 
3299e904c1SPrabhakar Kushwaha 	enet_if = wriop_dpmac_enet_if(dpmac_id, lane_prtcl);
339cc2c471SPrabhakar Kushwaha 	if (enet_if != PHY_INTERFACE_MODE_NONE) {
3499e904c1SPrabhakar Kushwaha 		dpmac_info[dpmac_id].enabled = 1;
3599e904c1SPrabhakar Kushwaha 		dpmac_info[dpmac_id].id = dpmac_id;
3699e904c1SPrabhakar Kushwaha 		dpmac_info[dpmac_id].enet_if = enet_if;
379cc2c471SPrabhakar Kushwaha 	}
389cc2c471SPrabhakar Kushwaha }
399cc2c471SPrabhakar Kushwaha 
409cc2c471SPrabhakar Kushwaha /*TODO what it do */
wriop_dpmac_to_index(int dpmac_id)419cc2c471SPrabhakar Kushwaha static int wriop_dpmac_to_index(int dpmac_id)
429cc2c471SPrabhakar Kushwaha {
439cc2c471SPrabhakar Kushwaha 	int i;
449cc2c471SPrabhakar Kushwaha 
459cc2c471SPrabhakar Kushwaha 	for (i = WRIOP1_DPMAC1; i < NUM_WRIOP_PORTS; i++) {
469cc2c471SPrabhakar Kushwaha 		if (dpmac_info[i].id == dpmac_id)
479cc2c471SPrabhakar Kushwaha 			return i;
489cc2c471SPrabhakar Kushwaha 	}
499cc2c471SPrabhakar Kushwaha 
509cc2c471SPrabhakar Kushwaha 	return -1;
519cc2c471SPrabhakar Kushwaha }
529cc2c471SPrabhakar Kushwaha 
wriop_disable_dpmac(int dpmac_id)539cc2c471SPrabhakar Kushwaha void wriop_disable_dpmac(int dpmac_id)
549cc2c471SPrabhakar Kushwaha {
559cc2c471SPrabhakar Kushwaha 	int i = wriop_dpmac_to_index(dpmac_id);
569cc2c471SPrabhakar Kushwaha 
579cc2c471SPrabhakar Kushwaha 	if (i == -1)
589cc2c471SPrabhakar Kushwaha 		return;
599cc2c471SPrabhakar Kushwaha 
609cc2c471SPrabhakar Kushwaha 	dpmac_info[i].enabled = 0;
619cc2c471SPrabhakar Kushwaha 	wriop_dpmac_disable(dpmac_id);
629cc2c471SPrabhakar Kushwaha }
639cc2c471SPrabhakar Kushwaha 
wriop_enable_dpmac(int dpmac_id)649cc2c471SPrabhakar Kushwaha void wriop_enable_dpmac(int dpmac_id)
659cc2c471SPrabhakar Kushwaha {
669cc2c471SPrabhakar Kushwaha 	int i = wriop_dpmac_to_index(dpmac_id);
679cc2c471SPrabhakar Kushwaha 
689cc2c471SPrabhakar Kushwaha 	if (i == -1)
699cc2c471SPrabhakar Kushwaha 		return;
709cc2c471SPrabhakar Kushwaha 
719cc2c471SPrabhakar Kushwaha 	dpmac_info[i].enabled = 1;
729cc2c471SPrabhakar Kushwaha 	wriop_dpmac_enable(dpmac_id);
739cc2c471SPrabhakar Kushwaha }
749cc2c471SPrabhakar Kushwaha 
wriop_is_enabled_dpmac(int dpmac_id)75*f9127a04SPrabhakar Kushwaha u8 wriop_is_enabled_dpmac(int dpmac_id)
76*f9127a04SPrabhakar Kushwaha {
77*f9127a04SPrabhakar Kushwaha 	int i = wriop_dpmac_to_index(dpmac_id);
78*f9127a04SPrabhakar Kushwaha 
79*f9127a04SPrabhakar Kushwaha 	if (i == -1)
80*f9127a04SPrabhakar Kushwaha 		return -1;
81*f9127a04SPrabhakar Kushwaha 
82*f9127a04SPrabhakar Kushwaha 	return dpmac_info[i].enabled;
83*f9127a04SPrabhakar Kushwaha }
84*f9127a04SPrabhakar Kushwaha 
85*f9127a04SPrabhakar Kushwaha 
wriop_set_mdio(int dpmac_id,struct mii_dev * bus)869cc2c471SPrabhakar Kushwaha void wriop_set_mdio(int dpmac_id, struct mii_dev *bus)
879cc2c471SPrabhakar Kushwaha {
889cc2c471SPrabhakar Kushwaha 	int i = wriop_dpmac_to_index(dpmac_id);
899cc2c471SPrabhakar Kushwaha 
909cc2c471SPrabhakar Kushwaha 	if (i == -1)
919cc2c471SPrabhakar Kushwaha 		return;
929cc2c471SPrabhakar Kushwaha 
939cc2c471SPrabhakar Kushwaha 	dpmac_info[i].bus = bus;
949cc2c471SPrabhakar Kushwaha }
959cc2c471SPrabhakar Kushwaha 
wriop_get_mdio(int dpmac_id)969cc2c471SPrabhakar Kushwaha struct mii_dev *wriop_get_mdio(int dpmac_id)
979cc2c471SPrabhakar Kushwaha {
989cc2c471SPrabhakar Kushwaha 	int i = wriop_dpmac_to_index(dpmac_id);
999cc2c471SPrabhakar Kushwaha 
1009cc2c471SPrabhakar Kushwaha 	if (i == -1)
1019cc2c471SPrabhakar Kushwaha 		return NULL;
1029cc2c471SPrabhakar Kushwaha 
1039cc2c471SPrabhakar Kushwaha 	return dpmac_info[i].bus;
1049cc2c471SPrabhakar Kushwaha }
1059cc2c471SPrabhakar Kushwaha 
wriop_set_phy_address(int dpmac_id,int address)1069cc2c471SPrabhakar Kushwaha void wriop_set_phy_address(int dpmac_id, int address)
1079cc2c471SPrabhakar Kushwaha {
1089cc2c471SPrabhakar Kushwaha 	int i = wriop_dpmac_to_index(dpmac_id);
1099cc2c471SPrabhakar Kushwaha 
1109cc2c471SPrabhakar Kushwaha 	if (i == -1)
1119cc2c471SPrabhakar Kushwaha 		return;
1129cc2c471SPrabhakar Kushwaha 
1139cc2c471SPrabhakar Kushwaha 	dpmac_info[i].phy_addr = address;
1149cc2c471SPrabhakar Kushwaha }
1159cc2c471SPrabhakar Kushwaha 
wriop_get_phy_address(int dpmac_id)1169cc2c471SPrabhakar Kushwaha int wriop_get_phy_address(int dpmac_id)
1179cc2c471SPrabhakar Kushwaha {
1189cc2c471SPrabhakar Kushwaha 	int i = wriop_dpmac_to_index(dpmac_id);
1199cc2c471SPrabhakar Kushwaha 
1209cc2c471SPrabhakar Kushwaha 	if (i == -1)
1219cc2c471SPrabhakar Kushwaha 		return -1;
1229cc2c471SPrabhakar Kushwaha 
1239cc2c471SPrabhakar Kushwaha 	return dpmac_info[i].phy_addr;
1249cc2c471SPrabhakar Kushwaha }
1259cc2c471SPrabhakar Kushwaha 
wriop_set_phy_dev(int dpmac_id,struct phy_device * phydev)1269cc2c471SPrabhakar Kushwaha void wriop_set_phy_dev(int dpmac_id, struct phy_device *phydev)
1279cc2c471SPrabhakar Kushwaha {
1289cc2c471SPrabhakar Kushwaha 	int i = wriop_dpmac_to_index(dpmac_id);
1299cc2c471SPrabhakar Kushwaha 
1309cc2c471SPrabhakar Kushwaha 	if (i == -1)
1319cc2c471SPrabhakar Kushwaha 		return;
1329cc2c471SPrabhakar Kushwaha 
1339cc2c471SPrabhakar Kushwaha 	dpmac_info[i].phydev = phydev;
1349cc2c471SPrabhakar Kushwaha }
1359cc2c471SPrabhakar Kushwaha 
wriop_get_phy_dev(int dpmac_id)1369cc2c471SPrabhakar Kushwaha struct phy_device *wriop_get_phy_dev(int dpmac_id)
1379cc2c471SPrabhakar Kushwaha {
1389cc2c471SPrabhakar Kushwaha 	int i = wriop_dpmac_to_index(dpmac_id);
1399cc2c471SPrabhakar Kushwaha 
1409cc2c471SPrabhakar Kushwaha 	if (i == -1)
1419cc2c471SPrabhakar Kushwaha 		return NULL;
1429cc2c471SPrabhakar Kushwaha 
1439cc2c471SPrabhakar Kushwaha 	return dpmac_info[i].phydev;
1449cc2c471SPrabhakar Kushwaha }
1459cc2c471SPrabhakar Kushwaha 
wriop_get_enet_if(int dpmac_id)1469cc2c471SPrabhakar Kushwaha phy_interface_t wriop_get_enet_if(int dpmac_id)
1479cc2c471SPrabhakar Kushwaha {
1489cc2c471SPrabhakar Kushwaha 	int i = wriop_dpmac_to_index(dpmac_id);
1499cc2c471SPrabhakar Kushwaha 
1509cc2c471SPrabhakar Kushwaha 	if (i == -1)
1519cc2c471SPrabhakar Kushwaha 		return PHY_INTERFACE_MODE_NONE;
1529cc2c471SPrabhakar Kushwaha 
1539cc2c471SPrabhakar Kushwaha 	if (dpmac_info[i].enabled)
1549cc2c471SPrabhakar Kushwaha 		return dpmac_info[i].enet_if;
1559cc2c471SPrabhakar Kushwaha 
1569cc2c471SPrabhakar Kushwaha 	return PHY_INTERFACE_MODE_NONE;
1579cc2c471SPrabhakar Kushwaha }
158