2 * Copyright 2014 Freescale Semiconductor, Inc.
4 * SPDX-License-Identifier: GPL-2.0+
6 * This file handles the board muxing between the RGMII/SGMII PHYs on
7 * Freescale LS1021AQDS board. The RGMII PHYs are the three on-board 1Gb
8 * ports. The SGMII PHYs are provided by the standard Freescale four-port
11 * Muxing is handled via the PIXIS BRDCFG4 register. The EMI1 bits control
12 * muxing among the RGMII PHYs and the SGMII PHYs. The value for RGMII depends
13 * on which port is used. The value for SGMII depends on which slot the riser
19 #include <asm/arch/fsl_serdes.h>
24 #include "../common/sgmii_riser.h"
25 #include "../common/qixis.h"
27 #define EMI1_MASK 0x1f
31 #define EMI1_SGMII1 0x1c
32 #define EMI1_SGMII2 0x1d
35 struct mii_dev
*realbus
;
38 static void ls1021a_mux_mdio(int addr
)
42 brdcfg4
= QIXIS_READ(brdcfg
[4]);
66 QIXIS_WRITE(brdcfg
[4], brdcfg4
);
69 static int ls1021a_mdio_read(struct mii_dev
*bus
, int addr
, int devad
,
72 struct ls1021a_mdio
*priv
= bus
->priv
;
74 ls1021a_mux_mdio(addr
);
76 return priv
->realbus
->read(priv
->realbus
, addr
, devad
, regnum
);
79 static int ls1021a_mdio_write(struct mii_dev
*bus
, int addr
, int devad
,
80 int regnum
, u16 value
)
82 struct ls1021a_mdio
*priv
= bus
->priv
;
84 ls1021a_mux_mdio(addr
);
86 return priv
->realbus
->write(priv
->realbus
, addr
, devad
, regnum
, value
);
89 static int ls1021a_mdio_reset(struct mii_dev
*bus
)
91 struct ls1021a_mdio
*priv
= bus
->priv
;
93 return priv
->realbus
->reset(priv
->realbus
);
96 static int ls1021a_mdio_init(char *realbusname
, char *fakebusname
)
98 struct ls1021a_mdio
*lsmdio
;
99 struct mii_dev
*bus
= mdio_alloc();
102 printf("Failed to allocate LS102xA MDIO bus\n");
106 lsmdio
= malloc(sizeof(*lsmdio
));
108 printf("Failed to allocate LS102xA private data\n");
113 bus
->read
= ls1021a_mdio_read
;
114 bus
->write
= ls1021a_mdio_write
;
115 bus
->reset
= ls1021a_mdio_reset
;
116 sprintf(bus
->name
, fakebusname
);
118 lsmdio
->realbus
= miiphy_get_dev_by_name(realbusname
);
120 if (!lsmdio
->realbus
) {
121 printf("No bus with name %s\n", realbusname
);
129 return mdio_register(bus
);
132 int board_eth_init(bd_t
*bis
)
134 struct fsl_pq_mdio_info mdio_info
;
135 struct tsec_info_struct tsec_info
[3];
139 SET_STD_TSEC_INFO(tsec_info
[num
], 1);
140 if (is_serdes_configured(SGMII_TSEC1
)) {
141 puts("eTSEC1 is in sgmii mode\n");
142 tsec_info
[num
].flags
|= TSEC_SGMII
;
143 tsec_info
[num
].mii_devname
= "LS1021A_SGMII_MDIO";
145 tsec_info
[num
].mii_devname
= "LS1021A_RGMII_MDIO";
150 SET_STD_TSEC_INFO(tsec_info
[num
], 2);
151 if (is_serdes_configured(SGMII_TSEC2
)) {
152 puts("eTSEC2 is in sgmii mode\n");
153 tsec_info
[num
].flags
|= TSEC_SGMII
;
154 tsec_info
[num
].mii_devname
= "LS1021A_SGMII_MDIO";
156 tsec_info
[num
].mii_devname
= "LS1021A_RGMII_MDIO";
161 SET_STD_TSEC_INFO(tsec_info
[num
], 3);
162 tsec_info
[num
].mii_devname
= "LS1021A_RGMII_MDIO";
166 printf("No TSECs initialized\n");
170 #ifdef CONFIG_FSL_SGMII_RISER
171 fsl_sgmii_riser_init(tsec_info
, num
);
174 mdio_info
.regs
= (struct tsec_mii_mng
*)CONFIG_SYS_MDIO_BASE_ADDR
;
175 mdio_info
.name
= DEFAULT_MII_NAME
;
177 fsl_pq_mdio_init(bis
, &mdio_info
);
179 /* Register the virtual MDIO front-ends */
180 ls1021a_mdio_init(DEFAULT_MII_NAME
, "LS1021A_RGMII_MDIO");
181 ls1021a_mdio_init(DEFAULT_MII_NAME
, "LS1021A_SGMII_MDIO");
183 tsec_eth_init(bis
, tsec_info
, num
);
185 return pci_eth_init(bis
);