From patchwork Thu Apr 11 23:56:21 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Saravana Kannan X-Patchwork-Id: 13626650 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 0A23AC4345F for ; Thu, 11 Apr 2024 23:56:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:From:Subject:References: Mime-Version:Message-Id:In-Reply-To:Date:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=Vpe98D95NBLSk0ES2rgYEE+ULHIc/ihijLJvYghlPq4=; b=4zrz191ZSXMzVicB9ueDz3+AsK Ub76LqUzCo3tI+Fjss305zVWmgj56vwGW+aOpYHJs4awgQc0EyXpWSr3PK4u+05uBDTB5NC1GkJcN W6mXvj7qW39PDedCmtIx0gbjz77Vg3fgODOf2GDclFD+MseBmklYE28zVmUcdFkGw4NQ9rPFJT3Ka A0AieOFqXbcLf2HcZO5iE2uo3FlqrhP5iSk5n6Hb05nQp9wCaIOxDBWq2ad6KQUZ+Nvd6q3Thb0UJ zcVxTHDzL5PoWG4u+Hwm+k5PPolQ+NIpCmqqwiBUoigKc+Gb2lMVf/fMkrVM+koWGrcrJ5KxZczjd GdNgWlKA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rv4HT-0000000EYRp-0eo1; Thu, 11 Apr 2024 23:56:35 +0000 Received: from mail-yb1-xb4a.google.com ([2607:f8b0:4864:20::b4a]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rv4HQ-0000000EYPJ-1lsr for linux-arm-kernel@lists.infradead.org; Thu, 11 Apr 2024 23:56:33 +0000 Received: by mail-yb1-xb4a.google.com with SMTP id 3f1490d57ef6-dd0ae66422fso860652276.0 for ; Thu, 11 Apr 2024 16:56:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1712879790; x=1713484590; darn=lists.infradead.org; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=jT0tMCUG5C45vynKdJTKsAOSulSDMwPl00tKOsyCLZI=; b=LCjd7AMo/wl2E8iPM1hahnDiA7sKFtgqs8n0b6RoSpNi4BI8yxU4fOypAgkQ3RcKEV LwtehWMiYlrGv6i+YW/4EyI3Q2mK9aEZpj/jKZ5n9csHIxTN0HVLVI2VOV5OGKy1U8La PSFhUHYMQRkg5YAF4Xep7PriXTmrdDFppS185AemM6tQEcOEPcQtOlR3kCxtnNJgHo1w AmzGShefVczKjNpbUamQ4xZo4T57NIuvtW7+2dXG3ev4UAc+HO4q+NvNTOmlGScpYHHV 5Ff+MnIjV3W3Ld9vzqq04qGZjwJrhYNiUWHmKYpqHeHKS3tgJn77u7GICejGha3anFQ3 3ghQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712879790; x=1713484590; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=jT0tMCUG5C45vynKdJTKsAOSulSDMwPl00tKOsyCLZI=; b=WbyNCf8hafhHeGQUcB/RemGrDCTo4L4aNUtJtmEbEu1f/L+AvL6TGEbco+AWzE9sQo VYCj7CRUwoIor8KBm7zBl5aSfOxjFPifi13lsKMWjcu9bdLZn2wMBiSTOiX3fhLRsdY+ f2iCRZ3jpmjcLDXKMS6kVWjlDeXmPGOSlaU/Wd7fq9YrAjtL64XwzkBtyi9oOTg97Gdr s8LY+Ee2lk1az0tc0RTDGPr0o4AAhjymaNIOcHedyEskYMs3xKq2Txeukk1y9MasZUVc Gt7iv7M0yC6flKw0cuFGIkEBzVEAWcWqD79ujUXjCF3KW+9AYVFe5ZBvt4pnC/24GFGk OlAA== X-Forwarded-Encrypted: i=1; AJvYcCVZdKaTp2I7UamUWYPqCnuaXiBc4CYcdgo/MAb/67/J0fyyuklB/pGom1vfdyVsC0FbJbivsafDRcfRtlhluw38gEqzFalOBupyBK+250tQ70EAPk0= X-Gm-Message-State: AOJu0YyldQKsQOWLuSpMtKmHVevBA0exEKJBhJ/oXgy/2HkGBJlom1wl C2zycMbhEHwyWRfq7xWCnUtM2eHbFxo9gyDG2UwIPKvoJH/fOl7sjp96Qs4yoOhaDyswWCkH3Xu GMi41zCATvszocQ== X-Google-Smtp-Source: AGHT+IEvR1JaDEbMFFioYt0KHpMJr1gBv9IJB0hOdL9dLeYPT6CmjFeSm9ekim1dAEyyL80zGuQNzSbprufcUNI= X-Received: from saravanak.san.corp.google.com ([2620:15c:2d:3:a472:f40c:d4ba:c29]) (user=saravanak job=sendgmr) by 2002:a05:6902:708:b0:dbe:d0a9:2be3 with SMTP id k8-20020a056902070800b00dbed0a92be3mr404697ybt.3.1712879790017; Thu, 11 Apr 2024 16:56:30 -0700 (PDT) Date: Thu, 11 Apr 2024 16:56:21 -0700 In-Reply-To: <20240411235623.1260061-1-saravanak@google.com> Message-Id: <20240411235623.1260061-2-saravanak@google.com> Mime-Version: 1.0 References: <20240411235623.1260061-1-saravanak@google.com> X-Mailer: git-send-email 2.44.0.683.g7961c838ac-goog Subject: [PATCH v3 1/2] Revert "treewide: Fix probing of devices in DT overlays" From: Saravana Kannan To: Herve Codina , Greg Kroah-Hartman , "Rafael J. Wysocki" , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Wolfram Sang , Rob Herring , Saravana Kannan , Mark Brown , Len Brown , Andy Shevchenko , Daniel Scally , Heikki Krogerus , Sakari Ailus , Geert Uytterhoeven Cc: kernel-team@android.com, Wolfram Sang , linux-kernel@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-i2c@vger.kernel.org, devicetree@vger.kernel.org, linux-spi@vger.kernel.org, linux-acpi@vger.kernel.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240411_165632_488784_E4DFA52F X-CRM114-Status: GOOD ( 12.45 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org This reverts commit 1a50d9403fb90cbe4dea0ec9fd0351d2ecbd8924. While the commit fixed fw_devlink overlay handling for one case, it broke it for another case. So revert it and redo the fix in a separate patch. Fixes: 1a50d9403fb9 ("treewide: Fix probing of devices in DT overlays") Reported-by: Herve Codina Closes: https://lore.kernel.org/lkml/CAMuHMdXEnSD4rRJ-o90x4OprUacN_rJgyo8x6=9F9rZ+-KzjOg@mail.gmail.com/ Closes: https://lore.kernel.org/all/20240221095137.616d2aaa@bootlin.com/ Closes: https://lore.kernel.org/lkml/20240312151835.29ef62a0@bootlin.com/ Signed-off-by: Saravana Kannan --- drivers/bus/imx-weim.c | 6 ------ drivers/i2c/i2c-core-of.c | 5 ----- drivers/of/dynamic.c | 1 - drivers/of/platform.c | 5 ----- drivers/spi/spi.c | 5 ----- 5 files changed, 22 deletions(-) diff --git a/drivers/bus/imx-weim.c b/drivers/bus/imx-weim.c index 837bf9d51c6e..caaf887e0ccc 100644 --- a/drivers/bus/imx-weim.c +++ b/drivers/bus/imx-weim.c @@ -331,12 +331,6 @@ static int of_weim_notify(struct notifier_block *nb, unsigned long action, "Failed to setup timing for '%pOF'\n", rd->dn); if (!of_node_check_flag(rd->dn, OF_POPULATED)) { - /* - * Clear the flag before adding the device so that - * fw_devlink doesn't skip adding consumers to this - * device. - */ - rd->dn->fwnode.flags &= ~FWNODE_FLAG_NOT_DEVICE; if (!of_platform_device_create(rd->dn, NULL, &pdev->dev)) { dev_err(&pdev->dev, "Failed to create child device '%pOF'\n", diff --git a/drivers/i2c/i2c-core-of.c b/drivers/i2c/i2c-core-of.c index a6c407d36800..a250921bbce0 100644 --- a/drivers/i2c/i2c-core-of.c +++ b/drivers/i2c/i2c-core-of.c @@ -178,11 +178,6 @@ static int of_i2c_notify(struct notifier_block *nb, unsigned long action, return NOTIFY_OK; } - /* - * Clear the flag before adding the device so that fw_devlink - * doesn't skip adding consumers to this device. - */ - rd->dn->fwnode.flags &= ~FWNODE_FLAG_NOT_DEVICE; client = of_i2c_register_device(adap, rd->dn); if (IS_ERR(client)) { dev_err(&adap->dev, "failed to create client for '%pOF'\n", diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c index 4d57a4e34105..19a1a38554f2 100644 --- a/drivers/of/dynamic.c +++ b/drivers/of/dynamic.c @@ -224,7 +224,6 @@ static void __of_attach_node(struct device_node *np) np->sibling = np->parent->child; np->parent->child = np; of_node_clear_flag(np, OF_DETACHED); - np->fwnode.flags |= FWNODE_FLAG_NOT_DEVICE; raw_spin_unlock_irqrestore(&devtree_lock, flags); diff --git a/drivers/of/platform.c b/drivers/of/platform.c index 389d4ea6bfc1..efd861fa254f 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c @@ -743,11 +743,6 @@ static int of_platform_notify(struct notifier_block *nb, if (of_node_check_flag(rd->dn, OF_POPULATED)) return NOTIFY_OK; - /* - * Clear the flag before adding the device so that fw_devlink - * doesn't skip adding consumers to this device. - */ - rd->dn->fwnode.flags &= ~FWNODE_FLAG_NOT_DEVICE; /* pdev_parent may be NULL when no bus platform device */ pdev_parent = of_find_device_by_node(rd->dn->parent); pdev = of_platform_device_create(rd->dn, NULL, diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index ff75838c1b5d..17cd417f7681 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -4761,11 +4761,6 @@ static int of_spi_notify(struct notifier_block *nb, unsigned long action, return NOTIFY_OK; } - /* - * Clear the flag before adding the device so that fw_devlink - * doesn't skip adding consumers to this device. - */ - rd->dn->fwnode.flags &= ~FWNODE_FLAG_NOT_DEVICE; spi = of_register_spi_device(ctlr, rd->dn); put_device(&ctlr->dev); From patchwork Thu Apr 11 23:56:22 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Saravana Kannan X-Patchwork-Id: 13626652 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2AEF3C4345F for ; Thu, 11 Apr 2024 23:56:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:From:Subject:References: Mime-Version:Message-Id:In-Reply-To:Date:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=/KvHj1m6DaIPQ6Y30td58eVuhZanoi+AtJYJUDelWYw=; b=GSjMvwkR7xZPRY+//75G0VZ3tt 0EHGWaGLe8gOuWai0dWXcMm8IYlpDPF1uPGxrDMB39vPbNo5BthSb0H+uZxZeeMgDoFMl9TWzJgLf xYdzF9brqM896iijErHUGoow4EpadmB4IkAFSBN30N4e9TX+gHnJACD4rO8Qs/unnPAyJ8mWdGjQv YXh+x7klkOVrsCmUMMZLTUvvHWDq081JjWPjKSYucVge18TQ3tKB+3b7WiKT1kJLBtcaPUmHKNy+o yF8aojwoHLy2RggJ21M6CkqbcY6VEOnzdpcoTXNKfHjCiaH8sfpp7RUMpkN8rodUxg+Hn+P2QGoVd 095BJ33Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rv4HZ-0000000EYUC-3T3K; Thu, 11 Apr 2024 23:56:41 +0000 Received: from mail-pj1-x104a.google.com ([2607:f8b0:4864:20::104a]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rv4HS-0000000EYRM-3ltj for linux-arm-kernel@lists.infradead.org; Thu, 11 Apr 2024 23:56:36 +0000 Received: by mail-pj1-x104a.google.com with SMTP id 98e67ed59e1d1-2a2e6197371so310323a91.3 for ; Thu, 11 Apr 2024 16:56:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1712879794; x=1713484594; darn=lists.infradead.org; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=HizrqH7rz47v2QLp5elrgTIyG7EQRo9SAEpqH/+kBy0=; b=xvRifzmOJ0hJPQTfeWBo4Aq5HyWUx1v8Xm8FhBNQ8QAK90iu5iVPf90JvaSJM6QYGt r3gNaihSwoOERk7x6K9XA9ygjNL8XioPNFiF1yMQeTOu5ZVrfqAACM32gzZzK8RyNqGP CngabxdKEJ0T65A7y8tCQRQiWpKKRT8nKpH7YaxTxkZvC/yeOQ+fp6S7aTJZEqhG1hp2 oCu2OA6g+S2H4tne9tNtcgbzvA+lWrTJYbetiD3FbKo735ERQcmACJ7kzzTn0PEurFoG ZGkiia6T9jCUYu7gzGN+dFkMGg+AYY9wS0glmVL7Cj15ly91crk77tz73wMeW5WerNWm o8Yg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712879794; x=1713484594; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=HizrqH7rz47v2QLp5elrgTIyG7EQRo9SAEpqH/+kBy0=; b=FC0nl46DEE62scmTZFS111V3qzD6CdSiB441Bu+N3n1Ae5yac0phKe/mIeapCwkD35 mE//gHdPbqSwlGScrZRDZNA2uHlwdLjFYl1NlONJI93zjopGKFir1JHnxjntlP0jwfhz ExA1MN9HjQUY+tJKNe41UceMVTZQmZvWTxaIBKFrO85IYf05vXYZa7GNg7w6Dn9sdd1Y 0/f2cjVMdvGiQBsLb/WW/K6Zq/VojHJe3l9qzPlPt0qFYCOGt4Omf3sJGrSjqE6mtiKg T5F8wXDCeZT9oQ/JfmQ/2R33YL27Hhu7jbuJg2to5ddvZ0RWWHss5+/YTTQBoVDV79jy 9Uug== X-Forwarded-Encrypted: i=1; AJvYcCVjhmJMJuPZ4ODTRMDeglUezZAU9PVvx4LA5ax5n9qErR3JwDxRKNjzIFfUmzOERJ4Q95q/cCbW514C6A9lQl0MruGRwltySjuwPYOmtghZRXbFtsA= X-Gm-Message-State: AOJu0YzLs0O+EQo7cirBZz2EMcyQydf+1LbYNyGbHgTFTn/8nVd8XTut r82ZptWB/bxYgpVqy3hov7+ArjVWI0QqlD7zVNkgZNkkxKnttSRIIDzTov9buRVrgpMS9I2fT2F nAwUisP+WpX28Vg== X-Google-Smtp-Source: AGHT+IHqTq2UPkwQrTsIwISL3TPeqKf9uyBTI5tIlaviAP1Wf5pw15DCSNWSteziJ1gjlX/gPxjg3k35MoA1MA0= X-Received: from saravanak.san.corp.google.com ([2620:15c:2d:3:a472:f40c:d4ba:c29]) (user=saravanak job=sendgmr) by 2002:a17:90a:6546:b0:2a5:fb3a:32e6 with SMTP id f6-20020a17090a654600b002a5fb3a32e6mr3270pjs.4.1712879793807; Thu, 11 Apr 2024 16:56:33 -0700 (PDT) Date: Thu, 11 Apr 2024 16:56:22 -0700 In-Reply-To: <20240411235623.1260061-1-saravanak@google.com> Message-Id: <20240411235623.1260061-3-saravanak@google.com> Mime-Version: 1.0 References: <20240411235623.1260061-1-saravanak@google.com> X-Mailer: git-send-email 2.44.0.683.g7961c838ac-goog Subject: [PATCH v3 2/2] of: dynamic: Fix overlayed devices not probing because of fw_devlink From: Saravana Kannan To: Herve Codina , Greg Kroah-Hartman , "Rafael J. Wysocki" , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Wolfram Sang , Rob Herring , Saravana Kannan , Mark Brown , Len Brown , Andy Shevchenko , Daniel Scally , Heikki Krogerus , Sakari Ailus , Geert Uytterhoeven Cc: kernel-team@android.com, Wolfram Sang , linux-kernel@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-i2c@vger.kernel.org, devicetree@vger.kernel.org, linux-spi@vger.kernel.org, linux-acpi@vger.kernel.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240411_165635_027095_7BEF1EE8 X-CRM114-Status: GOOD ( 24.86 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org When an overlay is applied, if the target device has already probed successfully and bound to a device, then some of the fw_devlink logic that ran when the device was probed needs to be rerun. This allows newly created dangling consumers of the overlayed device tree nodes to be moved to become consumers of the target device. Fixes: 1a50d9403fb9 ("treewide: Fix probing of devices in DT overlays") Reported-by: Herve Codina Closes: https://lore.kernel.org/lkml/CAMuHMdXEnSD4rRJ-o90x4OprUacN_rJgyo8x6=9F9rZ+-KzjOg@mail.gmail.com/ Closes: https://lore.kernel.org/all/20240221095137.616d2aaa@bootlin.com/ Closes: https://lore.kernel.org/lkml/20240312151835.29ef62a0@bootlin.com/ Signed-off-by: Saravana Kannan --- drivers/base/core.c | 76 +++++++++++++++++++++++++++++++++++++----- drivers/of/overlay.c | 15 +++++++++ include/linux/fwnode.h | 1 + 3 files changed, 83 insertions(+), 9 deletions(-) diff --git a/drivers/base/core.c b/drivers/base/core.c index 5f4e03336e68..1a646f393dd7 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -46,6 +46,8 @@ static bool fw_devlink_drv_reg_done; static bool fw_devlink_best_effort; static struct workqueue_struct *device_link_wq; +#define get_dev_from_fwnode(fwnode) get_device((fwnode)->dev) + /** * __fwnode_link_add - Create a link between two fwnode_handles. * @con: Consumer end of the link. @@ -237,6 +239,70 @@ static void __fw_devlink_pickup_dangling_consumers(struct fwnode_handle *fwnode, __fw_devlink_pickup_dangling_consumers(child, new_sup); } +static void fw_devlink_pickup_dangling_consumers(struct device *dev) +{ + struct fwnode_handle *child; + + mutex_lock(&fwnode_link_lock); + fwnode_for_each_available_child_node(dev->fwnode, child) + __fw_devlink_pickup_dangling_consumers(child, dev->fwnode); + __fw_devlink_link_to_consumers(dev); + mutex_unlock(&fwnode_link_lock); +} + +/** + * fw_devlink_refresh_fwnode - Recheck the tree under this firmware node + * @fwnode: The fwnode under which the fwnode tree has changed + * + * This function is mainly meant to adjust the supplier/consumer dependencies + * after a fwnode tree overlay has occurred. + */ +void fw_devlink_refresh_fwnode(struct fwnode_handle *fwnode) +{ + struct device *dev; + + /* + * Find the closest ancestor fwnode that has been converted to a device + * that can bind to a driver (bus device). + */ + fwnode_handle_get(fwnode); + do { + if (fwnode->flags & FWNODE_FLAG_NOT_DEVICE) + continue; + + dev = get_dev_from_fwnode(fwnode); + if (!dev) + continue; + + if (dev->bus) + break; + + put_device(dev); + } while ((fwnode = fwnode_get_next_parent(fwnode))); + + /* + * If none of the ancestor fwnodes have (yet) been converted to a device + * that can bind to a driver, there's nothing to fix up. + */ + if (!fwnode) + return; + + WARN(device_is_bound(dev) && dev->links.status != DL_DEV_DRIVER_BOUND, + "Don't multithread overlaying and probing the same device!\n"); + + /* + * If the device has already bound to a driver, then we need to redo + * some of the work that was done after the device was bound to a + * driver. If the device hasn't bound to a driver, running thing too + * soon would incorrectly pick up consumers that it shouldn't. + */ + if (dev->links.status == DL_DEV_DRIVER_BOUND) + fw_devlink_pickup_dangling_consumers(dev); + + put_device(dev); + fwnode_handle_put(fwnode); +} + static DEFINE_MUTEX(device_links_lock); DEFINE_STATIC_SRCU(device_links_srcu); @@ -1322,14 +1388,8 @@ void device_links_driver_bound(struct device *dev) * child firmware node. */ if (dev->fwnode && dev->fwnode->dev == dev) { - struct fwnode_handle *child; fwnode_links_purge_suppliers(dev->fwnode); - mutex_lock(&fwnode_link_lock); - fwnode_for_each_available_child_node(dev->fwnode, child) - __fw_devlink_pickup_dangling_consumers(child, - dev->fwnode); - __fw_devlink_link_to_consumers(dev); - mutex_unlock(&fwnode_link_lock); + fw_devlink_pickup_dangling_consumers(dev); } device_remove_file(dev, &dev_attr_waiting_for_supplier); @@ -1888,8 +1948,6 @@ static void fw_devlink_unblock_consumers(struct device *dev) device_links_write_unlock(); } -#define get_dev_from_fwnode(fwnode) get_device((fwnode)->dev) - static bool fwnode_init_without_drv(struct fwnode_handle *fwnode) { struct device *dev; diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c index 2ae7e9d24a64..7b2396c53127 100644 --- a/drivers/of/overlay.c +++ b/drivers/of/overlay.c @@ -179,6 +179,15 @@ static int overlay_notify(struct overlay_changeset *ovcs, return 0; } +static void overlay_fw_devlink_refresh(struct overlay_changeset *ovcs) +{ + for (int i = 0; i < ovcs->count; i++) { + struct device_node *np = ovcs->fragments[i].target; + + fw_devlink_refresh_fwnode(of_fwnode_handle(np)); + } +} + /* * The values of properties in the "/__symbols__" node are paths in * the ovcs->overlay_root. When duplicating the properties, the paths @@ -953,6 +962,12 @@ static int of_overlay_apply(struct overlay_changeset *ovcs, pr_err("overlay apply changeset entry notify error %d\n", ret); /* notify failure is not fatal, continue */ + /* + * Needs to happen after changset notify to give the listeners a chance + * to finish creating all the devices they need to create. + */ + overlay_fw_devlink_refresh(ovcs); + ret_tmp = overlay_notify(ovcs, OF_OVERLAY_POST_APPLY); if (ret_tmp) if (!ret) diff --git a/include/linux/fwnode.h b/include/linux/fwnode.h index 0d79070c5a70..95a78b87777a 100644 --- a/include/linux/fwnode.h +++ b/include/linux/fwnode.h @@ -220,6 +220,7 @@ int fwnode_link_add(struct fwnode_handle *con, struct fwnode_handle *sup, u8 flags); void fwnode_links_purge(struct fwnode_handle *fwnode); void fw_devlink_purge_absent_suppliers(struct fwnode_handle *fwnode); +void fw_devlink_refresh_fwnode(struct fwnode_handle *fwnode); bool fw_devlink_is_strict(void); #endif