diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e0ede0ceb8055ac7337b4c8a8a15d48e6ca37cfd..efac4c6d6aa675976839be635b6a0008e31d9ecf 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -19,6 +19,8 @@ build: cp lpddr4*.bin u-boot/ # Config header adjustments env --chdir=u-boot patch -p1 < nitrogen8mp.patch + # Patch board init code + cp nitrogen8mp.c u-boot/board/boundary/nitrogen8mp/ for platform in reform2 pocket-reform; do cp "imx8mp-mnt-${platform}.dts" u-boot/arch/arm/dts/imx8mp-nitrogen8mp.dts cp "imx8mp-mnt-${platform}_defconfig" u-boot/configs/ diff --git a/nitrogen8mp.c b/nitrogen8mp.c new file mode 100644 index 0000000000000000000000000000000000000000..9456de2b275b138dec3bbe50823035c65aaecf2e --- /dev/null +++ b/nitrogen8mp.c @@ -0,0 +1,166 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright 2019 NXP + * Copyright 2020 Boundary Devices + */ + +#include <common.h> +#include <command.h> +#include <asm/arch/clock.h> +#include <asm/arch/imx8mp_pins.h> +#include <asm/arch/sys_proto.h> +#include <asm/io.h> +#include <asm/mach-imx/dma.h> +#include <asm/mach-imx/fbpanel.h> +#include <asm/mach-imx/gpio.h> +#include <asm/mach-imx/iomux-v3.h> +#include <asm/mach-imx/mxc_i2c.h> +#include <asm-generic/gpio.h> + +#include <display_detect.h> +#include <dwc3-uboot.h> +#include <errno.h> +#include <linux/delay.h> +#include <miiphy.h> +#include <mmc.h> +#include <netdev.h> +#include <power/pmic.h> +#include <spl.h> +#include <usb.h> +#include "../common/padctrl.h" +#include "../common/bd_common.h" + +DECLARE_GLOBAL_DATA_PTR; + +#define UART_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_FSEL1) +#define WDOG_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_ODE | PAD_CTL_PUE | PAD_CTL_PE) + +static iomux_v3_cfg_t const init_pads[] = { + IOMUX_PAD_CTRL(GPIO1_IO01__GPIO1_IO01, 0x100), + IOMUX_PAD_CTRL(GPIO1_IO02__WDOG1_WDOG_B, WDOG_PAD_CTRL), + IOMUX_PAD_CTRL(UART2_RXD__UART2_DCE_RX, UART_PAD_CTRL), + IOMUX_PAD_CTRL(UART2_TXD__UART2_DCE_TX, UART_PAD_CTRL), + IOMUX_PAD_CTRL(SAI1_RXD3__ENET1_MDIO, PAD_CTRL_ENET_MDIO), + IOMUX_PAD_CTRL(SAI1_RXD2__ENET1_MDC, PAD_CTRL_ENET_MDC), + + /* eqos */ +#define GP_EQOS_MII_MDC IMX_GPIO_NR(1, 16) + IOMUX_PAD_CTRL(ENET_MDC__ENET_QOS_MDC, 0x3), +#define GP_EQOS_MII_MDIO IMX_GPIO_NR(1, 17) + IOMUX_PAD_CTRL(ENET_MDIO__ENET_QOS_MDIO, 0x3), + /* fec */ +#define GP_FEC_MII_MDC IMX_GPIO_NR(4, 4) + IOMUX_PAD_CTRL(SAI1_RXD2__ENET1_MDC, 0x3), +#define GP_FEC_MII_MDIO IMX_GPIO_NR(4, 5) + IOMUX_PAD_CTRL(SAI1_RXD3__ENET1_MDIO, 0x3), + +#define GP_USB3_1_HUB_RESET IMX_GPIO_NR(1, 10) + IOMUX_PAD_CTRL(GPIO1_IO10__GPIO1_IO10, WEAK_PULLUP_OUTPUT), + //IOMUX_PAD_CTRL(GPIO1_IO12__GPIO1_IO12, 0x100), + //IOMUX_PAD_CTRL(GPIO1_IO13__HSIOMIX_usb1_OTG_OC, 0x116), + //IOMUX_PAD_CTRL(SAI1_RXD0__GPIO4_IO02, 0x00), /* float for OTG1 mode */ +#define GP_FASTBOOT_KEY IMX_GPIO_NR(5, 9) + IOMUX_PAD_CTRL(ECSPI1_SS0__GPIO5_IO09, WEAK_PULLUP), + IOMUX_PAD_CTRL(ECSPI1_MISO__GPIO5_IO08, WEAK_PULLDN_OUTPUT), +}; + +int board_early_init_f(void) +{ + struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR; + + imx_iomux_v3_setup_multiple_pads(init_pads, ARRAY_SIZE(init_pads)); + set_wdog_reset(wdog); + init_uart_clk(1); + + return 0; +} + +#ifdef CONFIG_CMD_FBPANEL +#ifdef CONFIG_VIDEO_IMX8MP_HDMI +int board_detect_hdmi(struct display_info_t const *di) +{ + int ret = display_detect_by_node_name("hdmi_hpd"); + + return (ret > 0) ? 1 : 0; +} +#endif + +static const struct display_info_t displays[] = { + /* hdmi */ +#ifdef CONFIG_VIDEO_IMX8MP_HDMI + VD_1920_1080M_60(HDMI, board_detect_hdmi, 0, 0x50), +#else + VD_1920_1080M_60(HDMI, NULL, 0, 0x50), +#endif + VD_1280_800M_60(HDMI, NULL, 0, 0x50), + VD_1280_720M_60(HDMI, NULL, 0, 0x50), + VD_1024_768M_60(HDMI, NULL, 0, 0x50), + VD_640_480M_60(HDMI, NULL, 0, 0x50), +}; +#define display_cnt ARRAY_SIZE(displays) +#else +#define displays NULL +#define display_cnt 0 +#endif + +int board_init(void) +{ + gpio_request(GP_EQOS_MII_MDC, "eqos_mdc"); + gpio_request(GP_EQOS_MII_MDIO, "eqos_mdio"); + gpio_request(GP_FEC_MII_MDC, "fec_mdc"); + gpio_request(GP_FEC_MII_MDIO, "fec_mdio"); + gpio_request(GP_USB3_1_HUB_RESET, "usb1_hub_reset"); + + gpio_direction_output(GP_USB3_1_HUB_RESET, 0); + gpio_set_value(GP_USB3_1_HUB_RESET, 0); + mdelay(10); + gpio_set_value(GP_USB3_1_HUB_RESET, 1); + gpio_free(GP_USB3_1_HUB_RESET); + +#ifdef CONFIG_DM_ETH + board_eth_init(gd->bd); +#endif +#ifdef CONFIG_CMD_FBPANEL + fbp_setup_display(displays, display_cnt); +#endif + return 0; +} + +#if defined(CONFIG_CMD_FASTBOOT) || defined(CONFIG_CMD_DFU) +int board_fastboot_key_pressed(void) +{ + gpio_request(GP_FASTBOOT_KEY, "fastboot_key"); + gpio_direction_input(GP_FASTBOOT_KEY); + return !gpio_get_value(GP_FASTBOOT_KEY); +} +#endif + +static int board_carrier = -1; +static int board_rv = -1; + +static void check_board_env(void) +{ + if (board_rv == 20) + env_set("board_rv", "_r20"); +#ifdef CONFIG_FEC_MXC /* bm has only 1 phy as well */ + if (board_carrier >= 0) + env_set("board_carrier", board_carrier ? "-enc" : NULL); +#endif +} + +void board_eth_type(int index, int ksz) +{ + if (index == 0) { + board_rv = ksz ? 20 : 0; + if (board_carrier < 0) + board_carrier = 1; + } else if (index == 1) { + board_carrier = 0; /* EVK */ + } + check_board_env(); +} + +void board_env_init(void) +{ + check_board_env(); +}