[PATCH 1/3] at91: add boot mode detection support

Jean-Christophe PLAGNIOL-VILLARD plagnioj at jcrosoft.com
Tue Feb 5 13:02:58 EST 2013


Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/mach-at91/Kconfig                 |    8 ++++
 arch/arm/mach-at91/Makefile                |    2 +
 arch/arm/mach-at91/bootmode.c              |   57 ++++++++++++++++++++++
 arch/arm/mach-at91/include/mach/bootmode.h |   70 ++++++++++++++++++++++++++++
 arch/arm/mach-at91/setup.c                 |    3 ++
 5 files changed, 140 insertions(+)
 create mode 100644 arch/arm/mach-at91/bootmode.c
 create mode 100644 arch/arm/mach-at91/include/mach/bootmode.h

diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index b8528d0..f5c995d 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -9,6 +9,9 @@ config HAVE_AT91_DBGU1
 config HAVE_AT91_LOWLEVEL_INIT
 	bool
 
+config HAVE_AT91_BOOTMODE
+	bool
+
 config AT91SAM9_SMC
 	bool
 
@@ -573,4 +576,9 @@ config AT91_LOAD_BAREBOX_SRAM
 	depends on SHELL_NONE || HAVE_AT91_LOAD_BAREBOX_SRAM
 	default y if SHELL_NONE
 
+config AT91_BOOTMODE
+	bool "at91 bootmode detect and export"
+	depends on HAVE_AT91_BOOTMODE
+	default y
+
 endif
diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
index 53ca570..82b4e86 100644
--- a/arch/arm/mach-at91/Makefile
+++ b/arch/arm/mach-at91/Makefile
@@ -22,6 +22,8 @@ obj-$(CONFIG_AT91SAM9G45_RESET) += at91sam9g45_reset.o
 obj-$(CONFIG_AT91SAM9_SMC) += sam9_smc.o
 obj-$(CONFIG_AT91SAM9_TIMER) += at91sam926x_time.o
 
+obj-$(CONFIG_AT91_BOOTMODE) += bootmode.o
+
 # CPU-specific support
 obj-$(CONFIG_ARCH_AT91RM9200)	+= at91rm9200.o at91rm9200_time.o at91rm9200_devices.o
 obj-$(CONFIG_ARCH_AT91SAM9260) += at91sam9260.o at91sam9260_devices.o
