summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/arm/dts/rk3576-u-boot.dtsi33
-rw-r--r--arch/arm/include/asm/arch-rockchip/bootrom.h1
-rw-r--r--arch/arm/mach-rockchip/rk3576/rk3576.c1
-rw-r--r--arch/arm/mach-rockchip/spl-boot-order.c14
4 files changed, 48 insertions, 1 deletions
diff --git a/arch/arm/dts/rk3576-u-boot.dtsi b/arch/arm/dts/rk3576-u-boot.dtsi
index 018c9cc8d69..8db9495c6d4 100644
--- a/arch/arm/dts/rk3576-u-boot.dtsi
+++ b/arch/arm/dts/rk3576-u-boot.dtsi
@@ -12,7 +12,7 @@
};
chosen {
- u-boot,spl-boot-order = "same-as-spl", &sdmmc, &sdhci;
+ u-boot,spl-boot-order = "same-as-spl", &sdmmc, &sdhci, &ufshc;
};
dmc {
@@ -81,6 +81,17 @@
bootph-some-ram;
};
+#ifdef CONFIG_SPL_UFS_SUPPORT
+&gpio4 {
+ /* This is specifically for GPIO4_D0, which is the only 1.2V capable
+ * pin on RK3576 available for use as the UFS device reset, thus
+ * &gpio4 is required for booting from UFS on RK3576.
+ */
+ bootph-pre-ram;
+ bootph-some-ram;
+};
+#endif
+
&ioc_grf {
bootph-all;
};
@@ -89,6 +100,11 @@
bootph-some-ram;
};
+&pcfg_pull_down {
+ bootph-pre-ram;
+ bootph-some-ram;
+};
+
&pcfg_pull_none {
bootph-all;
};
@@ -172,6 +188,21 @@
bootph-pre-ram;
};
+&ufshc {
+ bootph-pre-ram;
+ bootph-some-ram;
+};
+
+&ufs_refclk {
+ bootph-pre-ram;
+ bootph-some-ram;
+};
+
+&ufs_rstgpio {
+ bootph-pre-ram;
+ bootph-some-ram;
+};
+
&xin24m {
bootph-all;
};
diff --git a/arch/arm/include/asm/arch-rockchip/bootrom.h b/arch/arm/include/asm/arch-rockchip/bootrom.h
index b15938c021d..f9ecb6858f0 100644
--- a/arch/arm/include/asm/arch-rockchip/bootrom.h
+++ b/arch/arm/include/asm/arch-rockchip/bootrom.h
@@ -51,6 +51,7 @@ enum {
BROM_BOOTSOURCE_SPINOR = 3,
BROM_BOOTSOURCE_SPINAND = 4,
BROM_BOOTSOURCE_SD = 5,
+ BROM_BOOTSOURCE_UFS = 7,
BROM_BOOTSOURCE_I2C = 8,
BROM_BOOTSOURCE_SPI = 9,
BROM_BOOTSOURCE_USB = 10,
diff --git a/arch/arm/mach-rockchip/rk3576/rk3576.c b/arch/arm/mach-rockchip/rk3576/rk3576.c
index c17ba418ced..1def4e87971 100644
--- a/arch/arm/mach-rockchip/rk3576/rk3576.c
+++ b/arch/arm/mach-rockchip/rk3576/rk3576.c
@@ -49,6 +49,7 @@ const char * const boot_devices[BROM_LAST_BOOTSOURCE + 1] = {
[BROM_BOOTSOURCE_FSPI0] = "/soc/spi@2a340000/flash@0",
[BROM_BOOTSOURCE_FSPI1_M1] = "/soc/spi@2a300000/flash@0",
[BROM_BOOTSOURCE_SD] = "/soc/mmc@2a310000",
+ [BROM_BOOTSOURCE_UFS] = "/soc/ufshc@2a2d0000",
};
static struct mm_region rk3576_mem_map[] = {
diff --git a/arch/arm/mach-rockchip/spl-boot-order.c b/arch/arm/mach-rockchip/spl-boot-order.c
index 6572dde29f6..d2dd5e10935 100644
--- a/arch/arm/mach-rockchip/spl-boot-order.c
+++ b/arch/arm/mach-rockchip/spl-boot-order.c
@@ -76,6 +76,9 @@ static int spl_node_to_boot_device(int node)
if (!uclass_find_device_by_of_offset(UCLASS_SPI_FLASH, node, &parent))
return BOOT_DEVICE_SPI;
+ if (!uclass_find_device_by_of_offset(UCLASS_UFS, node, &parent))
+ return BOOT_DEVICE_UFS;
+
return -1;
}
@@ -231,6 +234,17 @@ int spl_decode_boot_device(u32 boot_device, char *buf, size_t buflen)
return -ENODEV;
}
+ if (boot_device == BOOT_DEVICE_UFS) {
+ ret = uclass_find_device(UCLASS_UFS, 0, &dev);
+ if (ret) {
+ debug("%s: could not find device for UFS: %d\n",
+ __func__, ret);
+ return ret;
+ }
+
+ return ofnode_get_path(dev_ofnode(dev), buf, buflen);
+ }
+
#if CONFIG_IS_ENABLED(BLK)
dev_num = (boot_device == BOOT_DEVICE_MMC1) ? 0 : 1;