xref: /openbmc/u-boot/board/freescale/ls1012afrdm/eth.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2a141f33aSCalvin Johnson /*
3a141f33aSCalvin Johnson  * Copyright 2015-2016 Freescale Semiconductor, Inc.
4a141f33aSCalvin Johnson  * Copyright 2017 NXP
5a141f33aSCalvin Johnson  */
6a141f33aSCalvin Johnson 
7a141f33aSCalvin Johnson #include <common.h>
8a141f33aSCalvin Johnson #include <dm.h>
9a141f33aSCalvin Johnson #include <asm/io.h>
10a141f33aSCalvin Johnson #include <netdev.h>
11a141f33aSCalvin Johnson #include <fm_eth.h>
12a141f33aSCalvin Johnson #include <fsl_mdio.h>
13a141f33aSCalvin Johnson #include <malloc.h>
14a141f33aSCalvin Johnson #include <asm/types.h>
15a141f33aSCalvin Johnson #include <fsl_dtsec.h>
16a141f33aSCalvin Johnson #include <asm/arch/soc.h>
17a141f33aSCalvin Johnson #include <asm/arch-fsl-layerscape/config.h>
18a141f33aSCalvin Johnson #include <asm/arch-fsl-layerscape/immap_lsch2.h>
19a141f33aSCalvin Johnson #include <asm/arch/fsl_serdes.h>
20a141f33aSCalvin Johnson #include <net/pfe_eth/pfe_eth.h>
21a141f33aSCalvin Johnson #include <dm/platform_data/pfe_dm_eth.h>
22a141f33aSCalvin Johnson 
23a141f33aSCalvin Johnson #define DEFAULT_PFE_MDIO_NAME "PFE_MDIO"
24a141f33aSCalvin Johnson #define DEFAULT_PFE_MDIO1_NAME "PFE_MDIO1"
25a141f33aSCalvin Johnson 
26a141f33aSCalvin Johnson #define MASK_ETH_PHY_RST	0x00000100
27a141f33aSCalvin Johnson 
ls1012afrdm_reset_phy(void)28a141f33aSCalvin Johnson static inline void ls1012afrdm_reset_phy(void)
29a141f33aSCalvin Johnson {
30a141f33aSCalvin Johnson 	unsigned int val;
31a141f33aSCalvin Johnson 	struct ccsr_gpio *pgpio = (void *)(GPIO1_BASE_ADDR);
32a141f33aSCalvin Johnson 
33a141f33aSCalvin Johnson 	setbits_be32(&pgpio->gpdir, MASK_ETH_PHY_RST);
34a141f33aSCalvin Johnson 
35a141f33aSCalvin Johnson 	val = in_be32(&pgpio->gpdat);
36a141f33aSCalvin Johnson 	setbits_be32(&pgpio->gpdat, val & ~MASK_ETH_PHY_RST);
37a141f33aSCalvin Johnson 	mdelay(10);
38a141f33aSCalvin Johnson 
39a141f33aSCalvin Johnson 	val = in_be32(&pgpio->gpdat);
40a141f33aSCalvin Johnson 	setbits_be32(&pgpio->gpdat, val | MASK_ETH_PHY_RST);
41a141f33aSCalvin Johnson 	mdelay(50);
42a141f33aSCalvin Johnson }
43a141f33aSCalvin Johnson 
pfe_eth_board_init(struct udevice * dev)44a141f33aSCalvin Johnson int pfe_eth_board_init(struct udevice *dev)
45a141f33aSCalvin Johnson {
46a141f33aSCalvin Johnson 	static int init_done;
47a141f33aSCalvin Johnson 	struct mii_dev *bus;
48a141f33aSCalvin Johnson 	struct pfe_mdio_info mac_mdio_info;
49a141f33aSCalvin Johnson 	struct pfe_eth_dev *priv = dev_get_priv(dev);
50a141f33aSCalvin Johnson 
51a141f33aSCalvin Johnson 	if (!init_done) {
52a141f33aSCalvin Johnson 		ls1012afrdm_reset_phy();
53a141f33aSCalvin Johnson 
54a141f33aSCalvin Johnson 		mac_mdio_info.reg_base = (void *)EMAC1_BASE_ADDR;
55a141f33aSCalvin Johnson 		mac_mdio_info.name = DEFAULT_PFE_MDIO_NAME;
56a141f33aSCalvin Johnson 
57a141f33aSCalvin Johnson 		bus = pfe_mdio_init(&mac_mdio_info);
58a141f33aSCalvin Johnson 		if (!bus) {
59a141f33aSCalvin Johnson 			printf("Failed to register mdio\n");
60a141f33aSCalvin Johnson 			return -1;
61a141f33aSCalvin Johnson 		}
62a141f33aSCalvin Johnson 
63a141f33aSCalvin Johnson 		init_done = 1;
64a141f33aSCalvin Johnson 	}
65a141f33aSCalvin Johnson 
66a141f33aSCalvin Johnson 	if (priv->gemac_port) {
67a141f33aSCalvin Johnson 		mac_mdio_info.reg_base = (void *)EMAC2_BASE_ADDR;
68a141f33aSCalvin Johnson 		mac_mdio_info.name = DEFAULT_PFE_MDIO1_NAME;
69a141f33aSCalvin Johnson 		bus = pfe_mdio_init(&mac_mdio_info);
70a141f33aSCalvin Johnson 		if (!bus) {
71a141f33aSCalvin Johnson 			printf("Failed to register mdio\n");
72a141f33aSCalvin Johnson 			return -1;
73a141f33aSCalvin Johnson 		}
74a141f33aSCalvin Johnson 	}
75a141f33aSCalvin Johnson 
76a141f33aSCalvin Johnson 	pfe_set_mdio(priv->gemac_port,
77a141f33aSCalvin Johnson 		     miiphy_get_dev_by_name(DEFAULT_PFE_MDIO_NAME));
78a141f33aSCalvin Johnson 	if (!priv->gemac_port)
79a141f33aSCalvin Johnson 		/* MAC1 */
80a141f33aSCalvin Johnson 		pfe_set_phy_address_mode(priv->gemac_port,
81a141f33aSCalvin Johnson 					 CONFIG_PFE_EMAC1_PHY_ADDR,
82a141f33aSCalvin Johnson 					 PHY_INTERFACE_MODE_SGMII);
83a141f33aSCalvin Johnson 	else
84a141f33aSCalvin Johnson 		/* MAC2 */
85a141f33aSCalvin Johnson 		pfe_set_phy_address_mode(priv->gemac_port,
86a141f33aSCalvin Johnson 					 CONFIG_PFE_EMAC2_PHY_ADDR,
87a141f33aSCalvin Johnson 					 PHY_INTERFACE_MODE_SGMII);
88a141f33aSCalvin Johnson 	return 0;
89a141f33aSCalvin Johnson }
90a141f33aSCalvin Johnson 
91a141f33aSCalvin Johnson static struct pfe_eth_pdata pfe_pdata0 = {
92a141f33aSCalvin Johnson 	.pfe_eth_pdata_mac = {
93a141f33aSCalvin Johnson 		.iobase = (phys_addr_t)EMAC1_BASE_ADDR,
94a141f33aSCalvin Johnson 		.phy_interface = 0,
95a141f33aSCalvin Johnson 	},
96a141f33aSCalvin Johnson 
97a141f33aSCalvin Johnson 	.pfe_ddr_addr = {
98a141f33aSCalvin Johnson 		.ddr_pfe_baseaddr = (void *)CONFIG_DDR_PFE_BASEADDR,
99a141f33aSCalvin Johnson 		.ddr_pfe_phys_baseaddr = CONFIG_DDR_PFE_PHYS_BASEADDR,
100a141f33aSCalvin Johnson 	},
101a141f33aSCalvin Johnson };
102a141f33aSCalvin Johnson 
103a141f33aSCalvin Johnson static struct pfe_eth_pdata pfe_pdata1 = {
104a141f33aSCalvin Johnson 	.pfe_eth_pdata_mac = {
105a141f33aSCalvin Johnson 		.iobase = (phys_addr_t)EMAC2_BASE_ADDR,
106a141f33aSCalvin Johnson 		.phy_interface = 1,
107a141f33aSCalvin Johnson 	},
108a141f33aSCalvin Johnson 
109a141f33aSCalvin Johnson 	.pfe_ddr_addr = {
110a141f33aSCalvin Johnson 		.ddr_pfe_baseaddr = (void *)CONFIG_DDR_PFE_BASEADDR,
111a141f33aSCalvin Johnson 		.ddr_pfe_phys_baseaddr = CONFIG_DDR_PFE_PHYS_BASEADDR,
112a141f33aSCalvin Johnson 	},
113a141f33aSCalvin Johnson };
114a141f33aSCalvin Johnson 
115a141f33aSCalvin Johnson U_BOOT_DEVICE(ls1012a_pfe0) = {
116a141f33aSCalvin Johnson 	.name = "pfe_eth",
117a141f33aSCalvin Johnson 	.platdata = &pfe_pdata0,
118a141f33aSCalvin Johnson };
119a141f33aSCalvin Johnson 
120a141f33aSCalvin Johnson U_BOOT_DEVICE(ls1012a_pfe1) = {
121a141f33aSCalvin Johnson 	.name = "pfe_eth",
122a141f33aSCalvin Johnson 	.platdata = &pfe_pdata1,
123a141f33aSCalvin Johnson };
124