From patchwork Wed Aug 10 13:03:41 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 1053652 Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) by demeter2.kernel.org (8.14.4/8.14.4) with ESMTP id p7AD59mb007604 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 10 Aug 2011 13:05:30 GMT Received: from canuck.infradead.org ([2001:4978:20e::1]) by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1Qr8Sh-00088f-VX; Wed, 10 Aug 2011 13:04:44 +0000 Received: from localhost ([127.0.0.1] helo=canuck.infradead.org) by canuck.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1Qr8Sh-00034B-CK; Wed, 10 Aug 2011 13:04:43 +0000 Received: from mail-ww0-f49.google.com ([74.125.82.49]) by canuck.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1Qr8SN-0002zS-7v for linux-arm-kernel@lists.infradead.org; Wed, 10 Aug 2011 13:04:25 +0000 Received: by wwf10 with SMTP id 10so750348wwf.18 for ; Wed, 10 Aug 2011 06:04:21 -0700 (PDT) Received: by 10.227.29.87 with SMTP id p23mr875757wbc.70.1312981461137; Wed, 10 Aug 2011 06:04:21 -0700 (PDT) Received: from localhost.localdomain (cpc2-aztw13-0-0-cust146.aztw.cable.virginmedia.com [77.99.12.147]) by mx.google.com with ESMTPS id et16sm741790wbb.19.2011.08.10.06.04.20 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 10 Aug 2011 06:04:20 -0700 (PDT) From: Lee Jones To: linux-arm-kernel@lists.infradead.org, arnd@arndb.de Subject: [PATCH 3/4] mach-ux500: export System-on-Chip information ux500 via sysfs Date: Wed, 10 Aug 2011 14:03:41 +0100 Message-Id: <1312981422-13294-3-git-send-email-lee.jones@linaro.org> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1312981422-13294-1-git-send-email-lee.jones@linaro.org> References: <1312981422-13294-1-git-send-email-lee.jones@linaro.org> X-CRM114-Version: 20090807-BlameThorstenAndJenny ( TRE 0.7.6 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20110810_090423_599083_44994729 X-CRM114-Status: GOOD ( 18.96 ) X-Spam-Score: -0.7 (/) X-Spam-Report: SpamAssassin version 3.3.1 on canuck.infradead.org summary: Content analysis details: (-0.7 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at http://www.dnswl.org/, low trust [74.125.82.49 listed in list.dnswl.org] Cc: gregkh@suse.de, lee.jones@linaro.org, linus.walleij@stericsson.com X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: linux-arm-kernel-bounces@lists.infradead.org Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter2.kernel.org [140.211.167.43]); Wed, 10 Aug 2011 13:05:30 +0000 (UTC) Here we make use of the new drivers/base/soc driver to export vital SoC information out to userspace via sysfs. This patch provides a data structure of strings to populate the base nodes found in: /sys/devices/soc/[1|2|3|...]/[family|machine|revision|soc_id]. It also adds one more node as requested by ST-Ericsson. Signed-off-by: Lee Jones --- arch/arm/mach-ux500/Kconfig | 1 + arch/arm/mach-ux500/id.c | 115 ++++++++++++++++++++++++++++++ arch/arm/mach-ux500/include/mach/setup.h | 1 + 3 files changed, 117 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-ux500/Kconfig b/arch/arm/mach-ux500/Kconfig index 4210cb4..4d2f2c2 100644 --- a/arch/arm/mach-ux500/Kconfig +++ b/arch/arm/mach-ux500/Kconfig @@ -26,6 +26,7 @@ config MACH_U8500 bool "U8500 Development platform" depends on UX500_SOC_DB8500 select TPS6105X + select SYS_SOC help Include support for the mop500 development platform. diff --git a/arch/arm/mach-ux500/id.c b/arch/arm/mach-ux500/id.c index d35122e..917d222 100644 --- a/arch/arm/mach-ux500/id.c +++ b/arch/arm/mach-ux500/id.c @@ -2,12 +2,17 @@ * Copyright (C) ST-Ericsson SA 2010 * * Author: Rabin Vincent for ST-Ericsson + * Author: Lee Jones for ST-Ericsson * License terms: GNU General Public License (GPL) version 2 */ #include #include #include +#include +#include +#include +#include #include #include @@ -105,3 +110,113 @@ void __init ux500_map_io(void) ux500_print_soc_info(asicid); } + +#define U8500_BB_UID_BASE (U8500_BACKUPRAM1_BASE + 0xFC0) +#define U8500_BB_UID_LENGTH 5 + +struct device *soc_parent; + +static void ux500_get_machine(char *buf) +{ + sprintf(buf, "DB%4x", dbx500_partnumber()); +} + +static void ux500_get_family(char *buf) +{ + sprintf(buf, "Ux500"); +} + +static void ux500_get_soc_id(char *buf) +{ + void __iomem *uid_base; + int i; + ssize_t sz = 0; + + if (dbx500_partnumber() == 0x8500) { + 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))); + } + return; + } else { + /* Don't know where it is located for U5500 */ + sprintf(buf, "N/A"); + return; + } +} + +static void ux500_get_revision(char *buf) +{ + unsigned int rev = dbx500_revision(); + + if (rev == 0x01) { + sprintf(buf, "%s", "ED"); + return; + } + else if (rev >= 0xA0) { + sprintf(buf, "%d.%d" , (rev >> 4) - 0xA + 1, rev & 0xf); + return; + } + + sprintf(buf, "%s", "Unknown"); +} + +static ssize_t ux500_get_process(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + if (dbx500_id.process == 0x00) + return sprintf(buf, "Standard\n"); + + return sprintf(buf, "%02xnm\n", dbx500_id.process); +} + +static void soc_info_put(struct soc_device *soc_dev) +{ + char buf[1024]; + + ux500_get_machine(buf); + soc_dev->machine = kzalloc(strlen(buf), GFP_KERNEL); + strcpy((char *)soc_dev->machine, buf); + + ux500_get_family(buf); + soc_dev->family = kzalloc(strlen(buf), GFP_KERNEL); + strcpy((char *)soc_dev->family, buf); + + ux500_get_soc_id(buf); + soc_dev->soc_id = kzalloc(strlen(buf), GFP_KERNEL); + strcpy((char *)soc_dev->soc_id, buf); + + ux500_get_revision(buf); + soc_dev->revision = kzalloc(strlen(buf), GFP_KERNEL); + strcpy((char *)soc_dev->revision, buf); +} + +struct device_attribute ux500_soc_attrs[] = { + __ATTR(process, S_IRUGO, ux500_get_process, NULL), + __ATTR_NULL, +}; + +static int __init ux500_soc_sysfs_init(void) +{ + int ret; + int i = 0; + struct soc_device *soc_dev = kzalloc(sizeof(struct soc_device), GFP_KERNEL); + + soc_parent = kzalloc(sizeof(struct device), GFP_KERNEL); + + soc_info_put(soc_dev); + + ret = soc_device_register(soc_parent, soc_dev); + + if (ret >= 0) { + while (ux500_soc_attrs[i].attr.name != NULL) { + ret = device_create_file(soc_parent, &ux500_soc_attrs[i++]); + if (ret) + goto out; + } + } +out: + return ret; +} +postcore_initcall(ux500_soc_sysfs_init); diff --git a/arch/arm/mach-ux500/include/mach/setup.h b/arch/arm/mach-ux500/include/mach/setup.h index a7d363f..a24093f 100644 --- a/arch/arm/mach-ux500/include/mach/setup.h +++ b/arch/arm/mach-ux500/include/mach/setup.h @@ -35,6 +35,7 @@ extern void __init amba_add_devices(struct amba_device *devs[], int num); struct sys_timer; extern struct sys_timer ux500_timer; +extern struct device *soc_parent; #define __IO_DEV_DESC(x, sz) { \ .virtual = IO_ADDRESS(x), \