[PATCH 7/9] ARM: at91: at91sam9: use SoC detection infrastructure

Alexandre Belloni alexandre.belloni at free-electrons.com
Mon Mar 2 13:12:49 PST 2015


Use the soc detection infrastructure for at91sam9 initialization.

Signed-off-by: Alexandre Belloni <alexandre.belloni at free-electrons.com>
---
 arch/arm/mach-at91/at91sam9.c | 94 +++++++++++++++++++++++++++++++++----------
 arch/arm/mach-at91/soc.h      | 30 ++++++++++++++
 2 files changed, 102 insertions(+), 22 deletions(-)

diff --git a/arch/arm/mach-at91/at91sam9.c b/arch/arm/mach-at91/at91sam9.c
index 56e3ba73ec40..964a8aaebe62 100644
--- a/arch/arm/mach-at91/at91sam9.c
+++ b/arch/arm/mach-at91/at91sam9.c
@@ -7,29 +7,86 @@
  * Licensed under GPLv2 or later.
  */
 
-#include <linux/types.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/gpio.h>
 #include <linux/of.h>
-#include <linux/of_irq.h>
 #include <linux/of_platform.h>
-#include <linux/clk-provider.h>
 
-#include <asm/system_misc.h>
-#include <asm/setup.h>
-#include <asm/irq.h>
 #include <asm/mach/arch.h>
-#include <asm/mach/map.h>
-#include <asm/mach/irq.h>
+#include <asm/system_misc.h>
 
 #include "generic.h"
+#include "soc.h"
 
-static void __init at91sam9_dt_device_init(void)
+static const struct at91_soc sam9_socs[] = {
+	AT91_SOC(AT91SAM9260_CIDR_MATCH, 0,
+		 "AT91SAM9260", "atmel,at91sam9260"),
+	AT91_SOC(AT91SAM9261_CIDR_MATCH, 0,
+		 "AT91SAM9261", "atmel,at91sam9261"),
+	AT91_SOC(AT91SAM9263_CIDR_MATCH, 0,
+		 "AT91SAM9263", "atmel,at91sam9263"),
+	AT91_SOC(AT91SAM9G20_CIDR_MATCH, 0,
+		 "AT91SAM9G20", "atmel,at91sam9g20"),
+	AT91_SOC(AT91SAM9RL64_CIDR_MATCH, 0,
+		 "AT91SAM9RL64", "atmel,at91sam9rl"),
+	AT91_SOC(AT91SAM9G45_CIDR_MATCH, AT91SAM9M11_EXID_MATCH,
+		 "AT91SAM9M11", "atmel,at91sam9g45"),
+	AT91_SOC(AT91SAM9G45_CIDR_MATCH, AT91SAM9M10_EXID_MATCH,
+		 "AT91SAM9M10", "atmel,at91sam9g45"),
+	AT91_SOC(AT91SAM9G45_CIDR_MATCH, AT91SAM9G46_EXID_MATCH,
+		 "AT91SAM9G46", "atmel,at91sam9g45"),
+	AT91_SOC(AT91SAM9G45_CIDR_MATCH, AT91SAM9G45_EXID_MATCH,
+		 "AT91SAM9G45", "atmel,at91sam9g45"),
+	AT91_SOC(AT91SAM9X5_CIDR_MATCH, AT91SAM9G15_EXID_MATCH,
+		"AT91SAM9G15", "atmel,at91sam9x5"),
+	AT91_SOC(AT91SAM9X5_CIDR_MATCH, AT91SAM9G35_EXID_MATCH,
+		"AT91SAM9G35", "atmel,at91sam9x5"),
+	AT91_SOC(AT91SAM9X5_CIDR_MATCH, AT91SAM9X35_EXID_MATCH,
+		"AT91SAM9X35", "atmel,at91sam9x5"),
+	AT91_SOC(AT91SAM9X5_CIDR_MATCH, AT91SAM9G25_EXID_MATCH,
+		"AT91SAM9G25", "atmel,at91sam9x5"),
+	AT91_SOC(AT91SAM9X5_CIDR_MATCH, AT91SAM9X25_EXID_MATCH,
+		"AT91SAM9X25", "atmel,at91sam9x5"),
+	AT91_SOC(AT91SAM9N12_CIDR_MATCH, AT91SAM9CN12_EXID_MATCH,
+		"AT91SAM9CN12", "atmel,at91sam9n12"),
+	AT91_SOC(AT91SAM9N12_CIDR_MATCH, AT91SAM9N12_EXID_MATCH,
+		"AT91SAM9N12", "atmel,at91sam9n12"),
+	AT91_SOC(AT91SAM9N12_CIDR_MATCH, AT91SAM9CN11_EXID_MATCH,
+		"AT91SAM9CN11", "atmel,at91sam9n12"),
+	{ /* sentinel */ },
+};
+
+static const struct at91_soc sam9xe_socs[] = {
+	AT91_SOC(AT91SAM9XE128_EXID_MATCH, 0,
+		 "AT91SAM9XE128", "atmel,at91sam9xe"),
+	AT91_SOC(AT91SAM9XE256_EXID_MATCH, 0,
+		 "AT91SAM9XE256", "atmel,at91sam9xe"),
+	AT91_SOC(AT91SAM9XE512_EXID_MATCH, 0,
+		 "AT91SAM9XE512", "atmel,at91sam9xe"),
+	{ /* sentinel */ },
+};
+
+static const struct at91_soc_family sam9_families[] = {
+	AT91_SOC_FAMILY(ARCH_ID_SAM9, "SAM9", sam9_socs),
+	AT91_SOC_FAMILY(ARCH_ID_SAM9, "SAM9XE", sam9xe_socs),
+	{ /* sentinel */ },
+};
+
+static void __init at91sam9_common_init(void)
 {
-	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
+	struct soc_device *soc;
+	struct device *soc_dev = NULL;
+
+	soc = at91_soc_init(sam9_families);
+	if (soc != NULL)
+		soc_dev = soc_device_to_device(soc);
+
+	of_platform_populate(NULL, of_default_bus_match_table, NULL, soc_dev);
 
 	arm_pm_idle = at91sam9_idle;
+}
+
+static void __init at91sam9_dt_device_init(void)
+{
+	at91sam9_common_init();
 	at91sam9260_pm_init();
 }
 
