From patchwork Fri Apr 17 16:54:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicolas Saenz Julienne X-Patchwork-Id: 1272318 Return-Path: X-Original-To: incoming-dt@patchwork.ozlabs.org Delivered-To: patchwork-incoming-dt@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=devicetree-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=suse.de Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 493hzF64b5z9sRN for ; Sat, 18 Apr 2020 02:55:05 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726758AbgDQQy6 (ORCPT ); Fri, 17 Apr 2020 12:54:58 -0400 Received: from mx2.suse.de ([195.135.220.15]:42404 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726105AbgDQQy5 (ORCPT ); Fri, 17 Apr 2020 12:54:57 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 5D7AAAB89; Fri, 17 Apr 2020 16:54:55 +0000 (UTC) From: Nicolas Saenz Julienne To: saravanak@google.com, linux-kernel@vger.kernel.org, Rob Herring , Frank Rowand , Greg Kroah-Hartman Cc: devicetree@vger.kernel.org, Nicolas Saenz Julienne Subject: [PATCH v2 1/2] of: property: Fix create device links for all child-supplier dependencies Date: Fri, 17 Apr 2020 18:54:41 +0200 Message-Id: <20200417165442.1856-2-nsaenzjulienne@suse.de> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200417165442.1856-1-nsaenzjulienne@suse.de> References: <20200417165442.1856-1-nsaenzjulienne@suse.de> MIME-Version: 1.0 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Upon adding a new device from a DT node, we scan its properties and its children's properties in order to create a consumer/supplier relationship between the device and the property provider. That said, it's possible for some of the node's children to be disabled, which will create links that'll never be fulfilled. To get around this, use the for_each_available_child_of_node() function instead of for_each_available_node() when iterating over the node's children. Fixes: d4387cd11741 ("of: property: Create device links for all child-supplier depencencies") Signed-off-by: Nicolas Saenz Julienne Reviewed-by: Saravana Kannan --- Changes since v1: - Slightly reword description drivers/of/property.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/of/property.c b/drivers/of/property.c index 252e4f6001553..dc034eb45defd 100644 --- a/drivers/of/property.c +++ b/drivers/of/property.c @@ -1298,7 +1298,7 @@ static int of_link_to_suppliers(struct device *dev, if (of_link_property(dev, con_np, p->name)) ret = -ENODEV; - for_each_child_of_node(con_np, child) + for_each_available_child_of_node(con_np, child) if (of_link_to_suppliers(dev, child) && !ret) ret = -EAGAIN; From patchwork Fri Apr 17 16:54:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicolas Saenz Julienne X-Patchwork-Id: 1272317 Return-Path: X-Original-To: incoming-dt@patchwork.ozlabs.org Delivered-To: patchwork-incoming-dt@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=devicetree-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=suse.de Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 493hz92v9Nz9sRN for ; Sat, 18 Apr 2020 02:55:01 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727848AbgDQQy7 (ORCPT ); Fri, 17 Apr 2020 12:54:59 -0400 Received: from mx2.suse.de ([195.135.220.15]:42424 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727840AbgDQQy6 (ORCPT ); Fri, 17 Apr 2020 12:54:58 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 06275AE21; Fri, 17 Apr 2020 16:54:55 +0000 (UTC) From: Nicolas Saenz Julienne To: saravanak@google.com, linux-kernel@vger.kernel.org, Rob Herring , Frank Rowand , Greg Kroah-Hartman Cc: devicetree@vger.kernel.org, Nicolas Saenz Julienne Subject: [PATCH v2 2/2] of: property: Do not link to disabled devices Date: Fri, 17 Apr 2020 18:54:42 +0200 Message-Id: <20200417165442.1856-3-nsaenzjulienne@suse.de> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200417165442.1856-1-nsaenzjulienne@suse.de> References: <20200417165442.1856-1-nsaenzjulienne@suse.de> MIME-Version: 1.0 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org When creating a consumer/supplier relationship between two devices, make sure the supplier node is actually active. Otherwise this will create a link relationship that will never be fulfilled. This, in the worst case scenario, will hang the system during boot. Note that, in practice, the fact that a device-tree represented consumer/supplier relationship isn't fulfilled will not prevent devices from successfully probing. Fixes: a3e1d1a7f5fc ("of: property: Add functional dependency link from DT bindings") Signed-off-by: Nicolas Saenz Julienne --- Changes since v1: - Move availability check into the compatible search routine and bail if device node disabled drivers/of/property.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/drivers/of/property.c b/drivers/of/property.c index dc034eb45defd..14b6266dd054b 100644 --- a/drivers/of/property.c +++ b/drivers/of/property.c @@ -1045,8 +1045,25 @@ static int of_link_to_phandle(struct device *dev, struct device_node *sup_np, * Find the device node that contains the supplier phandle. It may be * @sup_np or it may be an ancestor of @sup_np. */ - while (sup_np && !of_find_property(sup_np, "compatible", NULL)) + while (sup_np) { + + /* + * Don't allow linking a device node as consumer of a disabled + * node. + */ + if (!of_device_is_available(sup_np)) { + dev_dbg(dev, "Not linking to %pOFP - Not available\n", + sup_np); + of_node_put(sup_np); + return -ENODEV; + } + + if (of_find_property(sup_np, "compatible", NULL)) + break; + sup_np = of_get_next_parent(sup_np); + } + if (!sup_np) { dev_dbg(dev, "Not linking to %pOFP - No device\n", tmp_np); return -ENODEV;