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