mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-23 03:23:47 +00:00
453d1711d2
This board has an internal watchdog which supervises the board startup. Although, the initial state of the watchdog is configurable, it is enabled by default. In board_late_init(), which means almost everything worked as expected, disable the watchdog. Signed-off-by: Michael Walle <michael@walle.cc> Reviewed-by: Priyanka Jain <priyanka.jain@nxp.com>
137 lines
2.6 KiB
C
137 lines
2.6 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
|
|
#include <common.h>
|
|
#include <dm.h>
|
|
#include <malloc.h>
|
|
#include <errno.h>
|
|
#include <fsl_ddr.h>
|
|
#include <fdt_support.h>
|
|
#include <asm/global_data.h>
|
|
#include <linux/libfdt.h>
|
|
#include <env_internal.h>
|
|
#include <asm/arch-fsl-layerscape/soc.h>
|
|
#include <asm/arch-fsl-layerscape/fsl_icid.h>
|
|
#include <i2c.h>
|
|
#include <asm/arch/soc.h>
|
|
#include <fsl_immap.h>
|
|
#include <netdev.h>
|
|
#include <wdt.h>
|
|
|
|
#include <sl28cpld.h>
|
|
#include <fdtdec.h>
|
|
#include <miiphy.h>
|
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
int board_early_init_f(void)
|
|
{
|
|
fsl_lsch3_early_init_f();
|
|
return 0;
|
|
}
|
|
|
|
int board_init(void)
|
|
{
|
|
if (CONFIG_IS_ENABLED(FSL_CAAM))
|
|
sec_init();
|
|
|
|
return 0;
|
|
}
|
|
|
|
int board_eth_init(struct bd_info *bis)
|
|
{
|
|
return pci_eth_init(bis);
|
|
}
|
|
|
|
static int __sl28cpld_read(uint reg)
|
|
{
|
|
struct udevice *dev;
|
|
int ret;
|
|
|
|
ret = uclass_get_device_by_driver(UCLASS_NOP,
|
|
DM_DRIVER_GET(sl28cpld), &dev);
|
|
if (ret)
|
|
return ret;
|
|
|
|
return sl28cpld_read(dev, reg);
|
|
}
|
|
|
|
static void print_cpld_version(void)
|
|
{
|
|
int version = __sl28cpld_read(SL28CPLD_VERSION);
|
|
|
|
if (version < 0)
|
|
printf("CPLD: error reading version (%d)\n", version);
|
|
else
|
|
printf("CPLD: v%d\n", version);
|
|
}
|
|
|
|
int checkboard(void)
|
|
{
|
|
printf("EL: %d\n", current_el());
|
|
if (CONFIG_IS_ENABLED(SL28CPLD))
|
|
print_cpld_version();
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void stop_recovery_watchdog(void)
|
|
{
|
|
struct udevice *dev;
|
|
int ret;
|
|
|
|
ret = uclass_get_device_by_driver(UCLASS_WDT,
|
|
DM_DRIVER_GET(sl28cpld_wdt), &dev);
|
|
if (!ret)
|
|
wdt_stop(dev);
|
|
}
|
|
|
|
int fsl_board_late_init(void)
|
|
{
|
|
/*
|
|
* Usually, the after a board reset, the watchdog is enabled by
|
|
* default. This is to supervise the bootloader boot-up. Therefore,
|
|
* to prevent a watchdog reset if we don't actively kick it, we have
|
|
* to disable it.
|
|
*
|
|
* If the watchdog isn't enabled at reset (which is a configuration
|
|
* option) disabling it doesn't hurt either.
|
|
*/
|
|
if (!CONFIG_IS_ENABLED(WATCHDOG_AUTOSTART))
|
|
stop_recovery_watchdog();
|
|
|
|
return 0;
|
|
}
|
|
|
|
void detail_board_ddr_info(void)
|
|
{
|
|
print_ddr_info(0);
|
|
}
|
|
|
|
int ft_board_setup(void *blob, struct bd_info *bd)
|
|
{
|
|
u64 base[CONFIG_NR_DRAM_BANKS];
|
|
u64 size[CONFIG_NR_DRAM_BANKS];
|
|
int nbanks = CONFIG_NR_DRAM_BANKS;
|
|
int node;
|
|
int i;
|
|
|
|
ft_cpu_setup(blob, bd);
|
|
|
|
/* fixup DT for the two GPP DDR banks */
|
|
for (i = 0; i < nbanks; i++) {
|
|
base[i] = gd->bd->bi_dram[i].start;
|
|
size[i] = gd->bd->bi_dram[i].size;
|
|
}
|
|
|
|
fdt_fixup_memory_banks(blob, base, size, nbanks);
|
|
|
|
fdt_fixup_icid(blob);
|
|
|
|
if (CONFIG_IS_ENABLED(SL28_SPL_LOADS_OPTEE_BL32)) {
|
|
node = fdt_node_offset_by_compatible(blob, -1, "linaro,optee-tz");
|
|
if (node)
|
|
fdt_set_node_status(blob, node, FDT_STATUS_OKAY);
|
|
}
|
|
|
|
return 0;
|
|
}
|