uboot/board/toradex/colibri-imx8x/colibri-imx8x.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright 2019 Toradex
   4 */
   5
   6#include <common.h>
   7
   8#include <asm/arch/clock.h>
   9#include <asm/arch/imx8-pins.h>
  10#include <asm/arch/iomux.h>
  11#include <asm/arch/sci/sci.h>
  12#include <asm/arch/sys_proto.h>
  13#include <asm/gpio.h>
  14#include <asm/io.h>
  15#include <env.h>
  16#include <errno.h>
  17#include <linux/libfdt.h>
  18
  19#include "../common/tdx-cfg-block.h"
  20
  21DECLARE_GLOBAL_DATA_PTR;
  22
  23#define UART_PAD_CTRL   ((SC_PAD_CONFIG_OUT_IN << PADRING_CONFIG_SHIFT) | \
  24                         (SC_PAD_ISO_OFF << PADRING_LPCONFIG_SHIFT) | \
  25                         (SC_PAD_28FDSOI_DSE_DV_HIGH << PADRING_DSE_SHIFT) | \
  26                         (SC_PAD_28FDSOI_PS_PU << PADRING_PULL_SHIFT))
  27
  28static iomux_cfg_t uart3_pads[] = {
  29        SC_P_FLEXCAN2_RX | MUX_MODE_ALT(2) | MUX_PAD_CTRL(UART_PAD_CTRL),
  30        SC_P_FLEXCAN2_TX | MUX_MODE_ALT(2) | MUX_PAD_CTRL(UART_PAD_CTRL),
  31        /* Transceiver FORCEOFF# signal, mux to use pull-up */
  32        SC_P_QSPI0B_DQS | MUX_MODE_ALT(4) | MUX_PAD_CTRL(UART_PAD_CTRL),
  33};
  34
  35static void setup_iomux_uart(void)
  36{
  37        imx8_iomux_setup_multiple_pads(uart3_pads, ARRAY_SIZE(uart3_pads));
  38}
  39
  40int board_early_init_f(void)
  41{
  42        sc_pm_clock_rate_t rate;
  43        sc_err_t err = 0;
  44
  45        /*
  46         * This works around that having only UART3 up the baudrate is 1.2M
  47         * instead of 115.2k. Set UART0 clock root to 80 MHz
  48         */
  49        rate = 80000000;
  50        err = sc_pm_set_clock_rate(-1, SC_R_UART_0, SC_PM_CLK_PER, &rate);
  51        if (err != SC_ERR_NONE)
  52                return 0;
  53
  54        /* Set UART3 clock root to 80 MHz and enable it */
  55        rate = SC_80MHZ;
  56        err = sc_pm_setup_uart(SC_R_UART_3, rate);
  57        if (err != SC_ERR_NONE)
  58                return 0;
  59
  60        setup_iomux_uart();
  61
  62        return 0;
  63}
  64
  65#if IS_ENABLED(CONFIG_DM_GPIO)
  66static void board_gpio_init(void)
  67{
  68        /* TODO */
  69}
  70#else
  71static inline void board_gpio_init(void) {}
  72#endif
  73
  74#if IS_ENABLED(CONFIG_FEC_MXC)
  75#include <miiphy.h>
  76
  77int board_phy_config(struct phy_device *phydev)
  78{
  79        if (phydev->drv->config)
  80                phydev->drv->config(phydev);
  81
  82        return 0;
  83}
  84#endif
  85
  86int checkboard(void)
  87{
  88        puts("Model: Toradex Colibri iMX8X\n");
  89
  90        build_info();
  91        print_bootinfo();
  92
  93        return 0;
  94}
  95
  96int board_init(void)
  97{
  98        board_gpio_init();
  99
 100        return 0;
 101}
 102
 103void detail_board_ddr_info(void)
 104{
 105        puts("\nDDR    ");
 106}
 107
 108/*
 109 * Board specific reset that is system reset.
 110 */
 111void reset_cpu(ulong addr)
 112{
 113        /* TODO */
 114}
 115
 116#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
 117int ft_board_setup(void *blob, bd_t *bd)
 118{
 119        return ft_common_board_setup(blob, bd);
 120}
 121#endif
 122
 123int board_mmc_get_env_dev(int devno)
 124{
 125        return devno;
 126}
 127
 128int board_late_init(void)
 129{
 130#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
 131/* TODO move to common */
 132        env_set("board_name", "Colibri iMX8QXP");
 133        env_set("board_rev", "v1.0");
 134#endif
 135
 136        return 0;
 137}
 138