Signed-off-by: Andrey Smirnov <andrew.smirnov@xxxxxxxxx> --- arch/arm/mach-imx/boot.c | 93 ++++++++++++++++++++++++++++++++ arch/arm/mach-imx/include/mach/generic.h | 2 + 2 files changed, 95 insertions(+) diff --git a/arch/arm/mach-imx/boot.c b/arch/arm/mach-imx/boot.c index 0398804b0..24e2501e9 100644 --- a/arch/arm/mach-imx/boot.c +++ b/arch/arm/mach-imx/boot.c @@ -26,6 +26,7 @@ #include <mach/imx53-regs.h> #include <mach/imx6-regs.h> #include <mach/imx7-regs.h> +#include <mach/vf610-regs.h> /* [CTRL][TYPE] */ static const enum bootsource locations[4][4] = { @@ -177,6 +178,8 @@ static unsigned int sbmr(uint32_t r, unsigned int msb, unsigned int lsb) } #define BOOT_CFG1(r, n) sbmr(r, n, n) +#define BOOT_CFG2(r, n) BOOT_CFG1(r, (n) + 8) +#define BOOT_CFG4(r, n) BOOT_CFG1(r, (n) + 24) static unsigned int imx53_get_bmod(uint32_t r) { @@ -447,6 +450,95 @@ void imx7_get_boot_source(enum bootsource *src, int *instance) } } +static int vf610_boot_instance_spi(uint32_t r) +{ + return BOOT_CFG1(r, 1); +} + +static int vf610_boot_instance_nor(uint32_t r) +{ + return BOOT_CFG1(r, 3); +} + +/* + * Vybrid's Serial ROM boot sources (BOOT_CFG4[2:0]) are as follows: + * + * 000 - SPI0 + * 001 - SPI1 + * 010 - SPI2 + * 011 - SPI3 + * 100 - I2C0 + * 101 - I2C1 + * 110 - I2C2 + * 111 - I2C3 + * + * Which we can neatly divide in two halves and use MSb to detect if + * bootsource is I2C or SPI EEPROM and 2 LSbs directly as boot + * insance. + */ +static enum bootsource vf610_bootsource_serial_rom(uint32_t r) +{ + return BOOT_CFG4(r, 2) ? BOOTSOURCE_I2C : BOOTSOURCE_SPI_NOR; +} + +static int vf610_boot_instance_serial_rom(uint32_t r) +{ + return __imx6_bootsource_serial_rom(r) & 0b11; +} + +static int vf610_boot_instance_can(uint32_t r) +{ + return BOOT_CFG1(r, 0); +} + +static int vf610_boot_instance_mmc(uint32_t r) +{ + return BOOT_CFG2(r, 3); +} + +void vf610_get_boot_source(enum bootsource *src, int *instance) +{ + void __iomem *src_base = IOMEM(VF610_SRC_BASE_ADDR); + uint32_t sbmr1 = readl(src_base + IMX6_SRC_SBMR1); + uint32_t sbmr2 = readl(src_base + IMX6_SRC_SBMR2); + + if (imx6_bootsource_reserved(sbmr2)) + return; + + if (imx6_bootsource_serial(sbmr2)) { + *src = BOOTSOURCE_SERIAL; + return; + } + + switch (imx53_bootsource_internal(sbmr1)) { + case 0: + *src = BOOTSOURCE_SPI; /* Really: qspi */ + *instance = vf610_boot_instance_spi(sbmr1); + break; + case 1: + *src = BOOTSOURCE_NOR; + *instance = vf610_boot_instance_nor(sbmr1); + break; + case 2: + *src = vf610_bootsource_serial_rom(sbmr1); + *instance = vf610_boot_instance_serial_rom(sbmr1); + break; + case 3: + *src = BOOTSOURCE_CAN; + *instance = vf610_boot_instance_can(sbmr1); + break; + case 6: + case 7: + *src = BOOTSOURCE_MMC; + *instance = vf610_boot_instance_mmc(sbmr1); + break; + default: + if (imx53_bootsource_nand(sbmr1)) + *src = BOOTSOURCE_NAND; + break; + } +} + static void imx_boot_save_loc(void (*get_boot_source)(enum bootsource *, int *)) { @@ -472,3 +564,4 @@ IMX_BOOT_SAVE_LOC(imx51) IMX_BOOT_SAVE_LOC(imx53) IMX_BOOT_SAVE_LOC(imx6) IMX_BOOT_SAVE_LOC(imx7) +IMX_BOOT_SAVE_LOC(vf610) diff --git a/arch/arm/mach-imx/include/mach/generic.h b/arch/arm/mach-imx/include/mach/generic.h index cb5675185..ad9d9cb02 100644 --- a/arch/arm/mach-imx/include/mach/generic.h +++ b/arch/arm/mach-imx/include/mach/generic.h @@ -15,6 +15,7 @@ void imx51_boot_save_loc(void); void imx53_boot_save_loc(void); void imx6_boot_save_loc(void); void imx7_boot_save_loc(void); +void vf610_boot_save_loc(void); void imx25_get_boot_source(enum bootsource *src, int *instance); void imx35_get_boot_source(enum bootsource *src, int *instance); @@ -22,6 +23,7 @@ void imx51_get_boot_source(enum bootsource *src, int *instance); void imx53_get_boot_source(enum bootsource *src, int *instance); void imx6_get_boot_source(enum bootsource *src, int *instance); void imx7_get_boot_source(enum bootsource *src, int *instance); +void vf610_get_boot_source(enum bootsource *src, int *instance); int imx1_init(void); int imx21_init(void); -- 2.14.3 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox