xref: /openbmc/u-boot/drivers/net/fm/p5020.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2c916d7c9SKumar Gala /*
3c916d7c9SKumar Gala  * Copyright 2011 Freescale Semiconductor, Inc.
4c916d7c9SKumar Gala  */
5c916d7c9SKumar Gala #include <common.h>
6c916d7c9SKumar Gala #include <phy.h>
7c916d7c9SKumar Gala #include <fm_eth.h>
8c916d7c9SKumar Gala #include <asm/io.h>
9c916d7c9SKumar Gala #include <asm/immap_85xx.h>
10c916d7c9SKumar Gala #include <asm/fsl_serdes.h>
11c916d7c9SKumar Gala 
12960d70c6SKim Phillips static u32 port_to_devdisr[] = {
13c916d7c9SKumar Gala 	[FM1_DTSEC1] = FSL_CORENET_DEVDISR2_DTSEC1_1,
14c916d7c9SKumar Gala 	[FM1_DTSEC2] = FSL_CORENET_DEVDISR2_DTSEC1_2,
15c916d7c9SKumar Gala 	[FM1_DTSEC3] = FSL_CORENET_DEVDISR2_DTSEC1_3,
16c916d7c9SKumar Gala 	[FM1_DTSEC4] = FSL_CORENET_DEVDISR2_DTSEC1_4,
17c916d7c9SKumar Gala 	[FM1_DTSEC5] = FSL_CORENET_DEVDISR2_DTSEC1_5,
18c916d7c9SKumar Gala 	[FM1_10GEC1] = FSL_CORENET_DEVDISR2_10GEC1,
19c916d7c9SKumar Gala };
20c916d7c9SKumar Gala 
is_device_disabled(enum fm_port port)21c916d7c9SKumar Gala static int is_device_disabled(enum fm_port port)
22c916d7c9SKumar Gala {
23c916d7c9SKumar Gala 	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
24c916d7c9SKumar Gala 	u32 devdisr2 = in_be32(&gur->devdisr2);
25c916d7c9SKumar Gala 
26c916d7c9SKumar Gala 	return port_to_devdisr[port] & devdisr2;
27c916d7c9SKumar Gala }
28c916d7c9SKumar Gala 
fman_disable_port(enum fm_port port)2969a85242SKumar Gala void fman_disable_port(enum fm_port port)
3069a85242SKumar Gala {
3169a85242SKumar Gala 	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
32f5b9e736SKumar Gala 
33f5b9e736SKumar Gala 	/* don't allow disabling of DTSEC1 as its needed for MDIO */
34f5b9e736SKumar Gala 	if (port == FM1_DTSEC1)
35f5b9e736SKumar Gala 		return;
36f5b9e736SKumar Gala 
3769a85242SKumar Gala 	setbits_be32(&gur->devdisr2, port_to_devdisr[port]);
3869a85242SKumar Gala }
3969a85242SKumar Gala 
fman_enable_port(enum fm_port port)40f51d3b71SValentin Longchamp void fman_enable_port(enum fm_port port)
41f51d3b71SValentin Longchamp {
42f51d3b71SValentin Longchamp 	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
43f51d3b71SValentin Longchamp 
44f51d3b71SValentin Longchamp 	clrbits_be32(&gur->devdisr2, port_to_devdisr[port]);
45f51d3b71SValentin Longchamp }
46f51d3b71SValentin Longchamp 
fman_port_enet_if(enum fm_port port)47c916d7c9SKumar Gala phy_interface_t fman_port_enet_if(enum fm_port port)
48c916d7c9SKumar Gala {
49c916d7c9SKumar Gala 	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
50c916d7c9SKumar Gala 	u32 rcwsr11 = in_be32(&gur->rcwsr[11]);
51c916d7c9SKumar Gala 
52c916d7c9SKumar Gala 	if (is_device_disabled(port))
53c916d7c9SKumar Gala 		return PHY_INTERFACE_MODE_NONE;
54c916d7c9SKumar Gala 
55c916d7c9SKumar Gala 	if ((port == FM1_10GEC1) && (is_serdes_configured(XAUI_FM1)))
56c916d7c9SKumar Gala 		return PHY_INTERFACE_MODE_XGMII;
57c916d7c9SKumar Gala 
58c916d7c9SKumar Gala 	/* handle RGMII first */
59c916d7c9SKumar Gala 	if ((port == FM1_DTSEC4) && ((rcwsr11 & FSL_CORENET_RCWSR11_EC1) ==
60c916d7c9SKumar Gala 		FSL_CORENET_RCWSR11_EC1_FM1_DTSEC4_RGMII))
61c916d7c9SKumar Gala 		return PHY_INTERFACE_MODE_RGMII;
62c916d7c9SKumar Gala 
63c916d7c9SKumar Gala 	if ((port == FM1_DTSEC4) && ((rcwsr11 & FSL_CORENET_RCWSR11_EC1) ==
64c916d7c9SKumar Gala 		FSL_CORENET_RCWSR11_EC1_FM1_DTSEC4_MII))
65c916d7c9SKumar Gala 		return PHY_INTERFACE_MODE_MII;
66c916d7c9SKumar Gala 
67c916d7c9SKumar Gala 	if ((port == FM1_DTSEC5) && ((rcwsr11 & FSL_CORENET_RCWSR11_EC2) ==
68c916d7c9SKumar Gala 		FSL_CORENET_RCWSR11_EC2_FM1_DTSEC5_RGMII))
69c916d7c9SKumar Gala 		return PHY_INTERFACE_MODE_RGMII;
70c916d7c9SKumar Gala 
71c916d7c9SKumar Gala 	if ((port == FM1_DTSEC5) && ((rcwsr11 & FSL_CORENET_RCWSR11_EC2) ==
72c916d7c9SKumar Gala 		FSL_CORENET_RCWSR11_EC2_FM1_DTSEC5_MII))
73c916d7c9SKumar Gala 		return PHY_INTERFACE_MODE_MII;
74c916d7c9SKumar Gala 
75c916d7c9SKumar Gala 	switch (port) {
76c916d7c9SKumar Gala 	case FM1_DTSEC1:
77c916d7c9SKumar Gala 	case FM1_DTSEC2:
78c916d7c9SKumar Gala 	case FM1_DTSEC3:
79c916d7c9SKumar Gala 	case FM1_DTSEC4:
80c916d7c9SKumar Gala 	case FM1_DTSEC5:
81c916d7c9SKumar Gala 		if (is_serdes_configured(SGMII_FM1_DTSEC1 + port - FM1_DTSEC1))
82c916d7c9SKumar Gala 			return PHY_INTERFACE_MODE_SGMII;
83c916d7c9SKumar Gala 		break;
84c916d7c9SKumar Gala 	default:
85c916d7c9SKumar Gala 		return PHY_INTERFACE_MODE_NONE;
86c916d7c9SKumar Gala 	}
87c916d7c9SKumar Gala 
88c916d7c9SKumar Gala 	return PHY_INTERFACE_MODE_NONE;
89c916d7c9SKumar Gala }
90