From patchwork Fri Jul 5 08:43:38 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Huang Shijie X-Patchwork-Id: 2824066 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id B8C5ABF4A1 for ; Fri, 5 Jul 2013 09:12:09 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 9A39A20158 for ; Fri, 5 Jul 2013 09:12:08 +0000 (UTC) Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7ABCF2014E for ; Fri, 5 Jul 2013 09:12:07 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1Uv232-0005o9-A5; Fri, 05 Jul 2013 09:11:25 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1Uv22Z-0002mb-U7; Fri, 05 Jul 2013 09:10:55 +0000 Received: from ch1ehsobe002.messaging.microsoft.com ([216.32.181.182] helo=ch1outboundpool.messaging.microsoft.com) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1Uv22X-0002lm-MU for linux-arm-kernel@lists.infradead.org; Fri, 05 Jul 2013 09:10:54 +0000 Received: from mail87-ch1-R.bigfish.com (10.43.68.231) by CH1EHSOBE019.bigfish.com (10.43.70.76) with Microsoft SMTP Server id 14.1.225.22; Fri, 5 Jul 2013 09:10:32 +0000 Received: from mail87-ch1 (localhost [127.0.0.1]) by mail87-ch1-R.bigfish.com (Postfix) with ESMTP id 1DFEF4801EB; Fri, 5 Jul 2013 09:10:32 +0000 (UTC) X-Forefront-Antispam-Report: CIP:70.37.183.190; KIP:(null); UIP:(null); IPV:NLI; H:mail.freescale.net; RD:none; EFVD:NLI X-SpamScore: 3 X-BigFish: VS3(zzzz1f42h1ee6h1de0h1fdah2073h1202h1e76h1d1ah1d2ah1fc6h1082kzz8275bhz2dh2a8h668h839hd24he5bhf0ah1288h12a5h12a9h12bdh12e5h137ah139eh13b6h1441h1504h1537h162dh1631h1758h1898h18e1h1946h19b5h1ad9h1b0ah1d0ch1d2eh1d3fh1dc1h1dfeh1dffh1e23h1155h) Received: from mail87-ch1 (localhost.localdomain [127.0.0.1]) by mail87-ch1 (MessageSwitch) id 1373015430624575_12407; Fri, 5 Jul 2013 09:10:30 +0000 (UTC) Received: from CH1EHSMHS027.bigfish.com (snatpool2.int.messaging.microsoft.com [10.43.68.239]) by mail87-ch1.bigfish.com (Postfix) with ESMTP id 8B3C060090; Fri, 5 Jul 2013 09:10:30 +0000 (UTC) Received: from mail.freescale.net (70.37.183.190) by CH1EHSMHS027.bigfish.com (10.43.70.27) with Microsoft SMTP Server (TLS) id 14.1.225.23; Fri, 5 Jul 2013 09:10:28 +0000 Received: from az84smr01.freescale.net (10.64.34.197) by 039-SN1MMR1-001.039d.mgd.msft.net (10.84.1.13) with Microsoft SMTP Server (TLS) id 14.2.328.11; Fri, 5 Jul 2013 09:10:28 +0000 Received: from shlinux2.ap.freescale.net (shlinux2.ap.freescale.net [10.192.224.44]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id r659AOsE030363; Fri, 5 Jul 2013 02:10:25 -0700 From: Huang Shijie To: Subject: [PATCH] of: match the compatible in the order set by the dts file Date: Fri, 5 Jul 2013 16:43:38 +0800 Message-ID: <1373013818-11365-1-git-send-email-b32955@freescale.com> X-Mailer: git-send-email 1.7.1 MIME-Version: 1.0 X-OriginatorOrg: freescale.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130705_051053_770593_03B9776F X-CRM114-Status: GOOD ( 13.20 ) X-Spam-Score: -2.6 (--) Cc: devicetree-discuss@lists.ozlabs.org, linux-kernel@vger.kernel.org, rob.herring@calxeda.com, Huang Shijie , shawn.guo@linaro.org, linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , 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.4 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, 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 If we set the uart compatible in the dts file like this: ------------------------------------------------------ compatible = "fsl,imx6q-uart", "fsl,imx21-uart"; ------------------------------------------------------ and we set the uart compatible in the uart driver like this: ------------------------------------------------------ { .compatible = "fsl,imx1-uart", ... }, { .compatible = "fsl,imx21-uart", ... }, { .compatible = "fsl,imx6q-uart", ... }, { /* sentinel */ } ------------------------------------------------------ the current code will match the "fsl,imx21-uart" in the end. Of course, this is not what we want. We want it to match the "fsl,imx6q-uart". This patch rewrites the match code, and make it to check the compatible in the order set by the DTS file. Signed-off-by: Huang Shijie --- drivers/of/base.c | 29 +++++++++++++++++++++++++---- 1 files changed, 25 insertions(+), 4 deletions(-) diff --git a/drivers/of/base.c b/drivers/of/base.c index 0d61fc5..b13846b 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -622,10 +622,14 @@ static const struct of_device_id *__of_match_node(const struct of_device_id *matches, const struct device_node *node) { + struct of_device_id *old = (struct of_device_id *)matches; + const char *cp; + int cplen, l; + if (!matches) return NULL; - while (matches->name[0] || matches->type[0] || matches->compatible[0]) { + while (matches->name[0] || matches->type[0]) { int match = 1; if (matches->name[0]) match &= node->name @@ -633,13 +637,30 @@ const struct of_device_id *__of_match_node(const struct of_device_id *matches, if (matches->type[0]) match &= node->type && !strcmp(matches->type, node->type); - if (matches->compatible[0]) - match &= __of_device_is_compatible(node, - matches->compatible); if (match) return matches; matches++; } + + /* Check the compatible in the order set by the DTS file. */ + cp = __of_get_property(node, "compatible", &cplen); + if (!cp) + return NULL; + + while (cplen > 0) { + matches = old; + + while (matches->compatible[0]) { + if (!of_compat_cmp(cp, matches->compatible, + strlen(matches->compatible))) + return matches; + matches++; + } + + l = strlen(cp) + 1; + cp += l; + cplen -= l; + } return NULL; }