From patchwork Mon May 30 13:14:38 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 102299 Delivered-To: patch@linaro.org Received: by 10.140.92.199 with SMTP id b65csp1401293qge; Mon, 30 May 2016 06:15:10 -0700 (PDT) X-Received: by 10.98.157.4 with SMTP id i4mr46583291pfd.31.1464614110379; Mon, 30 May 2016 06:15:10 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id dt12si50604251pac.0.2016.05.30.06.15.10; Mon, 30 May 2016 06:15:10 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161218AbcE3NPI (ORCPT + 7 others); Mon, 30 May 2016 09:15:08 -0400 Received: from mout.kundenserver.de ([212.227.126.135]:52525 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1161029AbcE3NPG (ORCPT ); Mon, 30 May 2016 09:15:06 -0400 Received: from wuerfel.localnet ([78.42.132.4]) by mrelayeu.kundenserver.de (mreue004) with ESMTPSA (Nemesis) id 0MBX6o-1bFaDN2Nmw-00AVWw; Mon, 30 May 2016 15:14:15 +0200 From: Arnd Bergmann To: linuxppc-dev@lists.ozlabs.org Cc: Ulf Hansson , Yangbo Lu , Mark Rutland , Xiaobo Xie , "linux-i2c@vger.kernel.org" , "linux-clk@vger.kernel.org" , Qiang Zhao , Russell King , Bhupesh Sharma , Joerg Roedel , Claudiu Manoil , "devicetree@vger.kernel.org" , Scott Wood , Rob Herring , Santosh Shilimkar , "linux-arm-kernel@lists.infradead.org" , "netdev@vger.kernel.org" , "linux-mmc@vger.kernel.org" , "linux-kernel@vger.kernel.org" , Yang-Leo Li , "iommu@lists.linux-foundation.org" , Kumar Gala Subject: [PATCH 1/4] base: soc: introduce soc_device_match() interface Date: Mon, 30 May 2016 15:14:38 +0200 Message-ID: <6032641.cjSseEG2PF@wuerfel> User-Agent: KMail/5.1.3 (Linux/4.4.0-22-generic; KDE/5.18.0; x86_64; ; ) In-Reply-To: References: <1462417950-46796-1-git-send-email-yangbo.lu@nxp.com> MIME-Version: 1.0 X-Provags-ID: V03:K0:2E+uOftq+6fhB1Tyjx3blNc854FT6HNPJZ4xsfb8XRJQPSf4lhg nK49rIHT8cbzoOIrIE1mj4cPTSkc6OYIo2s9K1uRB7U8PrMwo4qmOGqGEcJ3Zb0MJ0n0eAt Ll4h20jfsIJNVpvGEd7QP5lisvHEZHJVA5xlfTGWE+/MjmQGGL+sOhw6rVEWKywoPjz6BqV 3gXagtXOPXCN+kGGtEy0g== X-UI-Out-Filterresults: notjunk:1; V01:K0:I+zZTlPqcyc=:Px/sdwmaCHQ7uU8nxKXJCb wjxjH0Eg7jx26QPJNXbFt173aAbU2CnoC0fuXIvAq/fJbY6+kZfZtmygG6itBottTkmlnORIn iXqHTy/Rg3WLh9hgrsNs5Bua/OdjlcseBHM4ku5Je5RYNGzZNzedkk8J+pXJGnCXImH/jZUjg YJTlwBbRerQFYqrJh+5lAJQrGBnGANXnNcvdKmRZF0sQAgHn1iTpBi9gdVlbzlnDrCgJlxT9k FRwG3s0QBnShO7t7uErzS4EEOxBLdsOW1gYb69+rgrCd3Cge/cvC6FQ69/ECZa/DYyQ22smcB fV1npXu9tPOYee5PW64uUgF/BHVLQ5B77PlegUilfPKDhBoZwiV3GmNTaGWnJVerAEEMXqK2t fZrWrOhvOuQ4PmmTORSU1g8pAQsemauB8dkqQNWjpWSJd2KssGe+qirjHeN90l4di+iNVwcpl e4VeltuRUlaWMgU1PWUjiyi9Mt9NvpjD1Y9idua9Fa8dzslXrv1JbmewrLvou5INDF/zcsmAH anW2NZhebp2Waf8EBGruxpIwelEgsK4cqP/1GkkKk9CDgOs4K6Uk52Zx4W2eYA2lHmKEVzWEH X2IDwI8490zs2kv8Vf7JnkhxcUvFlEe087eeJKVzAQHLWgpdpvDojudh+OMMpvnX++XwZVjhU 2OyHmFsHciy7PfePLa1TSjVxmKsIAD9nEV5ZdMAZ2F+HovKbToOCrrX4egxzyDE/NKuupducf MF62o+esdO68xkYnbivAvVbEuAjhZ7KiaquVsg== Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org We keep running into cases where device drivers want to know the exact version of the SoC a they are currently running on. In the past, this has usually been done through a vendor specific API that can be called by a driver, or by directly accessing some kind of version register that is not part of the device itself but that belongs to a global register area of the chip. Common reasons for doing this include: - A machine is not using devicetree or similar for passing data about on-chip devices, but just announces their presence using boot-time platform devices, and the machine code itself does not care about the revision. - There is existing firmware or boot loaders with existing DT binaries with generic compatible strings that do not identify the particular revision of each device, but the driver knows which SoC revisions include which part - A prerelease version of a chip has some quirks and we are using the same version of the bootloader and the DT blob on both the prerelease and the final version. An update of the DT binding seems inappropriate because that would involve maintaining multiple copies of the dts and/or bootloader. This introduces the soc_device_match() interface that is meant to work like of_match_node() but instead of identifying the version of a device, it identifies the SoC itself using a vendor-agnostic interface. Unlike soc_device_match(), we do not do an exact string compare but instead use glob_match() to allow wildcards in strings. Signed-off-by: Arnd Bergmann -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig index 246acdafedb6..fc7613cc7fd5 100644 --- a/drivers/base/Kconfig +++ b/drivers/base/Kconfig @@ -225,6 +225,7 @@ config GENERIC_CPU_AUTOPROBE config SOC_BUS bool + select GLOB source "drivers/base/regmap/Kconfig" diff --git a/drivers/base/soc.c b/drivers/base/soc.c index 75b98aad6faf..e9623c6674a5 100644 --- a/drivers/base/soc.c +++ b/drivers/base/soc.c @@ -14,6 +14,7 @@ #include #include #include +#include static DEFINE_IDA(soc_ida); @@ -168,3 +169,60 @@ static void __exit soc_bus_unregister(void) bus_unregister(&soc_bus_type); } module_exit(soc_bus_unregister); + +static int soc_device_match_one(struct device *dev, void *arg) +{ + struct soc_device *soc_dev = container_of(dev, struct soc_device, dev); + struct soc_device_attribute *match = arg; + + if (match->machine && !glob_match(match->machine, soc_dev->attr->machine)) + return 0; + + if (match->family && !glob_match(match->family, soc_dev->attr->family)) + return 0; + + if (match->revision && !glob_match(match->revision, soc_dev->attr->revision)) + return 0; + + if (match->soc_id && !glob_match(match->soc_id, soc_dev->attr->revision)) + return 0; + + return 1; +} + +/* + * soc_device_match - identify the SoC in the machine + * @matches: zero-terminated array of possible matches + * + * returns the first matching entry of the argument array, or NULL + * if none of them match. + * + * This function is meant as a helper in place of of_match_node() + * in cases where either no device tree is available or the information + * in a device node is insufficient to identify a particular variant + * by its compatible strings or other properties. For new devices, + * the DT binding should always provide unique compatible strings + * that allow the use of of_match_node() instead. + * + * The calling function can use the .data entry of the + * soc_device_attribute to pass a structure or function pointer for + * each entry. + */ +struct soc_device_attribute *soc_device_match(struct soc_device_attribute *matches) +{ + struct device *dev; + int ret; + + for (ret = 0; ret == 0; matches++) { + if (matches->machine || matches->family || + matches->revision || matches->soc_id) + return NULL; + + dev = NULL; + ret = bus_for_each_dev(&soc_bus_type, dev, matches, + soc_device_match_one); + } + + return matches; +} +EXPORT_SYMBOL_GPL(soc_device_match); diff --git a/include/linux/sys_soc.h b/include/linux/sys_soc.h index 2739ccb69571..02c48c76052b 100644 --- a/include/linux/sys_soc.h +++ b/include/linux/sys_soc.h @@ -13,6 +13,8 @@ struct soc_device_attribute { const char *family; const char *revision; const char *soc_id; + + const void *data; }; /** @@ -34,4 +36,6 @@ void soc_device_unregister(struct soc_device *soc_dev); */ struct device *soc_device_to_device(struct soc_device *soc); +struct soc_device_attribute *soc_device_match(struct soc_device_attribute *matches); + #endif /* __SOC_BUS_H */ From patchwork Mon May 30 13:16:03 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 102297 Delivered-To: patch@linaro.org Received: by 10.140.92.199 with SMTP id b65csp1401938qge; Mon, 30 May 2016 06:16:27 -0700 (PDT) X-Received: by 10.98.193.5 with SMTP id i5mr21059768pfg.64.1464614187410; Mon, 30 May 2016 06:16:27 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k4si843568paz.154.2016.05.30.06.16.27; Mon, 30 May 2016 06:16:27 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161219AbcE3NQ0 (ORCPT + 7 others); Mon, 30 May 2016 09:16:26 -0400 Received: from mout.kundenserver.de ([212.227.126.187]:60417 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1161029AbcE3NQY (ORCPT ); Mon, 30 May 2016 09:16:24 -0400 Received: from wuerfel.localnet ([78.42.132.4]) by mrelayeu.kundenserver.de (mreue001) with ESMTPSA (Nemesis) id 0LmzUL-1bi3Eb1ZwD-00hOB6; Mon, 30 May 2016 15:15:36 +0200 From: Arnd Bergmann To: linuxppc-dev@lists.ozlabs.org Cc: Ulf Hansson , Yangbo Lu , Mark Rutland , Xiaobo Xie , "linux-i2c@vger.kernel.org" , "linux-clk@vger.kernel.org" , Qiang Zhao , Russell King , Bhupesh Sharma , Joerg Roedel , Claudiu Manoil , "devicetree@vger.kernel.org" , Scott Wood , Rob Herring , Santosh Shilimkar , "linux-arm-kernel@lists.infradead.org" , "netdev@vger.kernel.org" , "linux-mmc@vger.kernel.org" , "linux-kernel@vger.kernel.org" , Yang-Leo Li , "iommu@lists.linux-foundation.org" , Kumar Gala Subject: [PATCH 3/4] mmc: sdhci-of-esdhc: fix host version for T4240-R1.0-R2.0 Date: Mon, 30 May 2016 15:16:03 +0200 Message-ID: <6110875.0k1HlSKhzn@wuerfel> User-Agent: KMail/5.1.3 (Linux/4.4.0-22-generic; KDE/5.18.0; x86_64; ; ) In-Reply-To: References: <1462417950-46796-1-git-send-email-yangbo.lu@nxp.com> MIME-Version: 1.0 X-Provags-ID: V03:K0:sSiyHKvfn8OwkNlghWrokZW42k2h0Yyu+sg0gfOE10VgcfCBFXY 24FzNW/9etvYaUjKcIqIN91KBtsI4pYAzZImjU8RtluO/xqXyJnDEal2AeLmR3+Gm/HWCGS D7k4aR2bbjAakRPHIBZSFKZ0Z3DZWaWSzTbdgmBZaEtzZ+/bAew8x8f/IIUOAvEKZUqZqEx H1Xsnjfa5aicICfq+Uz0Q== X-UI-Out-Filterresults: notjunk:1; V01:K0:1+YnI9spbTU=:89dWD+wbgHxMm6BiC1sQSa whueVQKlVVD5cO9nN2AD3ZzTVbU+upfFIFVFs2/hMpcDeOtc+EGnSBNvXFesEo6Y7fOyozBn3 NJZg8+UjxtkUF3DdE4DWacbGKUWpAdXv0wwOszj5zWy/8xQAF6iWaYxG9aBH0Tp9kjjR3DXqq A/WedP9JR+O2dIOPBe5P3nD10AwMRu1x5oGS9pLK2nf68NBk5OxMJkr0BFrHbwodDP1+lD/IV gu1o+0kuMWEkWEYjc9P5JCVXWE7+So1n1fZTHIBmCg46z9oEGEXaaeZyIhlh6DOiN5qF48TA1 5DOTHsICIfMS37gZDVaDsv9KOEKAZHnSEisbf263PlTWaw1cL5/KtH7h3Cl28MwVKIYQ2Z1lp CjqYaHT89lBtn9wVDOqiC9ejCcgjFfo0NP3+uLOgApRwCHkZA5HyjKaoavDf6jPYptjRGkKS2 TfVCLnSdp7R5byOv0yOZ/hn7o2RdE+iZxhPiCkxaoHomX7yUoayKm0yyDNL7EvZ4sLNmz9T0v WNnLtdqLJ+bAt5DghzxWCS+5UXi3FlKtCaK0awfBz/CKsM7/7vhPCLYJ8K49jSnu/8yy0SV5k BDbolMLmo862VFm7GAdWvl14Y233iDbEICSk45R8IgPM6pu7L3UnC6K3RRLwfxOEixOLk2QUJ uunU4IzGmz355nY9Fa33iFoZ0rvu4mFeDqAfnxlmL1Y5yLssH7MuLNDwex7koiLKPQFhrz4Bh Dt6fxqFHNeKJivJ+ Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org This is a rewrite of an earlier patch from Yangbo Lu, adding a quirk for the NXP QorIQ T4240 in the detection of the host device version. Unfortunately, this device cannot be detected using the compatible string, as we have to support existing DTS files that use the generic "fsl,t4240-esdhc" identifier but that have other host versions that are correctly detected. Signed-off-by: Arnd Bergmann -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c index 3f34d354f1fc..1d4814fe4cb2 100644 --- a/drivers/mmc/host/sdhci-of-esdhc.c +++ b/drivers/mmc/host/sdhci-of-esdhc.c @@ -73,14 +73,16 @@ static u32 esdhc_readl_fixup(struct sdhci_host *host, static u16 esdhc_readw_fixup(struct sdhci_host *host, int spec_reg, u32 value) { + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); + struct sdhci_esdhc *esdhc = sdhci_pltfm_priv(pltfm_host); u16 ret; int shift = (spec_reg & 0x2) * 8; if (spec_reg == SDHCI_HOST_VERSION) - ret = value & 0xffff; - else - ret = (value >> shift) & 0xffff; - return ret; + return esdhc->vendor_ver << SDHCI_VENDOR_VER_SHIFT | + esdhc->spec_ver; + + return (value >> shift) & 0xffff; } static u8 esdhc_readb_fixup(struct sdhci_host *host, @@ -562,16 +564,32 @@ static const struct sdhci_pltfm_data sdhci_esdhc_le_pdata = { .ops = &sdhci_esdhc_le_ops, }; +#define T4240_HOST_VER ((VENDOR_V_23 << SDHCI_VENDOR_VER_SHIFT) | SDHCI_SPEC_200) +static const struct soc_device_attribute esdhc_t4240_quirk = { + /* T4240 revision < 0x20 uses vendor version 23, SDHCI version 200 */ + { .soc_id = "T4*(0x824000)", .revision = "0x[01]?", + .data = (void *)(uintptr_t)(T4240_HOST_VER) }, + { }, +}; + static void esdhc_init(struct platform_device *pdev, struct sdhci_host *host) { struct sdhci_pltfm_host *pltfm_host; struct sdhci_esdhc *esdhc; - u16 host_ver; pltfm_host = sdhci_priv(host); esdhc = sdhci_pltfm_priv(pltfm_host); host_ver = sdhci_readw(host, SDHCI_HOST_VERSION); + + if (of_device_is_compatible(pdev->dev.of_node, "fsl,t4240-esdhc")) { + struct soc_device_attribute *match; + + match = soc_device_match(&esdhc_t4240_quirk); + if (match) + host_ver = (uintptr_t)match->data; + } + esdhc->vendor_ver = (host_ver & SDHCI_VENDOR_VER_MASK) >> SDHCI_VENDOR_VER_SHIFT; esdhc->spec_ver = host_ver & SDHCI_SPEC_VER_MASK;