xref: /rk3399_rockchip-uboot/board/amlogic/odroid-c2/odroid-c2.c (revision 35affd7a2ff9a77b9946bf93b616228fcf218d60)
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