From patchwork Mon May 18 06:20:07 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sanchayan X-Patchwork-Id: 6426531 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id B7A939F440 for ; Mon, 18 May 2015 06:26:25 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id CE6A72060B for ; Mon, 18 May 2015 06:26:24 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id CF59D205F7 for ; Mon, 18 May 2015 06:26:23 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1YuESO-0008Lz-5C; Mon, 18 May 2015 06:23:20 +0000 Received: from mail-pa0-x229.google.com ([2607:f8b0:400e:c03::229]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1YuESF-0008Hw-CA for linux-arm-kernel@lists.infradead.org; Mon, 18 May 2015 06:23:12 +0000 Received: by padbw4 with SMTP id bw4so138173172pad.0 for ; Sun, 17 May 2015 23:22:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=rN3YDtf8T4ORQWwzlFilI+fZK9BB1IVB+M8PRTTkdAU=; b=deUiZvoIVcThzN/qe+M4AEIpmOdsR5yFnK35gI2rs/OgoQxK3kqmqdWHYWK7ltFtH6 rru7s/GEOYuh7TkSfSOt8L34bY6rAGuBJ4hSiz6RESa0Z/nbOkb2zio0Ff0xcGbjZ6AT 97Q8s/2D54+7RekbUb4rHDzQ3KW/elOFm8cXLzo+rgSifMu3yURc2Rs+31Zcf9t80d/5 EbUSd3iHXrJEsH0jqqhDX4vEu/4WwdBnnIl63e6zRuWsK5L4Iwz1YvdGlj5ic+v1VXAb efwI+5bn55z7c0NaRsqSTHfaAZkHIxPwG1o2rdQVD0CfEnX4tpCHgXxti4qEcszOX9i3 LNEw== X-Received: by 10.68.65.17 with SMTP id t17mr12280692pbs.9.1431930169376; Sun, 17 May 2015 23:22:49 -0700 (PDT) Received: from localhost ([115.115.225.206]) by mx.google.com with ESMTPSA id c8sm8822234pdj.65.2015.05.17.23.22.47 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 17 May 2015 23:22:48 -0700 (PDT) From: Sanchayan Maity To: shawn.guo@linaro.org Subject: [PATCH v1 2/2] ARM: vf610: Add SoC bus support for Vybrid Date: Mon, 18 May 2015 11:50:07 +0530 Message-Id: <653ed53ef933a6834c4fd3c90ee47e5fb5c78160.1431928866.git.maitysanchayan@gmail.com> X-Mailer: git-send-email 2.4.1 In-Reply-To: References: In-Reply-To: References: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20150517_232311_496262_B5CCD796 X-CRM114-Status: GOOD ( 10.92 ) X-Spam-Score: -0.8 (/) Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, stefan@agner.ch, Sanchayan Maity , kernel@pengutronix.de, linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, T_DKIM_INVALID, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Implements SoC bus support to export SoC specific information. Read the unique SoC ID from the Vybrid On Chip One Time Programmable (OCOTP) controller, SoC specific information from the Miscellaneous System Control Module (MSCM), revision from the ROM revision register and expose it via the SoC bus infrastructure. Sample Output: root@vf:/sys/devices/soc0# cat soc_id df63c12a2e2161d4 root@vf:/sys/devices/soc0# cat family Freescale Vybrid VF500 root@vf:/sys/devices/soc0# cat revision 00000013 root@vf:/sys/devices/soc0# cat machine Freescale Vybrid Signed-off-by: Sanchayan Maity --- arch/arm/mach-imx/mach-vf610.c | 81 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/arch/arm/mach-imx/mach-vf610.c b/arch/arm/mach-imx/mach-vf610.c index 2e7c75b..64c78e4 100644 --- a/arch/arm/mach-imx/mach-vf610.c +++ b/arch/arm/mach-imx/mach-vf610.c @@ -11,6 +11,86 @@ #include #include #include +#include +#include +#include +#include +#include + +#define OCOTP_CFG0_OFFSET 0x00000410 +#define OCOTP_CFG1_OFFSET 0x00000420 +#define MSCM_CPxCOUNT_OFFSET 0x0000002C +#define MSCM_CPxCFG1_OFFSET 0x00000014 +#define ROM_REVISION_OFFSET 0x00000080 + +static void __init vf610_init_machine(void) +{ + struct regmap *ocotp_regmap, *mscm_regmap, *rom_regmap; + struct soc_device_attribute *soc_dev_attr; + struct device *parent = NULL; + struct soc_device *soc_dev; + char soc_type[] = "xx0"; + u32 cpxcount, cpxcfg1; + u32 soc_id1, soc_id2, rom_rev; + u64 soc_id; + + ocotp_regmap = syscon_regmap_lookup_by_compatible("fsl,vf610-ocotp"); + if (IS_ERR(ocotp_regmap)) { + pr_err("regmap lookup for octop failed\n"); + goto out; + } + + mscm_regmap = syscon_regmap_lookup_by_compatible("fsl,vf610-mscm-cpucfg"); + if (IS_ERR(mscm_regmap)) { + pr_err("regmap lookup for mscm failed"); + goto out; + } + + rom_regmap = syscon_regmap_lookup_by_compatible("fsl,vf610-ocrom"); + if (IS_ERR(rom_regmap)) { + pr_err("regmap lookup for ocrom failed"); + goto out; + } + + regmap_read(ocotp_regmap, OCOTP_CFG0_OFFSET, &soc_id1); + regmap_read(ocotp_regmap, OCOTP_CFG1_OFFSET, &soc_id2); + + soc_id = (u64) soc_id1 << 32 | soc_id2; + add_device_randomness(&soc_id, sizeof(soc_id)); + + regmap_read(mscm_regmap, MSCM_CPxCOUNT_OFFSET, &cpxcount); + regmap_read(mscm_regmap, MSCM_CPxCFG1_OFFSET, &cpxcfg1); + + soc_type[0] = cpxcount ? '6' : '5'; /* Dual Core => VF6x0 */ + soc_type[1] = cpxcfg1 ? '1' : '0'; /* L2 Cache => VFx10 */ + + regmap_read(rom_regmap, ROM_REVISION_OFFSET, &rom_rev); + + soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL); + if (!soc_dev_attr) + goto out; + + soc_dev_attr->machine = kasprintf(GFP_KERNEL, "Freescale Vybrid"); + soc_dev_attr->soc_id = kasprintf(GFP_KERNEL, "%016llx", soc_id); + soc_dev_attr->family = kasprintf(GFP_KERNEL, "Freescale Vybrid VF%s", + soc_type); + soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%08x", rom_rev); + + soc_dev = soc_device_register(soc_dev_attr); + if (IS_ERR(soc_dev)) { + kfree(soc_dev_attr->revision); + kfree(soc_dev_attr->family); + kfree(soc_dev_attr->soc_id); + kfree(soc_dev_attr->machine); + kfree(soc_dev_attr); + goto out; + } + + parent = soc_device_to_device(soc_dev); + +out: + of_platform_populate(NULL, of_default_bus_match_table, NULL, parent); +} static const char * const vf610_dt_compat[] __initconst = { "fsl,vf500", @@ -23,5 +103,6 @@ static const char * const vf610_dt_compat[] __initconst = { DT_MACHINE_START(VYBRID_VF610, "Freescale Vybrid VF5xx/VF6xx (Device Tree)") .l2c_aux_val = 0, .l2c_aux_mask = ~0, + .init_machine = vf610_init_machine, .dt_compat = vf610_dt_compat, MACHINE_END