
Moving to a DT-based clock framework on sunxi requires the subnodes of /clocks to be bound on boot-up. As /clocks does not contain a compatible-string, the U-Boot DT parsing code ignores it (and any subnodes). To overcome this limitation, the sunxi board-init code retrieves the /clocks node and explicitly starts a DM scan of the subnodes.
Signed-off-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com --- board/sunxi/board.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/board/sunxi/board.c b/board/sunxi/board.c index 89edf2e..838e89f 100644 --- a/board/sunxi/board.c +++ b/board/sunxi/board.c @@ -1,39 +1,40 @@ /* * (C) Copyright 2012-2013 Henrik Nordstrom henrik@henriknordstrom.net * (C) Copyright 2013 Luke Kenneth Casson Leighton lkcl@lkcl.net * * (C) Copyright 2007-2011 * Allwinner Technology Co., Ltd. <www.allwinnertech.com> * Tom Cubie tangliang@allwinnertech.com * * Some board init for the Allwinner A10-evb board. * * SPDX-License-Identifier: GPL-2.0+ */
#include <common.h> #include <mmc.h> #include <axp_pmic.h> #include <asm/arch/clock.h> #include <asm/arch/cpu.h> #include <asm/arch/display.h> #include <asm/arch/dram.h> #include <asm/arch/gpio.h> #include <asm/arch/mmc.h> #include <asm/arch/spl.h> #include <asm/arch/usb_phy.h> #ifndef CONFIG_ARM64 #include <asm/armv7.h> #endif #include <asm/gpio.h> #include <asm/io.h> #include <crc.h> +#include <dm/root.h> #include <environment.h> #include <libfdt.h> #include <fdtdec.h> #include <led.h> #include <nand.h> #include <net.h> #include <sy8106a.h> #include <command.h>
@@ -109,76 +110,87 @@ static int setup_led(void) int board_init(void) { __maybe_unused int id_pfr1, ret; + int __maybe_unused offset;
gd->bd->bi_boot_params = (PHYS_SDRAM_0 + 0x100);
+#if defined(CONFIG_CLK) + /* Sunxi device trees have their clock definitions in a tree + * below /clocks, which is a node without a compatible-string. + * We need to manually locate it and scan its subnodes. + */ + offset = fdt_path_offset(gd->fdt_blob, "/clocks"); + if (offset > 0) + dm_scan_fdt_node(gd->dm_root, gd->fdt_blob, offset, false); +#endif + #ifndef CONFIG_ARM64 asm volatile("mrc p15, 0, %0, c0, c1, 1" : "=r"(id_pfr1)); debug("id_pfr1: 0x%08x\n", id_pfr1); /* Generic Timer Extension available? */ if ((id_pfr1 >> CPUID_ARM_GENTIMER_SHIFT) & 0xf) { uint32_t freq;
debug("Setting CNTFRQ\n");
/* * CNTFRQ is a secure register, so we will crash if we try to * write this from the non-secure world (read is OK, though). * In case some bootcode has already set the correct value, * we avoid the risk of writing to it. */ asm volatile("mrc p15, 0, %0, c14, c0, 0" : "=r"(freq)); if (freq != CONFIG_TIMER_CLK_FREQ) { debug("arch timer frequency is %d Hz, should be %d, fixing ...\n", freq, CONFIG_TIMER_CLK_FREQ); #ifdef CONFIG_NON_SECURE printf("arch timer frequency is wrong, but cannot adjust it\n"); #else asm volatile("mcr p15, 0, %0, c14, c0, 0" : : "r"(CONFIG_TIMER_CLK_FREQ)); #endif } } #endif /* !CONFIG_ARM64 */
sunxi_gpio_set_cfgpin(SUNXI_GPG(10), SUN6I_GPG_USB3); sunxi_gpio_set_cfgpin(SUNXI_GPG(11), SUN6I_GPG_USB3);
gpio_request(SUNXI_GPC(3), "STM32 Boot0"); sunxi_gpio_set_cfgpin(SUNXI_GPC(3), SUNXI_GPIO_OUTPUT); gpio_request(SUNXI_GPC(26), "STM32 Reset"); sunxi_gpio_set_cfgpin(SUNXI_GPC(26), SUNXI_GPIO_OUTPUT); #if !defined(CONFIG_DM_GPIO) gpio_request(SUNXI_GPA(7), "PHY Reset"); sunxi_gpio_set_cfgpin(SUNXI_GPA(7), SUNXI_GPIO_OUTPUT); gpio_direction_output(SUNXI_GPA(7), 0); #endif
gpio_direction_output(SUNXI_GPC(3), 0); gpio_direction_output(SUNXI_GPC(26), 0); mdelay(10); gpio_direction_output(SUNXI_GPC(26), 1); #if !defined(CONFIG_DM_GPIO) gpio_direction_output(SUNXI_GPA(7), 1); #endif
setup_led();
ret = axp_gpio_init(); if (ret) return ret;
#ifdef CONFIG_SATAPWR gpio_request(CONFIG_SATAPWR, "satapwr"); gpio_direction_output(CONFIG_SATAPWR, 1); #endif #ifdef CONFIG_MACPWR gpio_request(CONFIG_MACPWR, "macpwr"); gpio_direction_output(CONFIG_MACPWR, 1); #endif
/* Uses dm gpio code so do this here and not in i2c_init_board() */ return soft_i2c_board_init();
}
@@ -1018,24 +1030,23 @@ U_BOOT_CMD( int board_fit_config_name_match(const char *name) { #ifdef CONFIG_SPL_LOAD_FIT const char *cmp_str;
#ifdef CONFIG_DEFAULT_DEVICE_TREE cmp_str = CONFIG_DEFAULT_DEVICE_TREE; #else return 0; #endif
/* Differentiate the two Pine64 board DTs by their DRAM size. */ if (strstr(name, "-pine64") && strstr(cmp_str, "-pine64")) { if ((gd->ram_size > 512 * 1024 * 1024)) return !strstr(name, "plus"); else return !!strstr(name, "plus"); } else { return strcmp(name, cmp_str); } #endif }
-