summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>2014-02-24 10:03:18 +0100
committerUwe Kleine-König <u.kleine-koenig@pengutronix.de>2014-10-05 10:29:42 +0200
commit1a6b4ead0b34c733e2b436444328e121388806a3 (patch)
tree58d72846f2dc02c3586d51df2ad0a7b6f6e8d2f8
parent8d0977811d6741b8600886736712387aa8c434a9 (diff)
downloadlinux-1a6b4ead0b34c733e2b436444328e121388806a3.tar.gz
linux-1a6b4ead0b34c733e2b436444328e121388806a3.tar.xz
wip: soc_bus
-rw-r--r--arch/arm/Kconfig1
-rw-r--r--arch/arm/mach-efm32/common.c27
-rw-r--r--arch/arm/mach-efm32/common.h1
-rw-r--r--arch/arm/mach-efm32/dtmachine.c1
4 files changed, 30 insertions, 0 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 9ecd48a870dc..6022b5e24abe 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -426,6 +426,7 @@ config ARCH_EFM32
select NO_DMA
select NO_IOPORT_MAP
select PINCTRL
+ select SOC_BUS
select SPARSE_IRQ
select USE_OF
help
diff --git a/arch/arm/mach-efm32/common.c b/arch/arm/mach-efm32/common.c
index bffc28ec9ba7..17fc0ecab77d 100644
--- a/arch/arm/mach-efm32/common.c
+++ b/arch/arm/mach-efm32/common.c
@@ -8,6 +8,7 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/bug.h>
+#include <linux/sys_soc.h>
#include <asm/io.h>
#include <asm/barrier.h>
@@ -93,6 +94,32 @@ static const char *__init efm32_get_rev(void)
return revbuf;
}
+static struct efm32_soc_device_data {
+ struct soc_device_attribute soc_dev_attr;
+ char machine[40];
+ char revision[40];
+} sddata;
+
+void __init efm32_register_soc_device(void)
+{
+ u8 family = __raw_readb(PART_FAMILY);
+ u16 flashsize = __raw_readw(MEM_INFO_FLASH);
+ u16 partno = __raw_readw(PART_NUMBER);
+ u8 prodrev = __raw_readb(PROD_REV);
+
+ snprintf(sddata.machine, sizeof(sddata.machine), "EFM32%s%hdF%hd ",
+ efm32_get_familyabbrev(family), partno, flashsize);
+ snprintf(sddata.revision, sizeof(sddata.revision),
+ "rev %s, prodrev %hhd",
+ efm32_get_rev(), prodrev);
+
+ sddata.soc_dev_attr.machine = sddata.machine;
+ sddata.soc_dev_attr.family = efm32_get_familyname(family);
+ sddata.soc_dev_attr.revision = sddata.revision;
+
+ soc_device_register(&sddata.soc_dev_attr);
+}
+
void __init efm32_print_cpuinfo(void)
{
u16 partno = __raw_readw(PART_NUMBER);
diff --git a/arch/arm/mach-efm32/common.h b/arch/arm/mach-efm32/common.h
index dd8f865e55c7..5e71e5da89b6 100644
--- a/arch/arm/mach-efm32/common.h
+++ b/arch/arm/mach-efm32/common.h
@@ -1,3 +1,4 @@
void efm32_print_cpuinfo(void);
+void efm32_register_soc_device(void);
void efm32_print_reset_cause(void);
diff --git a/arch/arm/mach-efm32/dtmachine.c b/arch/arm/mach-efm32/dtmachine.c
index 8fa5d56fa9e9..4aef16867607 100644
--- a/arch/arm/mach-efm32/dtmachine.c
+++ b/arch/arm/mach-efm32/dtmachine.c
@@ -12,6 +12,7 @@ static void __init efm32_init(void)
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
efm32_print_reset_cause();
+ efm32_register_soc_device();
efm32_print_cpuinfo();
}