#define SCU_HWSTRAP1_CPU_FREQ_SHIFT 8
#define SCU_HWSTRAP1_MAC2_INTF BIT(7)
#define SCU_HWSTRAP1_MAC1_INTF BIT(6)
+#define SCU_HWSTRAP1_BOOT_EMMC BIT(2)
+
+#define SCU_HWSTRAP2_BOOT_UART BIT(8)
#define SCU_EFUSE_DIS_DP BIT(17)
#define SCU_EFUSE_DIS_VGA BIT(14)
#include <dm.h>
#include <spl.h>
#include <init.h>
+#include <linux/err.h>
#include <asm/io.h>
#include <asm/arch/scu_ast2600.h>
#include <asm/global_data.h>
dram_init();
}
+/*
+ * Try to detect the boot mode. Fallback to the default,
+ * memory mapped SPI XIP booting if detection failed.
+ */
u32 spl_boot_device(void)
{
+ int rc;
+ struct udevice *scu_dev;
+ struct ast2600_scu *scu;
+
+ rc = uclass_get_device_by_driver(UCLASS_CLK,
+ DM_DRIVER_GET(aspeed_ast2600_scu), &scu_dev);
+ if (rc) {
+ debug("%s: failed to get SCU driver\n", __func__);
+ goto out;
+ }
+
+ scu = devfdt_get_addr_ptr(scu_dev);
+ if (IS_ERR_OR_NULL(scu)) {
+ debug("%s: failed to get SCU base\n", __func__);
+ goto out;
+ }
+
+ /* boot from UART has higher priority */
+ if (scu->hwstrap2 & SCU_HWSTRAP2_BOOT_UART)
+ return BOOT_DEVICE_UART;
+
+ if (scu->hwstrap1 & SCU_HWSTRAP1_BOOT_EMMC)
+ return BOOT_DEVICE_MMC1;
+
+out:
return BOOT_DEVICE_RAM;
}