blob: a21f09e3122d5bb432e065916b92244111eeeef3 [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0
/*
* https://beagleplay.org/
*
* Copyright (C) 2022-2023 Texas Instruments Incorporated - https://www.ti.com/
* Copyright (C) 2022-2023 Robert Nelson, BeagleBoard.org Foundation
*/
#include <efi_loader.h>
#include <cpu_func.h>
#include <env.h>
#include <fdt_support.h>
#include <spl.h>
#include <asm/arch/hardware.h>
DECLARE_GLOBAL_DATA_PTR;
struct efi_fw_image fw_images[] = {
{
.image_type_id = BEAGLEPLAY_TIBOOT3_IMAGE_GUID,
.fw_name = u"BEAGLEPLAY_TIBOOT3",
.image_index = 1,
},
{
.image_type_id = BEAGLEPLAY_SPL_IMAGE_GUID,
.fw_name = u"BEAGLEPLAY_SPL",
.image_index = 2,
},
{
.image_type_id = BEAGLEPLAY_UBOOT_IMAGE_GUID,
.fw_name = u"BEAGLEPLAY_UBOOT",
.image_index = 3,
}
};
struct efi_capsule_update_info update_info = {
.dfu_string = "mmc 0=tiboot3.bin raw 0 2000 mmcpart 1;"
"tispl.bin fat 0 1;u-boot.img fat 0 1",
.num_images = ARRAY_SIZE(fw_images),
.images = fw_images,
};
#if IS_ENABLED(CONFIG_SET_DFU_ALT_INFO)
void set_dfu_alt_info(char *interface, char *devstr)
{
if (IS_ENABLED(CONFIG_EFI_HAVE_CAPSULE_SUPPORT))
env_set("dfu_alt_info", update_info.dfu_string);
}
#endif
int board_init(void)
{
return 0;
}
int dram_init(void)
{
return fdtdec_setup_mem_size_base();
}
int dram_init_banksize(void)
{
return fdtdec_setup_memory_banksize();
}
#ifdef CONFIG_BOARD_LATE_INIT
int board_late_init(void)
{
char fdtfile[50];
snprintf(fdtfile, sizeof(fdtfile), "%s/%s.dtb",
CONFIG_TI_FDT_FOLDER_PATH, CONFIG_DEFAULT_DEVICE_TREE);
env_set("fdtfile", fdtfile);
return 0;
}
#endif
#ifdef CONFIG_SPL_BOARD_INIT
/*
* Enable the 32k Crystal: needed for accurate 32k clock
* and external clock sources such as wlan 32k input clock
* supplied from the SoC to the wlan chip.
*
* The trim setup can be very highly board type specific choice of the crystal
* So this is done in the board file, though, in this case, no specific trim
* is necessary.
*/
static void crystal_32k_enable(void)
{
/* Only mess with 32k at the start of boot from R5 */
if (IS_ENABLED(CONFIG_CPU_V7R)) {
/*
* We have external 32k crystal, so lets enable it (0x0)
* and disable bypass (0x0)
*/
writel(0x0, MCU_CTRL_LFXOSC_CTRL);
/* Add any crystal specific TRIM needed here.. */
/* Make sure to mux the SoC 32k from the crystal */
writel(MCU_CTRL_DEVICE_CLKOUT_LFOSC_SELECT_VAL,
MCU_CTRL_DEVICE_CLKOUT_32K_CTRL);
}
}
static void debounce_configure(void)
{
/* Configure debounce one time from R5 */
if (IS_ENABLED(CONFIG_CPU_V7R)) {
/*
* Setup debounce time registers.
* arbitrary values. Times are approx
*/
/* 1.9ms debounce @ 32k */
writel(0x1, CTRLMMR_DBOUNCE_CFG(1));
/* 5ms debounce @ 32k */
writel(0x5, CTRLMMR_DBOUNCE_CFG(2));
/* 20ms debounce @ 32k */
writel(0x14, CTRLMMR_DBOUNCE_CFG(3));
/* 46ms debounce @ 32k */
writel(0x18, CTRLMMR_DBOUNCE_CFG(4));
/* 100ms debounce @ 32k */
writel(0x1c, CTRLMMR_DBOUNCE_CFG(5));
/* 156ms debounce @ 32k */
writel(0x1f, CTRLMMR_DBOUNCE_CFG(6));
}
}
void spl_board_init(void)
{
crystal_32k_enable();
debounce_configure();
}
#endif