From patchwork Tue Feb 11 23:43:35 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Hesselbarth X-Patchwork-Id: 319434 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from ozlabs.org (localhost [IPv6:::1]) by ozlabs.org (Postfix) with ESMTP id 05FE12C00A2 for ; Wed, 12 Feb 2014 10:44:16 +1100 (EST) Received: from mail-ea0-x236.google.com (mail-ea0-x236.google.com [IPv6:2a00:1450:4013:c01::236]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 351E32C0096 for ; Wed, 12 Feb 2014 10:43:44 +1100 (EST) Received: by mail-ea0-f182.google.com with SMTP id r15so4055291ead.13 for ; Tue, 11 Feb 2014 15:43:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:to:cc:subject:references :in-reply-to:content-type; bh=Z+B8XWjmHepsVSsnbbYz7x19kwipDAQZBWfTWUvkD9M=; b=Nv/CBqXWXwoTb0xi+vKi7nKILpP9RaArxkDh6VxSWLjQrJtGn5qB2KlxI/wsv5RrsI NUqaqL+0CuJ9WGOT/+LLrLRbY6583Nw3plp8uPhvBLv1pHz0//qB4sfnkvALABSsOPPj tywS1iYZ6GP1snOZSzLTH6rTb6W93siz3ZCP3kBZtdEZ+G4g3yCkDG1OK8reL2a72FvN sRquug7UiNN8UqnHlys6GcaDRnyI3au0ICfc/RE1xeuU5PCB2FVNeQqovYTVTvDYSNvq EG7OILoXRj4uYkfsshdQVT89itlK0XkuvRZ8BebXaIwguXz0YuVU5p66qPRTgt3oDUod 83Vw== X-Received: by 10.14.98.66 with SMTP id u42mr279974eef.18.1392162220384; Tue, 11 Feb 2014 15:43:40 -0800 (PST) Received: from topkick.lan (dslc-082-083-251-183.pools.arcor-ip.net. [82.83.251.183]) by mx.google.com with ESMTPSA id x6sm74111946eew.20.2014.02.11.15.43.38 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 11 Feb 2014 15:43:39 -0800 (PST) Message-ID: <52FAB5A7.7080208@gmail.com> Date: Wed, 12 Feb 2014 00:43:35 +0100 From: Sebastian Hesselbarth User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 To: Stephen N Chivers Subject: Re: Linux-3.14-rc2: Order of serial node compatibles in DTS files. References: <20140206082635.GA7048@visitor2.iram.es> <20140207101036.GA823@visitor2.iram.es> <20140210110342.GA15806@visitor2.iram.es> <20140211072606.GA26514@visitor2.iram.es> <63AEBD99-AA87-4FD7-BBDA-0CE419959F14@kernel.crashing.org> <52FAA97F.4060600@gmail.com> In-Reply-To: Cc: Chris Proctor , linuxppc-dev@lists.ozlabs.org, Arnd Bergmann , devicetree X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" On 02/12/2014 12:38 AM, Stephen N Chivers wrote: > Sebastian Hesselbarth wrote on >> On 02/11/2014 11:33 PM, Kumar Gala wrote: >>> On Feb 11, 2014, at 2:57 PM, Stephen N Chivers wrote: >>>> I have been trial booting a 3.14-rc2 kernel for a 85xx platform >>>> (dtbImage). [...] >>>> >>>> of_serial f1004500.serial: Unknown serial port found, ignored. >>>> >>>> The serial nodes in boards dts file are specified as: >>>> >>>> serial0: serial@4500 { >>>> cell-index = <0>; >>>> device_type = "serial"; >>>> compatible = "fsl,ns16550", "ns16550"; >>>> reg = <0x4500 0x100>; >>>> clock-frequency = <0>; >>>> interrupts = <0x2a 0x2>; >>>> interrupt-parent = <&mpic>; >>>> }; >>> >>> Wondering if this caused the issue: >>> >>> commit 105353145eafb3ea919f5cdeb652a9d8f270228e >>> Author: Sebastian Hesselbarth >>> Date: Tue Dec 3 14:52:00 2013 +0100 >>> >>> OF: base: match each node compatible against all given matches first >> [...] >> >> I don't think the missing compatible is causing it, but of_serial >> provides a DT match for .type = "serial" just to fail later on >> with the error seen above. >> >> The commit in question reorders of_match_device in a way that match >> table order is not relevant anymore. This can cause it to match >> .type = "serial" first here. >> >> Rather than touching the commit, I suggest to remove the problematic >> .type = "serial" from the match table. It is of no use anyway. > Deleting the "serial" line from the match table fixes the problem. > I tested it for both orderings of compatible. I revert my statement about removing anything from of_serial.c. Instead we should try to prefer matches with compatibles over type/name without compatibles. Something like the patch below (compile tested only) diff --git a/drivers/of/base.c b/drivers/of/base.c index ff85450d5683..60da53b385ff 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -734,6 +734,7 @@ static const struct of_device_id *__of_match_node(const struct of_device_id *matches, const struct device_node *node) { + const struct of_device_id *m; const char *cp; int cplen, l; @@ -742,15 +743,15 @@ const struct of_device_id *__of_match_node(const struct of_device_id *matches, cp = __of_get_property(node, "compatible", &cplen); do { - const struct of_device_id *m = matches; + m = matches; /* Check against matches with current compatible string */ while (m->name[0] || m->type[0] || m->compatible[0]) { int match = 1; - if (m->name[0]) + if (m->name[0] && m->compatible[0]) match &= node->name && !strcmp(m->name, node->name); - if (m->type[0]) + if (m->type[0] && m->compatible[0]) match &= node->type && !strcmp(m->type, node->type); if (m->compatible[0]) @@ -770,6 +771,21 @@ const struct of_device_id *__of_match_node(const struct of_device_id *matches, } } while (cp && (cplen > 0)); + /* Check against matches without compatible string */ + m = matches; + while (m->name[0] || m->type[0]) { + int match = 1; + if (m->name[0]) + match &= node->name + && !strcmp(m->name, node->name); + if (m->type[0]) + match &= node->type + && !strcmp(m->type, node->type); + if (match) + return m; + m++; + } + return NULL; }