add allwinner mmc patch
This commit is contained in:
parent
fbf8311945
commit
3ef111bdbb
309
sunxi-mmc-fixes.patch
Normal file
309
sunxi-mmc-fixes.patch
Normal file
@ -0,0 +1,309 @@
|
||||
From patchwork Wed Aug 23 11:41:33 2017
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [U-Boot,1/4] mmc: sunxi: fix legacy MMC initialisation
|
||||
From: Maxime Ripard <maxime.ripard@free-electrons.com>
|
||||
X-Patchwork-Id: 804954
|
||||
Message-Id: <20170823114136.10919-2-maxime.ripard@free-electrons.com>
|
||||
To: Jagan Teki <jagan@openedev.com>, Jaehoon Chung <jh80.chung@samsung.com>,
|
||||
Simon Glass <sjg@chromium.org>
|
||||
Cc: u-boot@lists.denx.de, Maxime Ripard <maxime.ripard@free-electrons.com>
|
||||
Date: Wed, 23 Aug 2017 13:41:33 +0200
|
||||
|
||||
The driver-model rework changed, among other things, the way the private
|
||||
data were moved around. It now uses the private field in the struct mmc.
|
||||
|
||||
However, the mmc_create argument was changed in the process to always pass
|
||||
the array we used to have to store our private structures.
|
||||
|
||||
The basically means that all the MMC driver instances will now have the
|
||||
private data of the first instance, which obviously doesn't work very well.
|
||||
|
||||
Pass the proper pointer to mmc_create.
|
||||
|
||||
Fixes: 034e226bc77e ("dm: mmc: sunxi: Pass private data around explicitly")
|
||||
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
|
||||
Tested-by: Chen-Yu Tsai <wens@csie.org>
|
||||
Tested-by: Jagan Teki <jagan@openedev.com>
|
||||
Reviewed-by: Jagan Teki <jagan@openedev.com>
|
||||
---
|
||||
drivers/mmc/sunxi_mmc.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
|
||||
index 588574fab6a9..30f1f76e9f8c 100644
|
||||
--- a/drivers/mmc/sunxi_mmc.c
|
||||
+++ b/drivers/mmc/sunxi_mmc.c
|
||||
@@ -498,7 +498,7 @@ struct mmc *sunxi_mmc_init(int sdc_no)
|
||||
if (ret)
|
||||
return NULL;
|
||||
|
||||
- return mmc_create(cfg, mmc_host);
|
||||
+ return mmc_create(cfg, priv);
|
||||
}
|
||||
#else
|
||||
|
||||
From patchwork Wed Aug 23 11:41:34 2017
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [U-Boot,2/4] arm: sunxi: compile spl_boot_device even for U-Boot
|
||||
From: Maxime Ripard <maxime.ripard@free-electrons.com>
|
||||
X-Patchwork-Id: 804955
|
||||
Message-Id: <20170823114136.10919-3-maxime.ripard@free-electrons.com>
|
||||
To: Jagan Teki <jagan@openedev.com>, Jaehoon Chung <jh80.chung@samsung.com>,
|
||||
Simon Glass <sjg@chromium.org>
|
||||
Cc: u-boot@lists.denx.de, Maxime Ripard <maxime.ripard@free-electrons.com>
|
||||
Date: Wed, 23 Aug 2017 13:41:34 +0200
|
||||
|
||||
U-Boot itself might need to identify the boot device, for example to be
|
||||
able to tell where to load the kernel from when several options are
|
||||
possible.
|
||||
|
||||
Remove the guard preventing it from being compiled.
|
||||
|
||||
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
|
||||
Tested-by: Chen-Yu Tsai <wens@csie.org>
|
||||
---
|
||||
arch/arm/mach-sunxi/board.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/mach-sunxi/board.c b/arch/arm/mach-sunxi/board.c
|
||||
index 65b1ebd83787..f5e977b4183d 100644
|
||||
--- a/arch/arm/mach-sunxi/board.c
|
||||
+++ b/arch/arm/mach-sunxi/board.c
|
||||
@@ -14,9 +14,7 @@
|
||||
#include <mmc.h>
|
||||
#include <i2c.h>
|
||||
#include <serial.h>
|
||||
-#ifdef CONFIG_SPL_BUILD
|
||||
#include <spl.h>
|
||||
-#endif
|
||||
#include <asm/gpio.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/clock.h>
|
||||
@@ -210,7 +208,6 @@ void s_init(void)
|
||||
eth_init_board();
|
||||
}
|
||||
|
||||
-#ifdef CONFIG_SPL_BUILD
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
/* The sunxi internal brom will try to loader external bootloader
|
||||
@@ -261,6 +258,7 @@ u32 spl_boot_mode(const u32 boot_device)
|
||||
return MMCSD_MODE_RAW;
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_SPL_BUILD
|
||||
void board_init_f(ulong dummy)
|
||||
{
|
||||
spl_init();
|
||||
From patchwork Wed Aug 23 11:41:35 2017
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [U-Boot,3/4] sunxi: Use spl_boot_device
|
||||
From: Maxime Ripard <maxime.ripard@free-electrons.com>
|
||||
X-Patchwork-Id: 804957
|
||||
Message-Id: <20170823114136.10919-4-maxime.ripard@free-electrons.com>
|
||||
To: Jagan Teki <jagan@openedev.com>, Jaehoon Chung <jh80.chung@samsung.com>,
|
||||
Simon Glass <sjg@chromium.org>
|
||||
Cc: u-boot@lists.denx.de, Maxime Ripard <maxime.ripard@free-electrons.com>
|
||||
Date: Wed, 23 Aug 2017 13:41:35 +0200
|
||||
|
||||
Our current board code duplicates a bit the spl_boot_device logic. Now that
|
||||
we can use that function in the full-flavoured U-Boot, remove that
|
||||
duplication and call the function instead.
|
||||
|
||||
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
|
||||
---
|
||||
board/sunxi/board.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/board/sunxi/board.c b/board/sunxi/board.c
|
||||
index 800f412b383d..e1d48140878f 100644
|
||||
--- a/board/sunxi/board.c
|
||||
+++ b/board/sunxi/board.c
|
||||
@@ -32,6 +32,7 @@
|
||||
#include <libfdt.h>
|
||||
#include <nand.h>
|
||||
#include <net.h>
|
||||
+#include <spl.h>
|
||||
#include <sy8106a.h>
|
||||
#include <asm/setup.h>
|
||||
|
||||
@@ -720,11 +721,14 @@ static void setup_environment(const void *fdt)
|
||||
int misc_init_r(void)
|
||||
{
|
||||
__maybe_unused int ret;
|
||||
+ uint boot;
|
||||
|
||||
setenv("fel_booted", NULL);
|
||||
setenv("fel_scriptaddr", NULL);
|
||||
+
|
||||
+ boot = spl_boot_device();
|
||||
/* determine if we are running in FEL mode */
|
||||
- if (!is_boot0_magic(SPL_ADDR + 4)) { /* eGON.BT0 */
|
||||
+ if (boot == BOOT_DEVICE_BOARD) {
|
||||
setenv("fel_booted", "1");
|
||||
parse_spl_header(SPL_ADDR);
|
||||
}
|
||||
From patchwork Wed Aug 23 11:41:36 2017
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [U-Boot,4/4] sunxi: Remove the MMC index hack
|
||||
From: Maxime Ripard <maxime.ripard@free-electrons.com>
|
||||
X-Patchwork-Id: 804956
|
||||
Message-Id: <20170823114136.10919-5-maxime.ripard@free-electrons.com>
|
||||
To: Jagan Teki <jagan@openedev.com>, Jaehoon Chung <jh80.chung@samsung.com>,
|
||||
Simon Glass <sjg@chromium.org>
|
||||
Cc: u-boot@lists.denx.de, Maxime Ripard <maxime.ripard@free-electrons.com>
|
||||
Date: Wed, 23 Aug 2017 13:41:36 +0200
|
||||
|
||||
The current code, if there's both an eMMC and an MMC slot available on the
|
||||
board, will swap the MMC indices based on whether we booted from the eMMC
|
||||
or the MMC. This way, the MMC we're supposed to boot on will always have
|
||||
the index 0.
|
||||
|
||||
However, this causes various issues, for example when using other
|
||||
components that base their behaviour on the MMC index, such as fastboot.
|
||||
|
||||
Let's remove that hack, and take the opposite approach. The MMC will always
|
||||
have the same index, but the bootcmd will pick the same device than the one
|
||||
we booted from. This is done through the introduction of the mmc_bootdev
|
||||
environment variable that will be filled by the board code based on the
|
||||
boot device informations we can get from the SoC.
|
||||
|
||||
In order to not introduce regressions, we also need to adjust the fastboot
|
||||
MMC device and the environment device in order to set it to the eMMC, over
|
||||
the MMC, like it used to be the case.
|
||||
|
||||
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
|
||||
Tested-by: Chen-Yu Tsai <wens@csie.org>
|
||||
---
|
||||
board/sunxi/board.c | 20 ++++++--------------
|
||||
include/configs/sunxi-common.h | 36 ++++++++++++++++++++++++++++++------
|
||||
2 files changed, 36 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/board/sunxi/board.c b/board/sunxi/board.c
|
||||
index e1d48140878f..664c7d2d8126 100644
|
||||
--- a/board/sunxi/board.c
|
||||
+++ b/board/sunxi/board.c
|
||||
@@ -492,20 +492,6 @@ int board_mmc_init(bd_t *bis)
|
||||
return -1;
|
||||
#endif
|
||||
|
||||
-#if !defined(CONFIG_SPL_BUILD) && CONFIG_MMC_SUNXI_SLOT_EXTRA == 2
|
||||
- /*
|
||||
- * On systems with an emmc (mmc2), figure out if we are booting from
|
||||
- * the emmc and if we are make it "mmc dev 0" so that boot.scr, etc.
|
||||
- * are searched there first. Note we only do this for u-boot proper,
|
||||
- * not for the SPL, see spl_boot_device().
|
||||
- */
|
||||
- if (readb(SPL_ADDR + 0x28) == SUNXI_BOOTED_FROM_MMC2) {
|
||||
- /* Booting from emmc / mmc2, swap */
|
||||
- mmc0->block_dev.devnum = 1;
|
||||
- mmc1->block_dev.devnum = 0;
|
||||
- }
|
||||
-#endif
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
@@ -725,12 +711,18 @@ int misc_init_r(void)
|
||||
|
||||
setenv("fel_booted", NULL);
|
||||
setenv("fel_scriptaddr", NULL);
|
||||
+ setenv("mmc_bootdev", NULL);
|
||||
|
||||
boot = spl_boot_device();
|
||||
/* determine if we are running in FEL mode */
|
||||
if (boot == BOOT_DEVICE_BOARD) {
|
||||
setenv("fel_booted", "1");
|
||||
parse_spl_header(SPL_ADDR);
|
||||
+ /* or if we booted from MMC, and which one */
|
||||
+ } else if (boot == BOOT_DEVICE_MMC1) {
|
||||
+ setenv("mmc_bootdev", "0");
|
||||
+ } else if (boot == BOOT_DEVICE_MMC2) {
|
||||
+ setenv("mmc_bootdev", "1");
|
||||
}
|
||||
|
||||
setup_environment(gd->fdt_blob);
|
||||
diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h
|
||||
index 07c7ffd7f204..79dc3dddd0cc 100644
|
||||
--- a/include/configs/sunxi-common.h
|
||||
+++ b/include/configs/sunxi-common.h
|
||||
@@ -148,7 +148,13 @@
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ENV_IS_IN_MMC)
|
||||
-#define CONFIG_SYS_MMC_ENV_DEV 0 /* first detected MMC controller */
|
||||
+#if CONFIG_MMC_SUNXI_SLOT_EXTRA != -1
|
||||
+/* If we have two devices (most likely eMMC + MMC), favour the eMMC */
|
||||
+#define CONFIG_SYS_MMC_ENV_DEV 1
|
||||
+#else
|
||||
+/* Otherwise, use the only device we have */
|
||||
+#define CONFIG_SYS_MMC_ENV_DEV 0
|
||||
+#endif
|
||||
#define CONFIG_SYS_MMC_MAX_DEVICE 4
|
||||
#elif defined(CONFIG_ENV_IS_NOWHERE)
|
||||
#define CONFIG_ENV_SIZE (128 << 10)
|
||||
@@ -328,9 +334,15 @@ extern int soft_i2c_gpio_scl;
|
||||
#define CONFIG_FASTBOOT_FLASH
|
||||
|
||||
#ifdef CONFIG_MMC
|
||||
+#if CONFIG_MMC_SUNXI_SLOT_EXTRA != -1
|
||||
+/* If we have two devices (most likely eMMC + MMC), favour the eMMC */
|
||||
+#define CONFIG_FASTBOOT_FLASH_MMC_DEV 1
|
||||
+#else
|
||||
+/* Otherwise, use the only device we have */
|
||||
#define CONFIG_FASTBOOT_FLASH_MMC_DEV 0
|
||||
#endif
|
||||
#endif
|
||||
+#endif
|
||||
|
||||
#ifdef CONFIG_USB_FUNCTION_MASS_STORAGE
|
||||
#endif
|
||||
@@ -405,15 +417,28 @@ extern int soft_i2c_gpio_scl;
|
||||
"ramdisk ram " RAMDISK_ADDR_R " 0x4000000\0"
|
||||
|
||||
#ifdef CONFIG_MMC
|
||||
-#define BOOT_TARGET_DEVICES_MMC(func) func(MMC, mmc, 0)
|
||||
#if CONFIG_MMC_SUNXI_SLOT_EXTRA != -1
|
||||
-#define BOOT_TARGET_DEVICES_MMC_EXTRA(func) func(MMC, mmc, 1)
|
||||
+#define BOOTENV_DEV_MMC_AUTO(devtypeu, devtypel, instance) \
|
||||
+ BOOTENV_DEV_MMC(MMC, mmc, 0) \
|
||||
+ BOOTENV_DEV_MMC(MMC, mmc, 1) \
|
||||
+ "bootcmd_mmc_auto=" \
|
||||
+ "if test ${mmc_bootdev} -eq 1; then " \
|
||||
+ "run bootcmd_mmc1; " \
|
||||
+ "run bootcmd_mmc0; " \
|
||||
+ "elif test ${mmc_bootdev} -eq 0; then " \
|
||||
+ "run bootcmd_mmc0; " \
|
||||
+ "run bootcmd_mmc1; " \
|
||||
+ "fi\0"
|
||||
+
|
||||
+#define BOOTENV_DEV_NAME_MMC_AUTO(devtypeu, devtypel, instance) \
|
||||
+ "mmc_auto "
|
||||
+
|
||||
+#define BOOT_TARGET_DEVICES_MMC(func) func(MMC_AUTO, mmc_auto, na)
|
||||
#else
|
||||
-#define BOOT_TARGET_DEVICES_MMC_EXTRA(func)
|
||||
+#define BOOT_TARGET_DEVICES_MMC(func) func(MMC, mmc, 0)
|
||||
#endif
|
||||
#else
|
||||
#define BOOT_TARGET_DEVICES_MMC(func)
|
||||
-#define BOOT_TARGET_DEVICES_MMC_EXTRA(func)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_AHCI
|
||||
@@ -441,7 +466,6 @@ extern int soft_i2c_gpio_scl;
|
||||
#define BOOT_TARGET_DEVICES(func) \
|
||||
func(FEL, fel, na) \
|
||||
BOOT_TARGET_DEVICES_MMC(func) \
|
||||
- BOOT_TARGET_DEVICES_MMC_EXTRA(func) \
|
||||
BOOT_TARGET_DEVICES_SCSI(func) \
|
||||
BOOT_TARGET_DEVICES_USB(func) \
|
||||
func(PXE, pxe, na) \
|
Loading…
Reference in New Issue
Block a user