diff options
Diffstat (limited to 'board/toradex/smarc-imx8mp/smarc-imx8mp.c')
-rw-r--r-- | board/toradex/smarc-imx8mp/smarc-imx8mp.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/board/toradex/smarc-imx8mp/smarc-imx8mp.c b/board/toradex/smarc-imx8mp/smarc-imx8mp.c new file mode 100644 index 00000000000..bbe371516cc --- /dev/null +++ b/board/toradex/smarc-imx8mp/smarc-imx8mp.c @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* Copyright (C) 2024 Toradex */ + +#include <init.h> +#include <asm/global_data.h> +#include <asm-generic/gpio.h> +#include <linux/errno.h> + +#include "../common/tdx-cfg-block.h" + +DECLARE_GLOBAL_DATA_PTR; + +int board_init(void) +{ + return 0; +} + +int board_phys_sdram_size(phys_size_t *size) +{ + if (!size) + return -EINVAL; + + *size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE + PHYS_SDRAM_2_SIZE); + + return 0; +} + +#if IS_ENABLED(CONFIG_OF_LIBFDT) && IS_ENABLED(CONFIG_OF_BOARD_SETUP) +static bool board_has_wifi(void) +{ + struct gpio_desc *desc; + + if (!gpio_hog_lookup_name("BT_UART_RXD_GPIO", &desc)) + return !!dm_gpio_get_value(desc); + + return true; +} + +/* + * Module variants with a Wi-Fi/Bluetooth module use UART3 for Bluetooth, + * those without use UART3 as the SMARC SER3 UART. + * Test for a Wi-Fi module and if none found reassign UART3 interface to + * the SMARC SER3 pins. + */ +static void ft_board_assign_uart(void *blob) +{ + const char *uart_path = "/soc@0/bus@30800000/spba-bus@30800000/serial@30880000"; + const char *pinctrl_path = "/soc@0/bus@30000000/pinctrl@30330000/uart3grp"; + int pinctrl_offset; + int uart_offset; + int bt_offset; + u32 phandle; + + if (board_has_wifi()) + return; + + uart_offset = fdt_path_offset(blob, uart_path); + if (uart_offset < 0) + return; + + fdt_delprop(blob, uart_offset, "uart-has-rtscts"); + bt_offset = fdt_subnode_offset(blob, uart_offset, "bluetooth"); + if (bt_offset < 0) + return; + + fdt_del_node(blob, bt_offset); + + pinctrl_offset = fdt_path_offset(blob, pinctrl_path); + if (pinctrl_offset < 0) + return; + + phandle = fdt_get_phandle(blob, pinctrl_offset); + if (phandle < 0) + return; + + fdt_setprop_u32(blob, uart_offset, "pinctrl-0", phandle); +} + +int ft_board_setup(void *blob, struct bd_info *bd) +{ + ft_board_assign_uart(blob); + + return ft_common_board_setup(blob, bd); +} +#endif |