diff --git a/arch/arm/mach-at91/bootmode.c b/arch/arm/mach-at91/bootmode.c
new file mode 100644
index 0000000..c731da9
--- /dev/null
+++ b/arch/arm/mach-at91/bootmode.c
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2013 Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
+ *
+ * GPLv2 only
+ */
+
+#include <common.h>
+#include <mach/bootmode.h>
+
+struct at91_boot_mode at91_soc_boot_mode;
+
+static const char *soc_boot_from[] = {
+	[AT91_BOOT_FROM_SPI]		= "spi",
+	[AT91_BOOT_FROM_MCI]		= "mci",
+	[AT91_BOOT_FROM_SMC]		= "smc",
+	[AT91_BOOT_FROM_TWD]		= "twd",
+	[AT91_BOOT_FROM_UNKNOWN]	= "Unknown"
+};
+
+static const char *soc_boot_media[] = {
+	[AT91_BOOT_MEDIA_SD]		= "SD",
+	[AT91_BOOT_MEDIA_MMC]		= "MMC",
+	[AT91_BOOT_MEDIA_EMMC]		= "eMMC",
+	[AT91_BOOT_MEDIA_AT45]		= "at45",
+	[AT91_BOOT_MEDIA_AT25]		= "at25",
+	[AT91_BOOT_MEDIA_NAND]		= "NAND",
+	[AT91_BOOT_MEDIA_NOR]		= "NOR",
+	[AT91_BOOT_MEDIA_UNKNOWN]	= "Unknown"
+};
+
+void at91_bootmode_device_register(void)
+{
+	struct device_d *dev;
+	const char *name;
+	char str[16];
+
+	dev = add_generic_device_res("bootloc", DEVICE_ID_SINGLE, NULL, 0, NULL);
+
+	if (at91_soc_boot_mode.from > ARRAY_SIZE(soc_boot_from))
+		name = soc_boot_from[AT91_BOOT_FROM_UNKNOWN];
+	else
+		name = soc_boot_from[at91_soc_boot_mode.from];
+
+	dev_add_param_fixed(dev, "from", (char*)name);
+
+	if (at91_soc_boot_mode.media > ARRAY_SIZE(soc_boot_media))
+		name = soc_boot_media[AT91_BOOT_MEDIA_UNKNOWN];
+	else
+		name = soc_boot_media[at91_soc_boot_mode.media];
+
+	dev_add_param_fixed(dev, "media", (char*)name);
+	sprintf(str, "%d", at91_soc_boot_mode.interface);
+	dev_add_param_fixed(dev, "interface", str);
+	sprintf(str, "%d", at91_soc_boot_mode.cs);
+	dev_add_param_fixed(dev, "cs", str);
+
+}
diff --git a/arch/arm/mach-at91/include/mach/bootmode.h b/arch/arm/mach-at91/include/mach/bootmode.h
new file mode 100644
index 0000000..eb2f948
--- /dev/null
+++ b/arch/arm/mach-at91/include/mach/bootmode.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2013 Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
+ *
+ * GPLv2 only
+ */
+
+#ifndef __BOOTMODE_H__
+#define __BOOTMODE_H__
+
+extern struct at91_boot_mode at91_soc_boot_mode;
+
+struct at91_boot_mode {
+	u16 from;
+	u16 interface;
+	u16 media;
+	u16 cs;
+};
+
+enum at91_soc_boot_from {
+	AT91_BOOT_FROM_UNKNOWN,
+	AT91_BOOT_FROM_SPI,
+	AT91_BOOT_FROM_MCI,
+	AT91_BOOT_FROM_SMC,
+	AT91_BOOT_FROM_TWD,
+};
+
+enum at91_soc_boot_media {
+	AT91_BOOT_MEDIA_UNKNOWN,
+	AT91_BOOT_MEDIA_SD,
+	AT91_BOOT_MEDIA_MMC,
+	AT91_BOOT_MEDIA_EMMC,
+	AT91_BOOT_MEDIA_AT45,
+	AT91_BOOT_MEDIA_AT25,
+	AT91_BOOT_MEDIA_NAND,
+	AT91_BOOT_MEDIA_NOR,
+};
+
+#ifdef CONFIG_AT91_BOOTMODE
+void at91_bootmode_device_register(void);
+
+#define at91_boot_from_spi()	(at91_soc_boot_mode.from == AT91_BOOT_FROM_SPI)
+#define at91_boot_from_mci()	(at91_soc_boot_mode.from == AT91_BOOT_FROM_MCI)
+#define at91_boot_from_smc()	(at91_soc_boot_mode.from == AT91_BOOT_FROM_SMC)
+#define at91_boot_from_twd()	(at91_soc_boot_mode.from == AT91_BOOT_FROM_TWD)
+
+#define at91_boot_media_sd()	(at91_soc_boot_mode.media == AT91_BOOT_MEDIA_SD)
+#define at91_boot_media_mmc()	(at91_soc_boot_mode.media == AT91_BOOT_MEDIA_MMC)
+#define at91_boot_media_emmc()	(at91_soc_boot_mode.media == AT91_BOOT_MEDIA_EMMC)
+#define at91_boot_media_at45()	(at91_soc_boot_mode.media == AT91_BOOT_MEDIA_AT45)
+#define at91_boot_media_at25()	(at91_soc_boot_mode.media == AT91_BOOT_MEDIA_AT25)
+#define at91_boot_media_nand()	(at91_soc_boot_mode.media == AT91_BOOT_MEDIA_NAND)
+#define at91_boot_media_nor()	(at91_soc_boot_mode.media == AT91_BOOT_MEDIA_NOR)
+#else
+static void inline void at91_bootmode_device_register(void) {}
+
+#define at91_boot_from_spi()	(0)
+#define at91_boot_from_mci()	(0)
+#define at91_boot_from_smc()	(0)
+#define at91_boot_from_twd()	(0)
+
+#define at91_boot_media_sd()	(0)
+#define at91_boot_media_mmc()	(0)
+#define at91_boot_media_emmc()	(0)
+#define at91_boot_media_at45()	(0)
+#define at91_boot_media_at25()	(0)
+#define at91_boot_media_nand()	(0)
+#define at91_boot_media_nor()	(0)
+#endif
+
+#endif /* __BOOTMODE_H__ */
diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c
index 0444a5f..d5dc943 100644
--- a/arch/arm/mach-at91/setup.c
+++ b/arch/arm/mach-at91/setup.c
@@ -12,6 +12,7 @@
 #include <mach/hardware.h>
 #include <mach/cpu.h>
 #include <mach/at91_dbgu.h>
+#include <mach/bootmode.h>
 
 #include "soc.h"
 
@@ -248,6 +249,8 @@ static int at91_soc_device(void)
 	dev_add_param_fixed(dev, "name", (char*)at91_get_soc_type(&at91_soc_initdata));
 	dev_add_param_fixed(dev, "subname", (char*)at91_get_soc_subtype(&at91_soc_initdata));
 
+	at91_bootmode_device_register();
+
 	return 0;
 }
 coredevice_initcall(at91_soc_device);
-- 
1.7.10.4




More information about the barebox mailing list