blob: 330b47fa5f92377ed8390006d317cdf554625a8c [file] [log] [blame]
Peng Fanc47e09d2019-12-30 17:46:21 +08001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Copyright 2019 NXP
4 */
5
6#include <common.h>
Simon Glassed38aef2020-05-10 11:40:03 -06007#include <env.h>
Peng Fanc47e09d2019-12-30 17:46:21 +08008#include <errno.h>
Simon Glass97589732020-05-10 11:40:02 -06009#include <init.h>
Peng Fan4f0c97b2020-12-25 16:16:34 +080010#include <miiphy.h>
11#include <netdev.h>
12#include <linux/delay.h>
Peng Fanc47e09d2019-12-30 17:46:21 +080013#include <asm/mach-imx/iomux-v3.h>
14#include <asm-generic/gpio.h>
15#include <asm/arch/imx8mp_pins.h>
Peng Fan4f0c97b2020-12-25 16:16:34 +080016#include <asm/arch/clock.h>
Peng Fanc47e09d2019-12-30 17:46:21 +080017#include <asm/arch/sys_proto.h>
18#include <asm/mach-imx/gpio.h>
19
20DECLARE_GLOBAL_DATA_PTR;
21
22#define UART_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_FSEL1)
23#define WDOG_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_ODE | PAD_CTL_PUE | PAD_CTL_PE)
24
25static iomux_v3_cfg_t const uart_pads[] = {
26 MX8MP_PAD_UART2_RXD__UART2_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
27 MX8MP_PAD_UART2_TXD__UART2_DCE_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
28};
29
30static iomux_v3_cfg_t const wdog_pads[] = {
31 MX8MP_PAD_GPIO1_IO02__WDOG1_WDOG_B | MUX_PAD_CTRL(WDOG_PAD_CTRL),
32};
33
34int board_early_init_f(void)
35{
36 struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
37
38 imx_iomux_v3_setup_multiple_pads(wdog_pads, ARRAY_SIZE(wdog_pads));
39
40 set_wdog_reset(wdog);
41
42 imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
43
44 return 0;
45}
46
Peng Fan4f0c97b2020-12-25 16:16:34 +080047static void setup_fec(void)
48{
49 struct iomuxc_gpr_base_regs *gpr =
50 (struct iomuxc_gpr_base_regs *)IOMUXC_GPR_BASE_ADDR;
51
52 /* Enable RGMII TX clk output */
53 setbits_le32(&gpr->gpr[1], BIT(22));
54}
55
56#define EQOS_RST_PAD IMX_GPIO_NR(4, 22)
57static iomux_v3_cfg_t const eqos_rst_pads[] = {
58 MX8MP_PAD_SAI2_RXC__GPIO4_IO22 | MUX_PAD_CTRL(NO_PAD_CTRL),
59};
60
61static void setup_iomux_eqos(void)
62{
63 imx_iomux_v3_setup_multiple_pads(eqos_rst_pads,
64 ARRAY_SIZE(eqos_rst_pads));
65
66 gpio_request(EQOS_RST_PAD, "eqos_rst");
67 gpio_direction_output(EQOS_RST_PAD, 0);
68 mdelay(15);
69 gpio_direction_output(EQOS_RST_PAD, 1);
70 mdelay(100);
71}
72
73static int setup_eqos(void)
74{
75 struct iomuxc_gpr_base_regs *gpr =
76 (struct iomuxc_gpr_base_regs *)IOMUXC_GPR_BASE_ADDR;
77
78 setup_iomux_eqos();
79
80 /* set INTF as RGMII, enable RGMII TXC clock */
81 clrsetbits_le32(&gpr->gpr[1],
82 IOMUXC_GPR_GPR1_GPR_ENET_QOS_INTF_SEL_MASK, BIT(16));
83 setbits_le32(&gpr->gpr[1], BIT(19) | BIT(21));
84
85 return set_clk_eqos(ENET_125MHZ);
86}
87
88#if CONFIG_IS_ENABLED(NET)
89int board_phy_config(struct phy_device *phydev)
Peng Fanc47e09d2019-12-30 17:46:21 +080090{
Peng Fan4f0c97b2020-12-25 16:16:34 +080091 if (phydev->drv->config)
92 phydev->drv->config(phydev);
Peng Fanc47e09d2019-12-30 17:46:21 +080093 return 0;
94}
Peng Fan4f0c97b2020-12-25 16:16:34 +080095#endif
96
97int board_init(void)
98{
99 int ret = 0;
100
101 if (CONFIG_IS_ENABLED(FEC_MXC)) {
102 setup_fec();
103
104 if (CONFIG_IS_ENABLED(DWC_ETH_QOS))
105 ret = setup_eqos();
106 }
107
108 return ret;
109}
Peng Fanc47e09d2019-12-30 17:46:21 +0800110
111int board_late_init(void)
112{
113#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
114 env_set("board_name", "EVK");
115 env_set("board_rev", "iMX8MP");
116#endif
117
118 return 0;
119}