@@ -40,16 +97,13 @@ static const char *at91_dt_board_compat[] __initconst = {
 
 DT_MACHINE_START(at91sam_dt, "Atmel AT91SAM9")
 	/* Maintainer: Atmel */
-	.map_io		= at91_map_io,
 	.init_machine	= at91sam9_dt_device_init,
 	.dt_compat	= at91_dt_board_compat,
 MACHINE_END
 
 static void __init at91sam9g45_dt_device_init(void)
 {
-	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
-
-	arm_pm_idle = at91sam9_idle;
+	at91sam9_common_init();
 	at91sam9g45_pm_init();
 }
 
@@ -60,16 +114,13 @@ static const char *at91sam9g45_board_compat[] __initconst = {
 
 DT_MACHINE_START(at91sam9g45_dt, "Atmel AT91SAM9G45")
 	/* Maintainer: Atmel */
-	.map_io		= at91_map_io,
 	.init_machine	= at91sam9g45_dt_device_init,
 	.dt_compat	= at91sam9g45_board_compat,
 MACHINE_END
 
 static void __init at91sam9x5_dt_device_init(void)
 {
-	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
-
-	arm_pm_idle = at91sam9_idle;
+	at91sam9_common_init();
 	at91sam9x5_pm_init();
 }
 
@@ -81,7 +132,6 @@ static const char *at91sam9x5_board_compat[] __initconst = {
 
 DT_MACHINE_START(at91sam9x5_dt, "Atmel AT91SAM9")
 	/* Maintainer: Atmel */
-	.map_io		= at91_map_io,
 	.init_machine	= at91sam9x5_dt_device_init,
 	.dt_compat	= at91sam9x5_board_compat,
 MACHINE_END
diff --git a/arch/arm/mach-at91/soc.h b/arch/arm/mach-at91/soc.h
index d32fc81b85b5..e74f75a25750 100644
--- a/arch/arm/mach-at91/soc.h
+++ b/arch/arm/mach-at91/soc.h
@@ -48,4 +48,34 @@ at91_soc_init(const struct at91_soc_family *families);
 #define ARCH_ID_AT91RM9200		0x92
 #define AT91RM9200_CIDR_MATCH		0x09290780
 
+#define ARCH_ID_SAM9			0x19
+#define AT91SAM9260_CIDR_MATCH		0x019803a0
+#define AT91SAM9261_CIDR_MATCH		0x019703a0
+#define AT91SAM9263_CIDR_MATCH		0x019607a0
+#define AT91SAM9G20_CIDR_MATCH		0x019905a0
+#define AT91SAM9RL64_CIDR_MATCH		0x019b03a0
+#define AT91SAM9G45_CIDR_MATCH		0x019b05a0
+#define AT91SAM9X5_CIDR_MATCH		0x019a05a0
+#define AT91SAM9N12_CIDR_MATCH		0x019a07a0
+
+#define AT91SAM9M11_EXID_MATCH		0x00000001
+#define AT91SAM9M10_EXID_MATCH		0x00000002
+#define AT91SAM9G46_EXID_MATCH		0x00000003
+#define AT91SAM9G45_EXID_MATCH		0x00000004
+
+#define AT91SAM9G15_EXID_MATCH		0x00000000
+#define AT91SAM9G35_EXID_MATCH		0x00000001
+#define AT91SAM9X35_EXID_MATCH		0x00000002
+#define AT91SAM9G25_EXID_MATCH		0x00000003
+#define AT91SAM9X25_EXID_MATCH		0x00000004
+
+#define AT91SAM9CN12_EXID_MATCH		0x00000005
+#define AT91SAM9N12_EXID_MATCH		0x00000006
+#define AT91SAM9CN11_EXID_MATCH		0x00000009
+
+#define ARCH_ID_SAM9XE			0x29
+#define AT91SAM9XE128_EXID_MATCH	0x329973a0
+#define AT91SAM9XE256_EXID_MATCH	0x329a93a0
+#define AT91SAM9XE512_EXID_MATCH	0x329aa3a0
+
 #endif /* __AT91_SOC_H */
-- 
2.1.0




More information about the linux-arm-kernel mailing list