11e23737dSCarlo Caione /*
21e23737dSCarlo Caione * (C) Copyright 2016 Beniamino Galvani <b.galvani@gmail.com>
31e23737dSCarlo Caione *
41e23737dSCarlo Caione * SPDX-License-Identifier: GPL-2.0+
51e23737dSCarlo Caione */
61e23737dSCarlo Caione
71e23737dSCarlo Caione #include <common.h>
89d922450SSimon Glass #include <dm.h>
91e23737dSCarlo Caione #include <asm/io.h>
101e23737dSCarlo Caione #include <asm/arch/gxbb.h>
111e23737dSCarlo Caione #include <asm/arch/sm.h>
121e23737dSCarlo Caione #include <phy.h>
131e23737dSCarlo Caione
141e23737dSCarlo Caione #define EFUSE_SN_OFFSET 20
151e23737dSCarlo Caione #define EFUSE_SN_SIZE 16
161e23737dSCarlo Caione #define EFUSE_MAC_OFFSET 52
171e23737dSCarlo Caione #define EFUSE_MAC_SIZE 6
181e23737dSCarlo Caione
board_init(void)191e23737dSCarlo Caione int board_init(void)
201e23737dSCarlo Caione {
211e23737dSCarlo Caione return 0;
221e23737dSCarlo Caione }
231e23737dSCarlo Caione
misc_init_r(void)241e23737dSCarlo Caione int misc_init_r(void)
251e23737dSCarlo Caione {
261e23737dSCarlo Caione u8 mac_addr[EFUSE_MAC_SIZE];
27cb86d374SMartin Böh char serial[EFUSE_SN_SIZE];
281e23737dSCarlo Caione ssize_t len;
291e23737dSCarlo Caione
301e23737dSCarlo Caione /* Set RGMII mode */
311e23737dSCarlo Caione setbits_le32(GXBB_ETH_REG_0, GXBB_ETH_REG_0_PHY_INTF |
321e23737dSCarlo Caione GXBB_ETH_REG_0_TX_PHASE(1) |
331e23737dSCarlo Caione GXBB_ETH_REG_0_TX_RATIO(4) |
341e23737dSCarlo Caione GXBB_ETH_REG_0_PHY_CLK_EN |
351e23737dSCarlo Caione GXBB_ETH_REG_0_CLK_EN);
361e23737dSCarlo Caione
371e23737dSCarlo Caione /* Enable power and clock gate */
381e23737dSCarlo Caione setbits_le32(GXBB_GCLK_MPEG_1, GXBB_GCLK_MPEG_1_ETH);
391e23737dSCarlo Caione clrbits_le32(GXBB_MEM_PD_REG_0, GXBB_MEM_PD_REG_0_ETH_MASK);
401e23737dSCarlo Caione
411e23737dSCarlo Caione /* Reset PHY on GPIOZ_14 */
421e23737dSCarlo Caione clrbits_le32(GXBB_GPIO_EN(3), BIT(14));
431e23737dSCarlo Caione clrbits_le32(GXBB_GPIO_OUT(3), BIT(14));
441e23737dSCarlo Caione mdelay(10);
451e23737dSCarlo Caione setbits_le32(GXBB_GPIO_OUT(3), BIT(14));
461e23737dSCarlo Caione
47*35affd7aSSimon Glass if (!eth_env_get_enetaddr("ethaddr", mac_addr)) {
481e23737dSCarlo Caione len = meson_sm_read_efuse(EFUSE_MAC_OFFSET,
491e23737dSCarlo Caione mac_addr, EFUSE_MAC_SIZE);
501e23737dSCarlo Caione if (len == EFUSE_MAC_SIZE && is_valid_ethaddr(mac_addr))
51fd1e959eSSimon Glass eth_env_set_enetaddr("ethaddr", mac_addr);
521e23737dSCarlo Caione }
531e23737dSCarlo Caione
5400caae6dSSimon Glass if (!env_get("serial#")) {
55cb86d374SMartin Böh len = meson_sm_read_efuse(EFUSE_SN_OFFSET, serial,
56cb86d374SMartin Böh EFUSE_SN_SIZE);
57cb86d374SMartin Böh if (len == EFUSE_SN_SIZE)
58382bee57SSimon Glass env_set("serial#", serial);
59cb86d374SMartin Böh }
60cb86d374SMartin Böh
611e23737dSCarlo Caione return 0;
621e23737dSCarlo Caione }
63