arm: K3: am654: Choose MMC boot device based on boot port
authorAndrew F. Davis <afd@ti.com>
Wed, 3 Oct 2018 15:03:22 +0000 (10:03 -0500)
committerTom Rini <trini@konsulko.com>
Wed, 10 Oct 2018 17:35:08 +0000 (13:35 -0400)
For most devices the boot mode maps directly to the boot
device. For MMC this is not the case as we have two MMC
boot modes and two MMC boot devices (ports). Check the
boot port to determine which MMC device was our boot
device. Make this change for both primary and secondary
boot modes.

Signed-off-by: Andrew F. Davis <afd@ti.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
Reviewed-by: Lokesh Vutla <lokeshvutla@ti.com>
arch/arm/mach-k3/am6_init.c
arch/arm/mach-k3/include/mach/am6_hardware.h

index 8a3a99f23a7f621837261ccefe90caff3f63019e..b2388b98ec5461f338b777ec95335d5aa0a4bd69 100644 (file)
@@ -85,7 +85,13 @@ static u32 __get_backup_bootmedia(u32 devstat)
        case BACKUP_BOOT_DEVICE_ETHERNET:
                return BOOT_DEVICE_ETHERNET;
        case BACKUP_BOOT_DEVICE_MMC2:
+       {
+               u32 port = (devstat & CTRLMMR_MAIN_DEVSTAT_BKUP_MMC_PORT_MASK) >>
+                           CTRLMMR_MAIN_DEVSTAT_BKUP_MMC_PORT_SHIFT;
+               if (port == 0x0)
+                       return BOOT_DEVICE_MMC1;
                return BOOT_DEVICE_MMC2;
+       }
        case BACKUP_BOOT_DEVICE_SPI:
                return BOOT_DEVICE_SPI;
        case BACKUP_BOOT_DEVICE_HYPERFLASH:
@@ -99,11 +105,24 @@ static u32 __get_backup_bootmedia(u32 devstat)
 
 static u32 __get_primary_bootmedia(u32 devstat)
 {
-       u32 bootmode = devstat & CTRLMMR_MAIN_DEVSTAT_BOOTMODE_MASK;
+       u32 bootmode = (devstat & CTRLMMR_MAIN_DEVSTAT_BOOTMODE_MASK) >>
+                       CTRLMMR_MAIN_DEVSTAT_BOOTMODE_SHIFT;
 
        if (bootmode == BOOT_DEVICE_OSPI || bootmode == BOOT_DEVICE_QSPI)
                bootmode = BOOT_DEVICE_SPI;
 
+       if (bootmode == BOOT_DEVICE_MMC2) {
+               u32 port = (devstat & CTRLMMR_MAIN_DEVSTAT_MMC_PORT_MASK) >>
+                           CTRLMMR_MAIN_DEVSTAT_MMC_PORT_SHIFT;
+               if (port == 0x0)
+                       bootmode = BOOT_DEVICE_MMC1;
+       } else if (bootmode == BOOT_DEVICE_MMC1) {
+               u32 port = (devstat & CTRLMMR_MAIN_DEVSTAT_EMMC_PORT_MASK) >>
+                           CTRLMMR_MAIN_DEVSTAT_EMMC_PORT_SHIFT;
+               if (port == 0x1)
+                       bootmode = BOOT_DEVICE_MMC2;
+       }
+
        return bootmode;
 }
 
index e4b78f86171191036cbd6b5ba9b3f368c3a9535e..b5244609afafd0f1f0b42fdc2e6535cb6000f334 100644 (file)
 #define CTRLMMR_MAIN_DEVSTAT_BOOTMODE_SHIFT            0
 #define CTRLMMR_MAIN_DEVSTAT_BKUP_BOOTMODE_MASK                GENMASK(6, 4)
 #define CTRLMMR_MAIN_DEVSTAT_BKUP_BOOTMODE_SHIFT       4
+#define CTRLMMR_MAIN_DEVSTAT_MMC_PORT_MASK             GENMASK(12, 12)
+#define CTRLMMR_MAIN_DEVSTAT_MMC_PORT_SHIFT            12
+#define CTRLMMR_MAIN_DEVSTAT_EMMC_PORT_MASK            GENMASK(14, 14)
+#define CTRLMMR_MAIN_DEVSTAT_EMMC_PORT_SHIFT           14
+#define CTRLMMR_MAIN_DEVSTAT_BKUP_MMC_PORT_MASK                GENMASK(17, 17)
+#define CTRLMMR_MAIN_DEVSTAT_BKUP_MMC_PORT_SHIFT       12
 
 #define WKUP_CTRL_MMR0_BASE                            0x43000000
 #define MCU_CTRL_MMR0_BASE                             0x40f00000