diff options
| author | Philippe Langlais <philippe.langlais@linaro.org> | 2011-05-05 09:41:38 +0200 |
|---|---|---|
| committer | Ulf Hansson <ulf.hansson@stericsson.com> | 2011-09-19 15:14:56 +0200 |
| commit | 6fcd03700490bfbda5d2dccedfae3b63c423ce55 (patch) | |
| tree | e012fcb79f06cfd410741bf121ad7279303d7b53 | |
| parent | 2dfd24846ee129fb59fe640ec6e3e1f401d69a67 (diff) | |
ux500: Export U8500 SoC info through sysfs
ST-Ericsson's U8500 implementation.
Register sysfs SoC interface, and exports:
- Machine name
- Family name
- SoC ID
- Silicon process
- Silicon revision number.
ST-Ericsson ID: ER320976
Signed-off-by: Maxime COQUELIN <maxime.coquelin-nonst@stericsson.com>
Change-Id: I6fe672b2e096ee4e6bf37dfe83594f6672fa0079
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/18179
Reviewed-by: Linus WALLEIJ <linus.walleij@stericsson.com>
Signed-off-by: Philippe Langlais <philippe.langlais@linaro.org>
| -rw-r--r-- | arch/arm/mach-ux500/Kconfig | 1 | ||||
| -rw-r--r-- | arch/arm/mach-ux500/cpu-db8500.c | 67 |
2 files changed, 68 insertions, 0 deletions
diff --git a/arch/arm/mach-ux500/Kconfig b/arch/arm/mach-ux500/Kconfig index 3c4720eaf47..b8308f5c35d 100644 --- a/arch/arm/mach-ux500/Kconfig +++ b/arch/arm/mach-ux500/Kconfig @@ -7,6 +7,7 @@ config UX500_SOC_COMMON select HAS_MTU select NOMADIK_GPIO select ARM_ERRATA_753970 + select SYS_SOC menu "Ux500 SoC" diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index 41d0be21d2f..3b125a76091 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c @@ -18,6 +18,7 @@ #include <linux/platform_device.h> #include <linux/io.h> #include <linux/regulator/machine.h> +#include <linux/sys_soc.h> #include <asm/mach/map.h> #include <asm/pmu.h> @@ -402,3 +403,69 @@ void __init u8500_init_devices(void) return ; } + +#ifdef CONFIG_SYS_SOC +#define U8500_BB_UID_BASE (U8500_BACKUPRAM1_BASE + 0xFC0) +#define U8500_BB_UID_LENGTH 5 + +static ssize_t ux500_get_machine(char *buf, struct sysfs_soc_info *si) +{ + return sprintf(buf, "DB%2x00\n", dbx500_id.partnumber); +} + +static ssize_t ux500_get_soc_id(char *buf, struct sysfs_soc_info *si) +{ + void __iomem *uid_base; + int i; + ssize_t sz = 0; + + if (dbx500_id.partnumber == 0x85) { + uid_base = __io_address(U8500_BB_UID_BASE); + for (i = 0; i < U8500_BB_UID_LENGTH; i++) + sz += sprintf(buf + sz, "%08x", readl(uid_base + i * sizeof(u32))); + sz += sprintf(buf + sz, "\n"); + } + else { + /* Don't know where it is located for U5500 */ + sz = sprintf(buf, "N/A\n"); + } + + return sz; +} + +static ssize_t ux500_get_revision(char *buf, struct sysfs_soc_info *si) +{ + unsigned int rev = dbx500_id.revision; + + if (rev == 0x01) + return sprintf(buf, "%s\n", "ED"); + else if (rev >= 0xA0) + return sprintf(buf, "%d.%d\n" , (rev >> 4) - 0xA + 1, rev & 0xf); + + return sprintf(buf, "%s", "Unknown\n"); +} + +static ssize_t ux500_get_process(char *buf, struct sysfs_soc_info *si) +{ + if (dbx500_id.process == 0x00) + return sprintf(buf, "Standard\n"); + + return sprintf(buf, "%02xnm\n", dbx500_id.process); +} + +static struct sysfs_soc_info soc_info[] = { + SYSFS_SOC_ATTR_CALLBACK("machine", ux500_get_machine), + SYSFS_SOC_ATTR_VALUE("family", "Ux500"), + SYSFS_SOC_ATTR_CALLBACK("soc_id", ux500_get_soc_id), + SYSFS_SOC_ATTR_CALLBACK("revision", ux500_get_revision), + SYSFS_SOC_ATTR_CALLBACK("process", ux500_get_process), +}; + +static int __init ux500_sys_soc_init(void) +{ + return register_sysfs_soc(soc_info, ARRAY_SIZE(soc_info)); +} + +module_init(ux500_sys_soc_init); +#endif + |
