1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright 2021 Gateworks Corporation
4  */
5 
6 #include <common.h>
7 #include <init.h>
8 #include <led.h>
9 #include <linux/delay.h>
10 #include <miiphy.h>
11 #include <netdev.h>
12 
13 #include <asm/arch/clock.h>
14 #include <asm/arch/sys_proto.h>
15 #include <asm/io.h>
16 
17 #include "gsc.h"
18 
19 DECLARE_GLOBAL_DATA_PTR;
20 
board_phys_sdram_size(phys_size_t * size)21 int board_phys_sdram_size(phys_size_t *size)
22 {
23 	int ddr_size = readl(M4_BOOTROM_BASE_ADDR);
24 
25 	if (ddr_size == 0x4) {
26 		*size = 0x100000000;
27 	} else if (ddr_size == 0x3) {
28 		*size = 0xc0000000;
29 	} else if (ddr_size == 0x2) {
30 		*size = 0x80000000;
31 	} else if (ddr_size == 0x1) {
32 		*size = 0x40000000;
33 	} else {
34 		printf("Unknown DDR type!!!\n");
35 		*size = 0x40000000;
36 	}
37 
38 	return 0;
39 }
40 
board_fit_config_name_match(const char * name)41 int board_fit_config_name_match(const char *name)
42 {
43 	int i  = 0;
44 	const char *dtb;
45 	char buf[32];
46 
47 	do {
48 		dtb = gsc_get_dtb_name(i++, buf, sizeof(buf));
49 		if (!strcmp(dtb, name))
50 			return 0;
51 	} while (dtb);
52 
53 	return -1;
54 }
55 
56 #if (IS_ENABLED(CONFIG_FEC_MXC))
setup_fec(void)57 static int setup_fec(void)
58 {
59 	struct iomuxc_gpr_base_regs *gpr =
60 		(struct iomuxc_gpr_base_regs *)IOMUXC_GPR_BASE_ADDR;
61 
62 	/* Use 125M anatop REF_CLK1 for ENET1, not from external */
63 	clrsetbits_le32(&gpr->gpr[1], 0x2000, 0);
64 
65 	return 0;
66 }
67 
board_phy_config(struct phy_device * phydev)68 int board_phy_config(struct phy_device *phydev)
69 {
70 	unsigned short val;
71 
72 	switch (phydev->phy_id) {
73 	case 0x2000a231: /* TI DP83867 GbE PHY */
74 		puts("DP83867 ");
75 		/* LED configuration */
76 		val = 0;
77 		val |= 0x5 << 4; /* LED1(Amber;Speed)   : 1000BT link */
78 		val |= 0xb << 8; /* LED2(Green;Link/Act): blink for TX/RX act */
79 		phy_write(phydev, MDIO_DEVAD_NONE, 24, val);
80 		break;
81 	}
82 
83 	if (phydev->drv->config)
84 		phydev->drv->config(phydev);
85 
86 	return 0;
87 }
88 #endif // IS_ENABLED(CONFIG_FEC_MXC)
89 
board_init(void)90 int board_init(void)
91 {
92 	gsc_init(1);
93 
94 	if (IS_ENABLED(CONFIG_FEC_MXC))
95 		setup_fec();
96 
97 	gsc_hwmon();
98 
99 	return 0;
100 }
101 
board_late_init(void)102 int board_late_init(void)
103 {
104 	const char *ethmac;
105 	char env[32];
106 	int ret, i;
107 	u8 enetaddr[6];
108 
109 	led_default_state();
110 
111 	/* Set mac addrs */
112 	i = 0;
113 	do {
114 		if (i)
115 			sprintf(env, "eth%daddr", i);
116 		else
117 			sprintf(env, "ethaddr");
118 		ethmac = env_get(env);
119 		if (!ethmac) {
120 			ret = gsc_getmac(i, enetaddr);
121 			if (!ret)
122 				eth_env_set_enetaddr(env, enetaddr);
123 		}
124 		i++;
125 	} while (!ret);
126 
127 	return 0;
128 }
129 
board_mmc_get_env_dev(int devno)130 int board_mmc_get_env_dev(int devno)
131 {
132 	return devno;
133 }
134