blob: e3c1a1201daa7a44b84b0a797bbb7f6bc3c36eb2 [file] [log] [blame]
Marcel Ziswiler36a439d2022-02-07 11:54:13 +01001// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright 2022 Toradex
4 */
5
6#include <common.h>
7#include <asm/arch/clock.h>
8#include <asm/arch/imx8mp_pins.h>
9#include <asm/arch/sys_proto.h>
10#include <asm-generic/gpio.h>
11#include <asm/global_data.h>
12#include <asm/mach-imx/gpio.h>
13#include <asm/mach-imx/iomux-v3.h>
14#include <errno.h>
15#include <env.h>
16#include <init.h>
17#include <linux/delay.h>
18#include <micrel.h>
19#include <miiphy.h>
20#include <netdev.h>
21
22#include "../common/tdx-cfg-block.h"
23
24DECLARE_GLOBAL_DATA_PTR;
25
26#define UART_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_FSEL1)
Marcel Ziswiler36a439d2022-02-07 11:54:13 +010027
28/* Verdin UART_3, Console/Debug UART */
29static const iomux_v3_cfg_t uart_pads[] = {
30 MX8MP_PAD_UART3_RXD__UART3_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
31 MX8MP_PAD_UART3_TXD__UART3_DCE_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
32};
33
Marcel Ziswiler36a439d2022-02-07 11:54:13 +010034int board_early_init_f(void)
35{
Marcel Ziswiler36a439d2022-02-07 11:54:13 +010036 imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
37
38 init_uart_clk(2);
39
40 return 0;
41}
42
43static void setup_fec(void)
44{
45 struct iomuxc_gpr_base_regs *gpr =
46 (struct iomuxc_gpr_base_regs *)IOMUXC_GPR_BASE_ADDR;
47
48 /* Enable RGMII TX clk output */
49 setbits_le32(&gpr->gpr[1], BIT(22));
50}
51
52static int setup_eqos(void)
53{
54 struct iomuxc_gpr_base_regs *gpr =
55 (struct iomuxc_gpr_base_regs *)IOMUXC_GPR_BASE_ADDR;
56
57 /* set INTF as RGMII, enable RGMII TXC clock */
58 clrsetbits_le32(&gpr->gpr[1],
59 IOMUXC_GPR_GPR1_GPR_ENET_QOS_INTF_SEL_MASK, BIT(16));
60 setbits_le32(&gpr->gpr[1], BIT(19) | BIT(21));
61
62 return set_clk_eqos(ENET_125MHZ);
63}
64
65#if IS_ENABLED(CONFIG_NET)
66int board_phy_config(struct phy_device *phydev)
67{
68 if (phydev->drv->config)
69 phydev->drv->config(phydev);
70 return 0;
71}
72#endif
73
74int board_init(void)
75{
76 int ret = 0;
77
78 if (IS_ENABLED(CONFIG_FEC_MXC))
79 setup_fec();
80
81 if (IS_ENABLED(CONFIG_DWC_ETH_QOS))
82 ret = setup_eqos();
83
84 return ret;
85}
86
87static void select_dt_from_module_version(void)
88{
89 char variant[32];
90 char *env_variant = env_get("variant");
91 int is_wifi = 0;
92
93 if (IS_ENABLED(CONFIG_TDX_CFG_BLOCK)) {
94 /*
95 * If we have a valid config block and it says we are a module with
96 * Wi-Fi/Bluetooth make sure we use the -wifi device tree.
97 */
98 is_wifi = (tdx_hw_tag.prodid == VERDIN_IMX8MPQ_WIFI_BT_IT) ||
99 (tdx_hw_tag.prodid == VERDIN_IMX8MPQ_2GB_WIFI_BT_IT) ||
100 (tdx_hw_tag.prodid == VERDIN_IMX8MPQ_8GB_WIFI_BT);
101 }
102
103 if (is_wifi)
104 strlcpy(&variant[0], "wifi", sizeof(variant));
105 else
106 strlcpy(&variant[0], "nonwifi", sizeof(variant));
107
108 if (strcmp(variant, env_variant)) {
109 printf("Setting variant to %s\n", variant);
110 env_set("variant", variant);
111
112 if (IS_ENABLED(CONFIG_ENV_IS_NOWHERE))
113 env_save();
114 }
115}
116
117int board_late_init(void)
118{
119 select_dt_from_module_version();
120
121 return 0;
122}
123
124#if IS_ENABLED(CONFIG_OF_LIBFDT) && IS_ENABLED(CONFIG_OF_BOARD_SETUP)
125int ft_board_setup(void *blob, struct bd_info *bd)
126{
127 return 0;
128}
129#endif