From patchwork Thu Mar 30 13:26:13 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geert Uytterhoeven X-Patchwork-Id: 77176 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp1133236vqo; Thu, 30 Mar 2023 06:36:59 -0700 (PDT) X-Google-Smtp-Source: AKy350a5h+ZVMZ+uTZafvGK7bbE7fSdq5SQNTRUlnlgJk0vKs9oue2Z6cPp4LOvR7u0QENP83n5Q X-Received: by 2002:a17:906:a04a:b0:91f:5845:4e3c with SMTP id bg10-20020a170906a04a00b0091f58454e3cmr23935952ejb.42.1680183419309; Thu, 30 Mar 2023 06:36:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680183419; cv=none; d=google.com; s=arc-20160816; b=RTpYLy6JPfjahXG+A5Se0KQgcofFrQJ/RXbgNMJLxgIJopur7qEi1uA1uHUZ7swCBi EjZyKhxbYCobQa85y4Va7S1zqrzatuMYhccB1K4mjIgJip2cM7qZyDuFoAtl1J0zFBZR VX5tdK66cwdnTDiHLaVGDeLUW+pWf7xD2CsXPHqCfgqErLOMZ+BcRP9MgHr/BjGz902j qzqPkBTapUD/tDxQYVGIXf9TzxxzeTEvTLGbwlMo9JJ4ieO0k4c10HvZy6g+vHc8fc2g ocErEveabkKC7YQ/ZLv6IwzowMcrZb5+xDERjzXyTuZr7UhRiRqifp5CjPYRhmFcWP2y W2PA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=S/7aw93yZFQaGppgFRcvnvWeywaFu9vDCcJXV38g3Qk=; b=fUaVRLPE7xqsCGtio1C6LAJlGr8pWHzvVkCHRdVg1PYMWTNEXcmAf38aY4HF6CBcej eF82+RyJf5aGIZg9TRnZoMY3CUt39FlVFtmH6vktnwe+Brig3fWy+07YM85lfC2iUvp/ dmrBiWV/tzC2t5Z052ZYuPtHdmx6Dnwnu2vwGaTHx0tx+dDu2LzArC80/nY3AG1+9JKT zMVIb3+mMrC2BUtBmYO7n7CWE0U1QRdnHUfHnPeZf7WgX1hzek1yXwriNd/A+CUf8e47 eGwQYyq3kt2hd5gaQnYwLjle6dIw7sTtzqOMRGH9pVxQFz8dNEpHjsUQ8eWZ/4AFFmPx UfvA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id ta12-20020a1709078c0c00b009333e2433cbsi6544069ejc.970.2023.03.30.06.36.35; Thu, 30 Mar 2023 06:36:59 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231974AbjC3N0o (ORCPT + 99 others); Thu, 30 Mar 2023 09:26:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59776 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231963AbjC3N0i (ORCPT ); Thu, 30 Mar 2023 09:26:38 -0400 Received: from xavier.telenet-ops.be (xavier.telenet-ops.be [IPv6:2a02:1800:120:4::f00:14]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5A999B778 for ; Thu, 30 Mar 2023 06:26:28 -0700 (PDT) Received: from ramsan.of.borg ([84.195.187.55]) by xavier.telenet-ops.be with bizsmtp id edSF2900D1C8whw01dSFSm; Thu, 30 Mar 2023 15:26:25 +0200 Received: from rox.of.borg ([192.168.97.57]) by ramsan.of.borg with esmtp (Exim 4.95) (envelope-from ) id 1phsHS-00FKfy-71; Thu, 30 Mar 2023 15:26:15 +0200 Received: from geert by rox.of.borg with local (Exim 4.95) (envelope-from ) id 1phsIB-007ycS-40; Thu, 30 Mar 2023 15:26:15 +0200 From: Geert Uytterhoeven To: Greg Kroah-Hartman , Saravana Kannan Cc: Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , NXP Linux Team , Wolfram Sang , Rob Herring , Frank Rowand , Mark Brown , Ivan Bornyakov , linux-arm-kernel@lists.infradead.org, linux-i2c@vger.kernel.org, devicetree@vger.kernel.org, linux-spi@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven Subject: [PATCH v3] treewide: Fix probing of devices in DT overlays Date: Thu, 30 Mar 2023 15:26:13 +0200 Message-Id: X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-Spam-Status: No, score=-0.4 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_LOW,SPF_HELO_NONE,SPF_NONE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1761800009149430215?= X-GMAIL-MSGID: =?utf-8?q?1761800009149430215?= When loading a DT overlay that creates a device, the device is not probed, unless the DT overlay is unloaded and reloaded again. After the recent refactoring to improve fw_devlink, it no longer depends on the "compatible" property to identify which device tree nodes will become struct devices. fw_devlink now picks up dangling consumers (consumers pointing to descendent device tree nodes of a device that aren't converted to child devices) when a device is successfully bound to a driver. See __fw_devlink_pickup_dangling_consumers(). However, during DT overlay, a device's device tree node can have sub-nodes added/removed without unbinding/rebinding the driver. This difference in behavior between the normal device instantiation and probing flow vs. the DT overlay flow has a bunch of implications that are pointed out elsewhere[1]. One of them is that the fw_devlink logic to pick up dangling consumers is never exercised. This patch solves the fw_devlink issue by marking all DT nodes added by DT overlays with FWNODE_FLAG_NOT_DEVICE (fwnode that won't become device), and by clearing the flag when a struct device is actually created for the DT node. This way, fw_devlink knows not to have consumers waiting on these newly added DT nodes, and to propagate the dependency to an ancestor DT node that has the corresponding struct device. Based on a patch by Saravana Kannan, which covered only platform and spi devices. [1] https://lore.kernel.org/r/CAGETcx_bkuFaLCiPrAWCPQz+w79ccDp6=9e881qmK=vx3hBMyg@mail.gmail.com Fixes: 4a032827daa89350 ("of: property: Simplify of_link_to_phandle()") Link: https://lore.kernel.org/r/CAGETcx_+rhHvaC_HJXGrr5_WAd2+k5f=rWYnkCZ6z5bGX-wj4w@mail.gmail.com Signed-off-by: Geert Uytterhoeven Acked-by: Mark Brown Acked-by: Wolfram Sang # for I2C Acked-by: Saravana Kannan Tested-by: Ivan Bornyakov Acked-by: Shawn Guo --- v3: - Add Acked-by, - s/instantiate/probe/, - Improve commit description, - Add comment before clearing FWNODE_FLAG_NOT_DEVICE, v2: - Add Acked-by, - Drop RFC. --- 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 insertions(+) diff --git a/drivers/bus/imx-weim.c b/drivers/bus/imx-weim.c index 36d42484142aede2..cf463c1d2102c6fb 100644 --- a/drivers/bus/imx-weim.c +++ b/drivers/bus/imx-weim.c @@ -329,6 +329,12 @@ 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 aa93467784c29c89..5c137638689799c8 100644 --- a/drivers/i2c/i2c-core-of.c +++ b/drivers/i2c/i2c-core-of.c @@ -178,6 +178,11 @@ 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 07d93753b12f5f4d..e311d406b1705306 100644 --- a/drivers/of/dynamic.c +++ b/drivers/of/dynamic.c @@ -226,6 +226,7 @@ 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; } /** diff --git a/drivers/of/platform.c b/drivers/of/platform.c index b2bd2e783445dd78..78ae8418744905c9 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c @@ -737,6 +737,11 @@ 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 37a7be6c5a44c8f9..a12420e28640bbd4 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -4504,6 +4504,11 @@ 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);