Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752287AbbG1NUh (ORCPT ); Tue, 28 Jul 2015 09:20:37 -0400 Received: from mail-wi0-f182.google.com ([209.85.212.182]:36956 "EHLO mail-wi0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751371AbbG1NUe (ORCPT ); Tue, 28 Jul 2015 09:20:34 -0400 From: Tomeu Vizoso To: linux-kernel@vger.kernel.org Cc: Stephen Warren , Javier Martinez Canillas , Mark Brown , Thierry Reding , "Rafael J. Wysocki" , linux-arm-kernel@lists.infradead.org, Dmitry Torokhov , devicetree@vger.kernel.org, Linus Walleij , linux-acpi@vger.kernel.org, Arnd Bergmann , Tomeu Vizoso , Greg Kroah-Hartman Subject: [PATCH v2 01/22] platform: delay device-driver matches until late_initcall Date: Tue, 28 Jul 2015 15:19:32 +0200 Message-Id: <1438089593-7696-2-git-send-email-tomeu.vizoso@collabora.com> X-Mailer: git-send-email 2.4.3 In-Reply-To: <1438089593-7696-1-git-send-email-tomeu.vizoso@collabora.com> References: <1438089593-7696-1-git-send-email-tomeu.vizoso@collabora.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2479 Lines: 80 Delay matches of platform devices until late_initcall, when we are sure that all built-in drivers have been registered already. This is needed to prevent deferred probes because of some drivers not having registered yet. The reason why only platform devices are delayed is that some other devices are expected to be probed earlier than late_initcall, for example, the system PNP driver needs to probe its devices in fs_initcall. Signed-off-by: Tomeu Vizoso --- Changes in v2: - Move delay to platform.c drivers/base/platform.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 063f0ab15259..fcf654678e27 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c @@ -33,6 +33,8 @@ /* For automatically allocated device IDs */ static DEFINE_IDA(platform_devid_ida); +static bool enable_matches; + struct device platform_bus = { .init_name = "platform", }; @@ -839,6 +841,15 @@ static int platform_match(struct device *dev, struct device_driver *drv) struct platform_device *pdev = to_platform_device(dev); struct platform_driver *pdrv = to_platform_driver(drv); + /* + * Delay matches of platform devices until late_initcall, when we are + * sure that all built-in drivers have been registered already. This + * is needed to prevent deferred probes because of some drivers + * not having registered yet. + */ + if (!enable_matches) + return false; + /* When driver_override is set, only bind to the matching driver */ if (pdev->driver_override) return !strcmp(pdev->driver_override, drv->name); @@ -859,6 +870,23 @@ static int platform_match(struct device *dev, struct device_driver *drv) return (strcmp(pdev->name, drv->name) == 0); } +static int __probe_device(struct device *dev, void *data) +{ + device_initial_probe(dev); + + return 0; +} + +static int probe_delayed_matches_initcall(void) +{ + enable_matches = true; + + bus_for_each_dev(&platform_bus_type, NULL, NULL, __probe_device); + + return 0; +} +late_initcall(probe_delayed_matches_initcall); + #ifdef CONFIG_PM_SLEEP static int platform_legacy_suspend(struct device *dev, pm_message_t mesg) -- 2.4.3 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/