diff options
Diffstat (limited to 'arch/arm/mach-layerscape/boot.c')
-rw-r--r-- | arch/arm/mach-layerscape/boot.c | 60 |
1 files changed, 52 insertions, 8 deletions
diff --git a/arch/arm/mach-layerscape/boot.c b/arch/arm/mach-layerscape/boot.c index c804977d22..4d074205cc 100644 --- a/arch/arm/mach-layerscape/boot.c +++ b/arch/arm/mach-layerscape/boot.c @@ -3,10 +3,12 @@ #include <common.h> #include <init.h> #include <bootsource.h> -#include <mach/layerscape.h> +#include <linux/bitfield.h> +#include <mach/layerscape/layerscape.h> #include <soc/fsl/immap_lsch2.h> +#include <soc/fsl/immap_lsch3.h> -enum bootsource ls1046_bootsource_get(void) +enum bootsource ls1046a_bootsource_get(void) { void __iomem *dcfg = IOMEM(LSCH2_DCFG_ADDR); uint32_t rcw_src; @@ -27,13 +29,55 @@ enum bootsource ls1046_bootsource_get(void) return BOOTSOURCE_UNKNOWN; } -static int ls1046a_bootsource_init(void) +enum bootsource ls1021a_bootsource_get(void) { - if (!of_machine_is_compatible("fsl,ls1046a")) - return 0; + return ls1046a_bootsource_get(); +} + +void ls1021a_bootsource_init(void) +{ + bootsource_set_raw(ls1021a_bootsource_get(), BOOTSOURCE_INSTANCE_UNKNOWN); +} + +void ls1046a_bootsource_init(void) +{ + bootsource_set_raw(ls1046a_bootsource_get(), BOOTSOURCE_INSTANCE_UNKNOWN); +} + +#define PORSR1_RCW_SRC GENMASK(26, 23) + +static enum bootsource ls1028a_bootsource_get(int *instance) +{ + void __iomem *porsr1 = IOMEM(LSCH3_DCFG_BASE); + uint32_t rcw_src; - bootsource_set(ls1046_bootsource_get()); + rcw_src = FIELD_GET(PORSR1_RCW_SRC, readl(porsr1)); + + printf("%s: 0x%08x\n", __func__, rcw_src); + + switch (rcw_src) { + case 8: + *instance = 0; + return BOOTSOURCE_MMC; + case 9: + *instance = 1; + return BOOTSOURCE_MMC; + case 0xa: + return BOOTSOURCE_I2C; + case 0xd: + case 0xc: + return BOOTSOURCE_NAND; + case 0xf: + return BOOTSOURCE_SPI_NOR; + } + + return BOOTSOURCE_UNKNOWN; +} + +void ls1028a_bootsource_init(void) +{ + int instance = BOOTSOURCE_INSTANCE_UNKNOWN; + enum bootsource source = ls1028a_bootsource_get(&instance); - return 0; + bootsource_set_raw(source, instance); } -coredevice_initcall(ls1046a_bootsource_init);
\ No newline at end of file |