From patchwork Thu Sep 1 12:27:21 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 3839 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id 6B02523F41 for ; Thu, 1 Sep 2011 12:27:46 +0000 (UTC) Received: from mail-fx0-f52.google.com (mail-fx0-f52.google.com [209.85.161.52]) by fiordland.canonical.com (Postfix) with ESMTP id 5EDB8A18637 for ; Thu, 1 Sep 2011 12:27:46 +0000 (UTC) Received: by mail-fx0-f52.google.com with SMTP id 18so912369fxd.11 for ; Thu, 01 Sep 2011 05:27:46 -0700 (PDT) Received: by 10.223.76.201 with SMTP id d9mr218134fak.119.1314880066231; Thu, 01 Sep 2011 05:27:46 -0700 (PDT) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.152.11.8 with SMTP id m8cs50605lab; Thu, 1 Sep 2011 05:27:46 -0700 (PDT) Received: by 10.216.229.83 with SMTP id g61mr192962weq.39.1314880065577; Thu, 01 Sep 2011 05:27:45 -0700 (PDT) Received: from mail-ww0-f50.google.com (mail-ww0-f50.google.com [74.125.82.50]) by mx.google.com with ESMTPS id n55si1273537wed.40.2011.09.01.05.27.45 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 01 Sep 2011 05:27:45 -0700 (PDT) Received-SPF: neutral (google.com: 74.125.82.50 is neither permitted nor denied by best guess record for domain of lee.jones@linaro.org) client-ip=74.125.82.50; Authentication-Results: mx.google.com; spf=neutral (google.com: 74.125.82.50 is neither permitted nor denied by best guess record for domain of lee.jones@linaro.org) smtp.mail=lee.jones@linaro.org Received: by mail-ww0-f50.google.com with SMTP id 36so1877121wwi.31 for ; Thu, 01 Sep 2011 05:27:45 -0700 (PDT) Received: by 10.216.229.149 with SMTP id h21mr170384weq.47.1314880064028; Thu, 01 Sep 2011 05:27:44 -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 r57sm355985weq.12.2011.09.01.05.27.41 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 01 Sep 2011 05:27:42 -0700 (PDT) From: Lee Jones To: linux-arm-kernel@lists.infradead.org Cc: linus.walleij@stericsson.com, arnd@arndb.de, jamie@jamieiles.com, gregkh@suse.de, Lee Jones Subject: [PATCH 3/5] mach-ux500: export System-on-Chip information ux500 via sysfs Date: Thu, 1 Sep 2011 13:27:21 +0100 Message-Id: <1314880043-22517-3-git-send-email-lee.jones@linaro.org> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1314880043-22517-1-git-send-email-lee.jones@linaro.org> References: <1314880043-22517-1-git-send-email-lee.jones@linaro.org> 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. 'process' depicts the way in which the silicon was manufactured. Signed-off-by: Lee Jones --- arch/arm/mach-ux500/Kconfig | 1 + arch/arm/mach-ux500/id.c | 77 ++++++++++++++++++++++++++++++ arch/arm/mach-ux500/include/mach/setup.h | 1 + 3 files changed, 79 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-ux500/Kconfig b/arch/arm/mach-ux500/Kconfig index 86188b2..fa70f65 100644 --- a/arch/arm/mach-ux500/Kconfig +++ b/arch/arm/mach-ux500/Kconfig @@ -27,6 +27,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..8fd53c7 100644 --- a/arch/arm/mach-ux500/id.c +++ b/arch/arm/mach-ux500/id.c @@ -2,12 +2,16 @@ * 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 @@ -105,3 +109,76 @@ void __init ux500_map_io(void) ux500_print_soc_info(asicid); } + +struct soc_device *soc_dev; + +static const char *ux500_get_machine(void) +{ + return kasprintf(GFP_KERNEL, "DB%4x", dbx500_partnumber()); +} + +static const char *ux500_get_family(void) +{ + return kasprintf(GFP_KERNEL, "Ux500"); +} + +static const char *ux500_get_revision(void) +{ + unsigned int rev = dbx500_revision(); + + if (rev == 0x01) { + return kasprintf(GFP_KERNEL, "%s", "ED"); + } + else if (rev >= 0xA0) { + return kasprintf(GFP_KERNEL, "%d.%d" , (rev >> 4) - 0xA + 1, rev & 0xf); + } + + return kasprintf(GFP_KERNEL, "%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_populate(struct soc_device *soc_dev) +{ + soc_dev->machine = ux500_get_machine(); + soc_dev->family = ux500_get_family(); + soc_dev->revision = ux500_get_revision(); +} + +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; + + soc_dev = kzalloc(sizeof(*soc_dev), GFP_KERNEL); + if (soc_dev == NULL) + return -ENOMEM; + + soc_info_populate(soc_dev); + + ret = soc_device_register(&soc_dev->dev); + + if (ret >= 0) { + while (ux500_soc_attrs[i].attr.name != NULL) { + ret = device_create_file(&soc_dev->dev, &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..7d4c35f 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 soc_device *soc_dev; #define __IO_DEV_DESC(x, sz) { \ .virtual = IO_ADDRESS(x), \