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