summaryrefslogtreecommitdiff
path: root/board/renesas
diff options
context:
space:
mode:
Diffstat (limited to 'board/renesas')
-rw-r--r--board/renesas/sparrowhawk/sparrowhawk.c130
1 files changed, 128 insertions, 2 deletions
diff --git a/board/renesas/sparrowhawk/sparrowhawk.c b/board/renesas/sparrowhawk/sparrowhawk.c
index 8e72b5424d1..58de7f25cbd 100644
--- a/board/renesas/sparrowhawk/sparrowhawk.c
+++ b/board/renesas/sparrowhawk/sparrowhawk.c
@@ -6,8 +6,12 @@
#include <asm/io.h>
#include <compiler.h>
#include <dbsc5.h>
+#include <spi.h>
+#include <spi_flash.h>
#include <spl.h>
+#include "../../../drivers/mtd/spi/sf_internal.h"
+
#if defined(CONFIG_XPL_BUILD)
static const struct renesas_dbsc5_board_config
@@ -112,12 +116,134 @@ dbsc5_get_board_data(struct udevice *dev, const u32 modemr0)
* Use MD[19] setting to discern 8 GiB and 16 GiB DRAM Sparrow Hawk
* board variants from each other automatically.
*/
- if (modemr0 & BIT(19))
+ if ((renesas_get_cpu_rev_integer() >= 3) && (modemr0 & BIT(19)))
return &renesas_v4h_sparrowhawk_16g_5500_dbsc5_board_config;
else
return &renesas_v4h_sparrowhawk_8g_6400_dbsc5_board_config;
}
+static bool renesas_v4h_sparrowhawk_is_evta1 = false;
+
+unsigned int spl_spi_get_uboot_offs(struct spi_flash *flash)
+{
+ const u8 sf_ids_evta1[6] = { 0x01, 0x02, 0x20, 0x4d, 0x00, 0x81 };
+
+ renesas_v4h_sparrowhawk_is_evta1 = !memcmp(sf_ids_evta1, flash->info->id,
+ sizeof(sf_ids_evta1));
+
+ return CONFIG_SYS_SPI_U_BOOT_OFFS;
+}
+
+void spl_perform_fixups(struct spl_image_info *spl_image)
+{
+ void *blob = spl_image_fdt_addr(spl_image);
+ int err, offs;
+ u32 size;
+
+ if (!renesas_v4h_sparrowhawk_is_evta1)
+ return;
+
+ printf("EVTA1 board detected\n");
+
+ /*
+ * MicroSD voltage switch is not populated on Sparrow Hawk EVTA1,
+ * rewrite MicroSD slot regulator to only support 3V3 and disable
+ * UHS modes in MicroSD slot node.
+ */
+ if (!blob)
+ return;
+
+ err = fdt_check_header(blob);
+ if (err < 0) {
+ printf("Invalid FDT header: %s\n", fdt_strerror(err));
+ return;
+ }
+
+ size = fdt_totalsize(blob);
+ err = fdt_open_into(blob, blob, size + 64);
+ if (err < 0) {
+ printf("Failed to expand DT\n");
+ return;
+ }
+
+ offs = fdt_path_offset(blob, "/regulator-vcc-sdhi");
+ if (offs < 0) {
+ printf("Failed to locate MicroSD regulator node: %d\n", offs);
+ return;
+ }
+
+ err = fdt_setprop_string(blob, offs, "compatible", "regulator-fixed");
+ if (err < 0) {
+ printf("Failed to set fixed MicroSD regulator: %d\n", err);
+ return;
+ }
+
+ err = fdt_setprop_u32(blob, offs, "regulator-min-microvolt", 3300000);
+ if (err < 0) {
+ printf("Failed to set MicroSD regulator minimum voltage: %d\n", err);
+ return;
+ }
+
+ err = fdt_nop_property(blob, offs, "gpios");
+ if (err < 0) {
+ printf("Failed to remove MicroSD regulator gpios: %d\n", err);
+ return;
+ }
+
+ err = fdt_nop_property(blob, offs, "gpios-states");
+ if (err < 0) {
+ printf("Failed to remove MicroSD regulator gpio states: %d\n", err);
+ return;
+ }
+
+ err = fdt_nop_property(blob, offs, "states");
+ if (err < 0) {
+ printf("Failed to remove MicroSD regulator states: %d\n", err);
+ return;
+ }
+
+ offs = fdt_path_offset(blob, "/soc/mmc@ee140000");
+ if (offs < 0) {
+ printf("Failed to locate MicroSD device node: %d\n", offs);
+ return;
+ }
+
+ err = fdt_nop_property(blob, offs, "sd-uhs-sdr50");
+ if (err < 0) {
+ printf("Failed to disable SDR50 mode in MicroSD node: %d\n", err);
+ return;
+ }
+
+ err = fdt_nop_property(blob, offs, "sd-uhs-sdr104");
+ if (err < 0) {
+ printf("Failed to disable SDR104 mode in MicroSD node: %d\n", err);
+ return;
+ }
+
+ err = fdt_setprop_string(blob, offs, "pinctrl-names", "default");
+ if (err < 0) {
+ printf("Failed to set fixed MicroSD pin names: %d\n", err);
+ return;
+ }
+
+ err = fdt_nop_property(blob, offs, "pinctrl-1");
+ if (err < 0) {
+ printf("Failed to disable UHS pins in MicroSD node: %d\n", err);
+ return;
+ }
+
+ offs = fdt_path_offset(blob, "/soc/pinctrl@e6050000/avb0/pins-vddq18-25-avb");
+ if (offs < 0) {
+ printf("Failed to locate AVB pinctrl node: %d\n", offs);
+ return;
+ }
+
+ err = fdt_setprop_u32(blob, offs, "power-source", 2500);
+ if (err < 0) {
+ printf("Failed to set AVB IO voltage: %d\n", err);
+ return;
+ }
+}
#endif
#define RST_MODEMR0 0xe6160000
@@ -130,7 +256,7 @@ void renesas_dram_init_banksize(void)
int bank;
/* 8 GiB device, do nothing. */
- if (!(modemr0 & BIT(19)))
+ if (!((renesas_get_cpu_rev_integer() >= 3) && (modemr0 & BIT(19))))
return;
/* 16 GiB device, adjust memory map. */