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 191e23737dSCarlo Caione int board_init(void) 201e23737dSCarlo Caione { 211e23737dSCarlo Caione return 0; 221e23737dSCarlo Caione } 231e23737dSCarlo Caione 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 471e23737dSCarlo Caione if (!eth_getenv_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)) 51*fd1e959eSSimon Glass eth_env_set_enetaddr("ethaddr", mac_addr); 521e23737dSCarlo Caione } 531e23737dSCarlo Caione 54cb86d374SMartin Böh if (!getenv("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