linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 0/22] On-demand device probing
@ 2015-09-07 12:23 Tomeu Vizoso
  2015-09-07 12:23 ` [PATCH v4 01/22] driver core: Add pre_probe callback to bus_type Tomeu Vizoso
                   ` (22 more replies)
  0 siblings, 23 replies; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, linux-fbdev, linux-usb,
	Felipe Balbi, linux-pwm, Terje Bergström,
	Greg Kroah-Hartman, Jingoo Han, David Airlie, Michael Turquette,
	linux-clk, dmaengine, Jean-Christophe Plagniol-Villard,
	Tomi Valkeinen, Grant Likely, Sebastian Reichel, Frank Rowand,
	Alexandre Courbot, linux-pm, Stephen Boyd, Wolfram Sang,
	Russell King, linux-gpio, Vinod Koul, Liam Girdwood, dri-devel,
	Lee Jones, linux-tegra, Dan Williams, Dmitry Eremin-Solenikov,
	David Woodhouse, Kishon Vijay Abraham I, linux-i2c

Hello,

I have a problem with the panel on my Tegra Chromebook taking longer
than expected to be ready during boot (Stéphane Marchesin reported what
is basically the same issue in [0]), and have looked into ordered
probing as a better way of solving this than moving nodes around in the
DT or playing with initcall levels and linking order.

While reading the thread [1] that Alexander Holler started with his
series to make probing order deterministic, it occurred to me that it
should be possible to achieve the same by probing devices as they are
referenced by other devices.

This basically reuses the information that is already implicit in the
probe() implementations, saving us from refactoring existing drivers or
adding information to DTBs.

During review of v1 of this series Linus Walleij suggested that it
should be the device driver core to make sure that dependencies are
ready before probing a device. I gave this idea a try [2] but Mark Brown
pointed out to the logic duplication between the resource acquisition
and dependency discovery code paths (though I think it's fairly minor).

To address that code duplication I experimented with Arnd's devm_probe
[3] concept of having drivers declare their dependencies instead of
acquiring them during probe, and while it worked [4], I don't think we
end up winning anything when compared to just probing devices on-demand
from resource getters.

One remaining objection is to the "sprinkling" of calls to
of_device_probe() in the resource getters of each subsystem, but I think
it's the right thing to do given that the storage of resources is
currently subsystem-specific.

We could avoid the above by moving resource storage into the core, but I
don't think there's a compelling case for that.

I have tested this on boards with Tegra, iMX.6, Exynos, Rockchip and
OMAP SoCs, and these patches were enough to eliminate all the deferred
probes (except one in PandaBoard because omap_dma_system doesn't have a
firmware node as of yet).

Have submitted a branch [5] with only these patches on top of thursday's
linux-next to kernelci.org and I don't see any issues that could be
caused by them. For some reason it currently has more passes than the
version of -next it's based on!

With this series I get the kernel to output to the panel in 0.5s,
instead of 2.8s.

Regards,

Tomeu

[0] http://lists.freedesktop.org/archives/dri-devel/2014-August/066527.html

[1] https://lkml.org/lkml/2014/5/12/452

[2] https://lkml.org/lkml/2015/6/17/305

[3] http://article.gmane.org/gmane.linux.ports.arm.kernel/277689

[4] https://lkml.org/lkml/2015/7/21/441a

[5] https://git.collabora.com/cgit/user/tomeu/linux.git/log/?h=on-demand-probes-v6

[6] http://kernelci.org/boot/all/job/collabora/kernel/v4.2-11902-g25d80c927f8b/

[7] http://kernelci.org/boot/all/job/next/kernel/next-20150903/

Changes in v4:
- Added bus.pre_probe callback so the probes of Primecell devices can be
  deferred if their device IDs cannot be yet read because of the clock
  driver not having probed when they are registered. Maybe this goes
  overboard and the matching information should be in the DT if there is
  one.
- Rename of_platform_probe to of_device_probe
- Use device_node.device instead of device_node.platform_dev
- Take a reference to the regulator's device to prevent dangling
  pointers
- Add Kconfig DELAY_DEVICE_PROBES to allow disabling delayed probing in
  machines with initcalls that depend on devices probing at a given time.
- Start processing deferred probes in device_initcall_sync
- Also defer probes of AMBA devices registered from the DT as they can
  also request resources.

Changes in v3:
- Set and use device_node.platform_dev instead of reversing the logic to
  find the platform device that encloses a device node.
- Drop the fwnode API to probe firmware nodes and add OF-only API for
  now. I think this same scheme could be used for machines with ACPI,
  but I haven't been able to find one that had to defer its probes because
  of the device probe order.
- Avoid unlocking the regulator device's mutex if we don't have a device

Changes in v2:
- Acquire regulator device lock before returning from regulator_dev_lookup()

Tomeu Vizoso (22):
  driver core: Add pre_probe callback to bus_type
  ARM: amba: Move reading of periphid to pre_probe()
  of/platform: Point to struct device from device node
  of: add function to allow probing a device from a OF node
  gpio: Probe GPIO drivers on demand
  gpio: Probe pinctrl devices on demand
  regulator: core: Reduce critical area in _regulator_get
  regulator: core: Probe regulators on demand
  drm: Probe panels on demand
  drm/tegra: Probe dpaux devices on demand
  i2c: core: Probe i2c adapters and devices on demand
  pwm: Probe PWM chip devices on demand
  backlight: Probe backlight devices on demand
  usb: phy: Probe phy devices on demand
  clk: Probe clk providers on demand
  pinctrl: Probe pinctrl devices on demand
  phy: core: Probe phy providers on demand
  dma: of: Probe DMA controllers on demand
  power-supply: Probe power supplies on demand
  driver core: Allow deferring probes until late init
  driver core: Start processing deferred probes earlier
  of/platform: Defer probes of registered devices

 drivers/amba/bus.c                  | 78 ++++++++++++++++++-------------------
 drivers/base/Kconfig                | 18 +++++++++
 drivers/base/dd.c                   | 35 ++++++++++++++++-
 drivers/clk/clk.c                   |  3 ++
 drivers/dma/of-dma.c                |  3 ++
 drivers/gpio/gpiolib-of.c           |  5 +++
 drivers/gpu/drm/drm_panel.c         |  3 ++
 drivers/gpu/drm/tegra/dpaux.c       |  3 ++
 drivers/i2c/i2c-core.c              |  4 ++
 drivers/of/device.c                 | 58 +++++++++++++++++++++++++++
 drivers/of/platform.c               | 26 +++++++------
 drivers/phy/phy-core.c              |  3 ++
 drivers/pinctrl/devicetree.c        |  3 ++
 drivers/power/power_supply_core.c   |  3 ++
 drivers/pwm/core.c                  |  3 ++
 drivers/regulator/core.c            | 58 ++++++++++++++++++---------
 drivers/usb/phy/phy.c               |  3 ++
 drivers/video/backlight/backlight.c |  3 ++
 include/linux/device.h              |  6 +++
 include/linux/of.h                  |  1 +
 include/linux/of_device.h           |  3 ++
 21 files changed, 251 insertions(+), 71 deletions(-)

-- 
2.4.3


^ permalink raw reply	[flat|nested] 43+ messages in thread

* [PATCH v4 01/22] driver core: Add pre_probe callback to bus_type
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-11 12:04   ` Mark Brown
  2015-09-07 12:23 ` [PATCH v4 02/22] ARM: amba: Move reading of periphid to pre_probe() Tomeu Vizoso
                   ` (21 subsequent siblings)
  22 siblings, 1 reply; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, Greg Kroah-Hartman

Some buses (eg. AMBA) need access to some HW resources (it may need a
clock to be enabled so a device ID can be read) before a device can be
matched to a driver.

The pre_probe callback allows the device-driver core to request the bus
to perform this initialization and can defer the probe if any of the
resources needed are missing.

This gives us more flexibility when setting the order in which devices
are probed because the resources needed to get the matching information
don't need to be available by the time that the bus devices are
registered.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/base/dd.c      | 24 ++++++++++++++++++++++++
 include/linux/device.h |  4 ++++
 2 files changed, 28 insertions(+)

diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index be0eb4639128..faf60bfc46b3 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -544,6 +544,17 @@ static int __device_attach(struct device *dev, bool allow_async)
 	int ret = 0;
 
 	device_lock(dev);
+
+	if (dev->bus && dev->bus->pre_probe) {
+		ret = dev->bus->pre_probe(dev);
+		if (ret) {
+			if (ret == -EPROBE_DEFER)
+				driver_deferred_probe_add(dev);
+			ret = 0;
+			goto out_unlock;
+		}
+	}
+
 	if (dev->driver) {
 		if (klist_node_attached(&dev->p->knode_driver)) {
 			ret = 1;
@@ -619,6 +630,7 @@ void device_initial_probe(struct device *dev)
 static int __driver_attach(struct device *dev, void *data)
 {
 	struct device_driver *drv = data;
+	int ret;
 
 	/*
 	 * Lock device and try to bind to it. We drop the error
@@ -636,8 +648,20 @@ static int __driver_attach(struct device *dev, void *data)
 	if (dev->parent)	/* Needed for USB */
 		device_lock(dev->parent);
 	device_lock(dev);
+
+	if (dev->bus && dev->bus->pre_probe) {
+		ret = dev->bus->pre_probe(dev);
+		if (ret) {
+			if (ret == -EPROBE_DEFER)
+				driver_deferred_probe_add(dev);
+			goto out;
+		}
+	}
+
 	if (!dev->driver)
 		driver_probe_device(drv, dev);
+
+out:
 	device_unlock(dev);
 	if (dev->parent)
 		device_unlock(dev->parent);
diff --git a/include/linux/device.h b/include/linux/device.h
index 5d7bc6349930..d8be07bc9c3f 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -74,6 +74,9 @@ extern void bus_remove_file(struct bus_type *, struct bus_attribute *);
  *		given device can be handled by the given driver.
  * @uevent:	Called when a device is added, removed, or a few other things
  *		that generate uevents to add the environment variables.
+ * @pre_probe:	Called when a new device or driver is added to this bus, to
+ *		perform any initializations that are needed so the device can
+ *		be matched to a driver.
  * @probe:	Called when a new device or driver add to this bus, and callback
  *		the specific driver's probe to initial the matched device.
  * @remove:	Called when a device removed from this bus.
@@ -113,6 +116,7 @@ struct bus_type {
 
 	int (*match)(struct device *dev, struct device_driver *drv);
 	int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
+	int (*pre_probe)(struct device *dev);
 	int (*probe)(struct device *dev);
 	int (*remove)(struct device *dev);
 	void (*shutdown)(struct device *dev);
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 02/22] ARM: amba: Move reading of periphid to pre_probe()
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
  2015-09-07 12:23 ` [PATCH v4 01/22] driver core: Add pre_probe callback to bus_type Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-07 12:23 ` [PATCH v4 03/22] of/platform: Point to struct device from device node Tomeu Vizoso
                   ` (20 subsequent siblings)
  22 siblings, 0 replies; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, Russell King

Reading the periphid when the Primecell device is registered means that
the apb pclk must be available by then or the device won't be registered
at all.

By moving this code to pre_probe (to be called by the device-driver core
before the device is matched to a driver) we remove any order
requirements.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4:
- Added bus.pre_probe callback so the probes of Primecell devices can be
  deferred if their device IDs cannot be yet read because of the clock
  driver not having probed when they are registered. Maybe this goes
  overboard and the matching information should be in the DT if there is
  one.

Changes in v3: None
Changes in v2: None

 drivers/amba/bus.c | 78 ++++++++++++++++++++++++++----------------------------
 1 file changed, 38 insertions(+), 40 deletions(-)

diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c
index f0099360039e..1cbe43b4acd3 100644
--- a/drivers/amba/bus.c
+++ b/drivers/amba/bus.c
@@ -24,6 +24,8 @@
 
 #define to_amba_driver(d)	container_of(d, struct amba_driver, drv)
 
+static int amba_pre_probe(struct device *dev);
+
 static const struct amba_id *
 amba_lookup(const struct amba_id *table, struct amba_device *dev)
 {
@@ -193,6 +195,7 @@ struct bus_type amba_bustype = {
 	.name		= "amba",
 	.dev_attrs	= amba_dev_attrs,
 	.match		= amba_match,
+	.pre_probe	= amba_pre_probe,
 	.uevent		= amba_uevent,
 	.pm		= &amba_pm,
 };
@@ -336,44 +339,26 @@ static void amba_device_release(struct device *dev)
 	kfree(d);
 }
 
-/**
- *	amba_device_add - add a previously allocated AMBA device structure
- *	@dev: AMBA device allocated by amba_device_alloc
- *	@parent: resource parent for this devices resources
- *
- *	Claim the resource, and read the device cell ID if not already
- *	initialized.  Register the AMBA device with the Linux device
- *	manager.
- */
-int amba_device_add(struct amba_device *dev, struct resource *parent)
+static int amba_pre_probe(struct device *dev)
 {
+	struct amba_device *d = to_amba_device(dev);
 	u32 size;
 	void __iomem *tmp;
 	int i, ret;
 
-	WARN_ON(dev->irq[0] == (unsigned int)-1);
-	WARN_ON(dev->irq[1] == (unsigned int)-1);
-
-	ret = request_resource(parent, &dev->res);
-	if (ret)
-		goto err_out;
-
-	/* Hard-coded primecell ID instead of plug-n-play */
-	if (dev->periphid != 0)
-		goto skip_probe;
+	if (d->periphid != 0)
+		return 0;
 
 	/*
 	 * Dynamically calculate the size of the resource
 	 * and use this for iomap
 	 */
-	size = resource_size(&dev->res);
-	tmp = ioremap(dev->res.start, size);
-	if (!tmp) {
-		ret = -ENOMEM;
-		goto err_release;
-	}
+	size = resource_size(&d->res);
+	tmp = ioremap(d->res.start, size);
+	if (!tmp)
+		return -ENOMEM;
 
-	ret = amba_get_enable_pclk(dev);
+	ret = amba_get_enable_pclk(d);
 	if (ret == 0) {
 		u32 pid, cid;
 
@@ -388,37 +373,50 @@ int amba_device_add(struct amba_device *dev, struct resource *parent)
 			cid |= (readl(tmp + size - 0x10 + 4 * i) & 255) <<
 				(i * 8);
 
-		amba_put_disable_pclk(dev);
+		amba_put_disable_pclk(d);
 
 		if (cid == AMBA_CID || cid == CORESIGHT_CID)
-			dev->periphid = pid;
+			d->periphid = pid;
 
-		if (!dev->periphid)
+		if (!d->periphid)
 			ret = -ENODEV;
 	}
 
 	iounmap(tmp);
 
+	return ret;
+}
+
+/**
+ *	amba_device_add - add a previously allocated AMBA device structure
+ *	@dev: AMBA device allocated by amba_device_alloc
+ *	@parent: resource parent for this devices resources
+ *
+ *	Claim the resource, and register the AMBA device with the Linux device
+ *	manager.
+ */
+int amba_device_add(struct amba_device *dev, struct resource *parent)
+{
+	int ret;
+
+	WARN_ON(dev->irq[0] == (unsigned int)-1);
+	WARN_ON(dev->irq[1] == (unsigned int)-1);
+
+	ret = request_resource(parent, &dev->res);
 	if (ret)
-		goto err_release;
+		return ret;
 
- skip_probe:
 	ret = device_add(&dev->dev);
 	if (ret)
-		goto err_release;
+		return ret;
 
 	if (dev->irq[0])
 		ret = device_create_file(&dev->dev, &dev_attr_irq0);
 	if (ret == 0 && dev->irq[1])
 		ret = device_create_file(&dev->dev, &dev_attr_irq1);
-	if (ret == 0)
-		return ret;
-
-	device_unregister(&dev->dev);
+	if (ret)
+		device_unregister(&dev->dev);
 
- err_release:
-	release_resource(&dev->res);
- err_out:
 	return ret;
 }
 EXPORT_SYMBOL_GPL(amba_device_add);
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 03/22] of/platform: Point to struct device from device node
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
  2015-09-07 12:23 ` [PATCH v4 01/22] driver core: Add pre_probe callback to bus_type Tomeu Vizoso
  2015-09-07 12:23 ` [PATCH v4 02/22] ARM: amba: Move reading of periphid to pre_probe() Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-07 12:23 ` [PATCH v4 04/22] of: add function to allow probing a device from a OF node Tomeu Vizoso
                   ` (19 subsequent siblings)
  22 siblings, 0 replies; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, Frank Rowand, Grant Likely

When adding a platform device, set the device node's device member to
point to it.

This speeds lookups considerably and is safe because we only create one
platform device for any given device node.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/of/platform.c | 13 +++++--------
 include/linux/of.h    |  1 +
 2 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/drivers/of/platform.c b/drivers/of/platform.c
index 1001efaedcb8..baf04d7249bd 100644
--- a/drivers/of/platform.c
+++ b/drivers/of/platform.c
@@ -32,11 +32,6 @@ const struct of_device_id of_default_bus_match_table[] = {
 	{} /* Empty terminated list */
 };
 
-static int of_dev_node_match(struct device *dev, void *data)
-{
-	return dev->of_node == data;
-}
-
 /**
  * of_find_device_by_node - Find the platform_device associated with a node
  * @np: Pointer to device tree node
@@ -45,10 +40,10 @@ static int of_dev_node_match(struct device *dev, void *data)
  */
 struct platform_device *of_find_device_by_node(struct device_node *np)
 {
-	struct device *dev;
+	if (np->device && np->device->bus == &platform_bus_type)
+		return to_platform_device(np->device);
 
-	dev = bus_find_device(&platform_bus_type, NULL, np, of_dev_node_match);
-	return dev ? to_platform_device(dev) : NULL;
+	return NULL;
 }
 EXPORT_SYMBOL(of_find_device_by_node);
 
@@ -192,6 +187,8 @@ static struct platform_device *of_platform_device_create_pdata(
 		goto err_clear_flag;
 	}
 
+	np->device = &dev->dev;
+
 	return dev;
 
 err_clear_flag:
diff --git a/include/linux/of.h b/include/linux/of.h
index 2194b8ca41f9..eb091be0f8ee 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -52,6 +52,7 @@ struct device_node {
 	phandle phandle;
 	const char *full_name;
 	struct fwnode_handle fwnode;
+	struct device *device;
 
 	struct	property *properties;
 	struct	property *deadprops;	/* removed properties */
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 04/22] of: add function to allow probing a device from a OF node
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (2 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 03/22] of/platform: Point to struct device from device node Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-09  1:29   ` Rob Herring
                     ` (2 more replies)
  2015-09-07 12:23 ` [PATCH v4 05/22] gpio: Probe GPIO drivers on demand Tomeu Vizoso
                   ` (18 subsequent siblings)
  22 siblings, 3 replies; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, Frank Rowand, Grant Likely

Walks the OF tree up and finds the closest ancestor that has a struct
device associated with it, probing it if isn't bound to a driver yet.

The above should ensure that the dependency represented by the passed OF
node is available, because probing a device should cause its descendants
to be probed as well (when they get registered).

Subsystems can use this when looking up resources for drivers, to reduce
the chances of deferred probes because of the probing order of devices.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4:
- Rename of_platform_probe to of_device_probe
- Use device_node.device instead of device_node.platform_dev

Changes in v3:
- Set and use device_node.platform_dev instead of reversing the logic to
  find the platform device that encloses a device node.
- Drop the fwnode API to probe firmware nodes and add OF-only API for
  now. I think this same scheme could be used for machines with ACPI,
  but I haven't been able to find one that had to defer its probes because
  of the device probe order.

Changes in v2: None

 drivers/of/device.c       | 58 +++++++++++++++++++++++++++++++++++++++++++++++
 drivers/of/platform.c     |  2 ++
 include/linux/of_device.h |  3 +++
 3 files changed, 63 insertions(+)

diff --git a/drivers/of/device.c b/drivers/of/device.c
index 8b91ea241b10..c32ac7b6fbe2 100644
--- a/drivers/of/device.c
+++ b/drivers/of/device.c
@@ -286,3 +286,61 @@ int of_device_uevent_modalias(struct device *dev, struct kobj_uevent_env *env)
 
 	return 0;
 }
+
+/**
+ * of_device_probe() - Probe device associated with OF node
+ * @np: node to probe
+ *
+ * Probe the device associated with the passed device node.
+ */
+void of_device_probe(struct device_node *np)
+{
+	struct device_node *target;
+	struct device *dev = NULL;
+
+	if (!of_root || !of_node_check_flag(of_root, OF_POPULATED_BUS))
+		return;
+
+	if (!np)
+		return;
+
+	of_node_get(np);
+
+	/* Find the closest ancestor that has a device associated */
+	for (target = np;
+	     !of_node_is_root(target);
+	     target = of_get_next_parent(target))
+		if (target->device) {
+			dev = target->device;
+			break;
+		}
+
+	of_node_put(target);
+
+	if (!dev) {
+		pr_warn("Couldn't find a device for node '%s'\n",
+			of_node_full_name(np));
+		return;
+	}
+
+	/*
+	 * Device is bound or is being probed right now. If we have bad luck
+	 * and the dependency isn't ready when it's needed, deferred probe
+	 * will save us.
+	 */
+	if (dev->driver)
+		return;
+
+	/*
+	 * Probing a device should cause its descendants to be probed as
+	 * well, which includes the passed device node.
+	 */
+	if (device_attach(dev) != 1)
+		/*
+		 * This cannot be a warning for now because clock nodes have a
+		 * compatible string but the clock framework doesn't follow
+		 * the device/driver model yet.
+		 */
+		dev_dbg(dev, "Probe failed for %s\n", of_node_full_name(np));
+}
+EXPORT_SYMBOL_GPL(of_device_probe);
diff --git a/drivers/of/platform.c b/drivers/of/platform.c
index baf04d7249bd..f089d95ac961 100644
--- a/drivers/of/platform.c
+++ b/drivers/of/platform.c
@@ -269,6 +269,8 @@ static struct amba_device *of_amba_device_create(struct device_node *node,
 		goto err_free;
 	}
 
+	node->device = &dev->dev;
+
 	return dev;
 
 err_free:
diff --git a/include/linux/of_device.h b/include/linux/of_device.h
index cc7dd687a89d..da8d489e73ad 100644
--- a/include/linux/of_device.h
+++ b/include/linux/of_device.h
@@ -40,6 +40,7 @@ extern ssize_t of_device_get_modalias(struct device *dev,
 
 extern void of_device_uevent(struct device *dev, struct kobj_uevent_env *env);
 extern int of_device_uevent_modalias(struct device *dev, struct kobj_uevent_env *env);
+extern void of_device_probe(struct device_node *np);
 
 static inline void of_device_node_put(struct device *dev)
 {
@@ -84,6 +85,8 @@ static inline int of_device_uevent_modalias(struct device *dev,
 	return -ENODEV;
 }
 
+static inline void of_device_probe(struct device_node *np) { }
+
 static inline void of_device_node_put(struct device *dev) { }
 
 static inline const struct of_device_id *__of_match_device(
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 05/22] gpio: Probe GPIO drivers on demand
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (3 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 04/22] of: add function to allow probing a device from a OF node Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-25 17:01   ` Linus Walleij
  2015-09-07 12:23 ` [PATCH v4 06/22] gpio: Probe pinctrl devices " Tomeu Vizoso
                   ` (17 subsequent siblings)
  22 siblings, 1 reply; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, linux-gpio, Alexandre Courbot

When looking up a gpiochip through its firmware node, probe it if it
hasn't already.

The goal is to reduce deferred probes to a minimum, as it makes it very
cumbersome to find out why a device failed to probe, and can introduce
very big delays in when a critical device is probed.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/gpio/gpiolib-of.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
index fa6e3c8823d6..9a439dab7a87 100644
--- a/drivers/gpio/gpiolib-of.c
+++ b/drivers/gpio/gpiolib-of.c
@@ -19,6 +19,7 @@
 #include <linux/gpio/consumer.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
+#include <linux/of_device.h>
 #include <linux/of_gpio.h>
 #include <linux/pinctrl/pinctrl.h>
 #include <linux/slab.h>
@@ -95,6 +96,8 @@ struct gpio_desc *of_get_named_gpiod_flags(struct device_node *np,
 		return ERR_PTR(ret);
 	}
 
+	of_device_probe(gg_data.gpiospec.np);
+
 	gpiochip_find(&gg_data, of_gpiochip_find_and_xlate);
 
 	of_node_put(gg_data.gpiospec.np);
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 06/22] gpio: Probe pinctrl devices on demand
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (4 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 05/22] gpio: Probe GPIO drivers on demand Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-25 17:02   ` Linus Walleij
  2015-09-07 12:23 ` [PATCH v4 07/22] regulator: core: Reduce critical area in _regulator_get Tomeu Vizoso
                   ` (16 subsequent siblings)
  22 siblings, 1 reply; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, linux-gpio, Alexandre Courbot

When looking up a pin controller through its OF node, probe it if it
hasn't already.

The goal is to reduce deferred probes to a minimum, as it makes it very
cumbersome to find out why a device failed to probe, and can introduce
very big delays in when a critical device is probed.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/gpio/gpiolib-of.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
index 9a439dab7a87..05da9a56608d 100644
--- a/drivers/gpio/gpiolib-of.c
+++ b/drivers/gpio/gpiolib-of.c
@@ -359,6 +359,8 @@ static int of_gpiochip_add_pin_range(struct gpio_chip *chip)
 		if (ret)
 			break;
 
+		of_device_probe(pinspec.np);
+
 		pctldev = of_pinctrl_get(pinspec.np);
 		if (!pctldev)
 			return -EPROBE_DEFER;
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 07/22] regulator: core: Reduce critical area in _regulator_get
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (5 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 06/22] gpio: Probe pinctrl devices " Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-11 12:10   ` Mark Brown
  2015-09-07 12:23 ` [PATCH v4 08/22] regulator: core: Probe regulators on demand Tomeu Vizoso
                   ` (15 subsequent siblings)
  22 siblings, 1 reply; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, Liam Girdwood

By moving the locking of regulator_list_mutex into regulator_dev_lookup,
where it is iterated over. The reference count of the regulator's device
is increased in case it's unregistered while in use.

In _regulator_get() the regulator_list_mutex mutex was held for most of
the function, but that is only strictly needed to protect the list
lookups.

This change would be useful if for example regulator devices could be
registered on demand when a driver requests them. regulator_register()
could end up being called from within _regulator_get while the lock on
regulator_list_mutex is being held, causing a deadlock.

This sequence illustrates the situation described above:

tegra_hdmi_probe
	_regulator_get
		regulator_dev_lookup
			of_device_probe
				reg_fixed_voltage_probe
					regulator_register

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4:
- Take a reference to the regulator's device to prevent dangling
  pointers

Changes in v3:
- Avoid unlocking the regulator device's mutex if we don't have a device

Changes in v2:
- Acquire regulator device lock before returning from regulator_dev_lookup()

 drivers/regulator/core.c | 56 ++++++++++++++++++++++++++++++++----------------
 1 file changed, 38 insertions(+), 18 deletions(-)

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 7150ff6ef46b..f4aa6cae76d5 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -1340,10 +1340,15 @@ static struct regulator_dev *regulator_dev_lookup(struct device *dev,
 	if (dev && dev->of_node) {
 		node = of_get_regulator(dev, supply);
 		if (node) {
+			mutex_lock(&regulator_list_mutex);
 			list_for_each_entry(r, &regulator_list, list)
 				if (r->dev.parent &&
-					node == r->dev.of_node)
+				    node == r->dev.of_node &&
+				    get_device(&r->dev)) {
+					mutex_unlock(&regulator_list_mutex);
 					return r;
+				}
+			mutex_unlock(&regulator_list_mutex);
 			*ret = -EPROBE_DEFER;
 			return NULL;
 		} else {
@@ -1361,9 +1366,13 @@ static struct regulator_dev *regulator_dev_lookup(struct device *dev,
 	if (dev)
 		devname = dev_name(dev);
 
+	mutex_lock(&regulator_list_mutex);
 	list_for_each_entry(r, &regulator_list, list)
-		if (strcmp(rdev_get_name(r), supply) == 0)
+		if (strcmp(rdev_get_name(r), supply) == 0 &&
+		    get_device(&r->dev)) {
+			mutex_unlock(&regulator_list_mutex);
 			return r;
+		}
 
 	list_for_each_entry(map, &regulator_map_list, list) {
 		/* If the mapping has a device set up it must match */
@@ -1371,9 +1380,13 @@ static struct regulator_dev *regulator_dev_lookup(struct device *dev,
 		    (!devname || strcmp(map->dev_name, devname)))
 			continue;
 
-		if (strcmp(map->supply, supply) == 0)
+		if (strcmp(map->supply, supply) == 0 &&
+		    get_device(&map->regulator->dev)) {
+			mutex_unlock(&regulator_list_mutex);
 			return map->regulator;
+		}
 	}
+	mutex_unlock(&regulator_list_mutex);
 
 
 	return NULL;
@@ -1405,6 +1418,7 @@ static int regulator_resolve_supply(struct regulator_dev *rdev)
 	if (!r) {
 		if (have_full_constraints()) {
 			r = dummy_regulator_rdev;
+			get_device(&r->dev);
 		} else {
 			dev_err(dev, "Failed to resolve %s-supply for %s\n",
 				rdev->supply_name, rdev->desc->name);
@@ -1414,12 +1428,16 @@ static int regulator_resolve_supply(struct regulator_dev *rdev)
 
 	/* Recursively resolve the supply of the supply */
 	ret = regulator_resolve_supply(r);
-	if (ret < 0)
+	if (ret < 0) {
+		put_device(&r->dev);
 		return ret;
+	}
 
 	ret = set_supply(rdev, r);
-	if (ret < 0)
+	if (ret < 0) {
+		put_device(&r->dev);
 		return ret;
+	}
 
 	/* Cascade always-on state to supply */
 	if (_regulator_is_enabled(rdev) && rdev->supply) {
@@ -1455,8 +1473,6 @@ static struct regulator *_regulator_get(struct device *dev, const char *id,
 	else
 		ret = -EPROBE_DEFER;
 
-	mutex_lock(&regulator_list_mutex);
-
 	rdev = regulator_dev_lookup(dev, id, &ret);
 	if (rdev)
 		goto found;
@@ -1468,7 +1484,7 @@ static struct regulator *_regulator_get(struct device *dev, const char *id,
 	 * succeed, so, quit with appropriate error value
 	 */
 	if (ret && ret != -ENODEV)
-		goto out;
+		return regulator;
 
 	if (!devname)
 		devname = "deviceless";
@@ -1482,40 +1498,46 @@ static struct regulator *_regulator_get(struct device *dev, const char *id,
 			devname, id);
 
 		rdev = dummy_regulator_rdev;
+		get_device(&rdev->dev);
 		goto found;
 	/* Don't log an error when called from regulator_get_optional() */
 	} else if (!have_full_constraints() || exclusive) {
 		dev_warn(dev, "dummy supplies not allowed\n");
 	}
 
-	mutex_unlock(&regulator_list_mutex);
 	return regulator;
 
 found:
 	if (rdev->exclusive) {
 		regulator = ERR_PTR(-EPERM);
-		goto out;
+		put_device(&rdev->dev);
+		return regulator;
 	}
 
 	if (exclusive && rdev->open_count) {
 		regulator = ERR_PTR(-EBUSY);
-		goto out;
+		put_device(&rdev->dev);
+		return regulator;
 	}
 
 	ret = regulator_resolve_supply(rdev);
 	if (ret < 0) {
 		regulator = ERR_PTR(ret);
-		goto out;
+		put_device(&rdev->dev);
+		return regulator;
 	}
 
-	if (!try_module_get(rdev->owner))
-		goto out;
+	if (!try_module_get(rdev->owner)) {
+		put_device(&rdev->dev);
+		return regulator;
+	}
 
 	regulator = create_regulator(rdev, dev, id);
 	if (regulator == NULL) {
 		regulator = ERR_PTR(-ENOMEM);
+		put_device(&rdev->dev);
 		module_put(rdev->owner);
-		goto out;
+		return regulator;
 	}
 
 	rdev->open_count++;
@@ -1529,9 +1551,6 @@ found:
 			rdev->use_count = 0;
 	}
 
-out:
-	mutex_unlock(&regulator_list_mutex);
-
 	return regulator;
 }
 
@@ -1629,6 +1648,7 @@ static void _regulator_put(struct regulator *regulator)
 
 	rdev->open_count--;
 	rdev->exclusive = 0;
+	put_device(&rdev->dev);
 	mutex_unlock(&rdev->mutex);
 
 	kfree(regulator->supply_name);
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 08/22] regulator: core: Probe regulators on demand
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (6 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 07/22] regulator: core: Reduce critical area in _regulator_get Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-07 12:23 ` [PATCH v4 09/22] drm: Probe panels " Tomeu Vizoso
                   ` (14 subsequent siblings)
  22 siblings, 0 replies; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, Liam Girdwood

When looking up a regulator through its OF node, probe it if it hasn't
already.

The goal is to reduce deferred probes to a minimum, as it makes it very
cumbersome to find out why a device failed to probe, and can introduce
very big delays in when a critical device is probed.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/regulator/core.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index f4aa6cae76d5..615133f45c76 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -26,6 +26,7 @@
 #include <linux/gpio.h>
 #include <linux/gpio/consumer.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/regmap.h>
 #include <linux/regulator/of_regulator.h>
 #include <linux/regulator/consumer.h>
@@ -1340,6 +1341,7 @@ static struct regulator_dev *regulator_dev_lookup(struct device *dev,
 	if (dev && dev->of_node) {
 		node = of_get_regulator(dev, supply);
 		if (node) {
+			of_device_probe(node);
 			mutex_lock(&regulator_list_mutex);
 			list_for_each_entry(r, &regulator_list, list)
 				if (r->dev.parent &&
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 09/22] drm: Probe panels on demand
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (7 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 08/22] regulator: core: Probe regulators on demand Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-07 12:23 ` [PATCH v4 10/22] drm/tegra: Probe dpaux devices " Tomeu Vizoso
                   ` (13 subsequent siblings)
  22 siblings, 0 replies; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, David Airlie, dri-devel

When looking up a panel through its OF node, probe it if it hasn't
already.

The goal is to reduce deferred probes to a minimum, as it makes it very
cumbersome to find out why a device failed to probe, and can introduce
very big delays in when a critical device is probed.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/gpu/drm/drm_panel.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c
index 2ef988e037b7..ad79a7b9c74d 100644
--- a/drivers/gpu/drm/drm_panel.c
+++ b/drivers/gpu/drm/drm_panel.c
@@ -23,6 +23,7 @@
 
 #include <linux/err.h>
 #include <linux/module.h>
+#include <linux/of_device.h>
 
 #include <drm/drm_crtc.h>
 #include <drm/drm_panel.h>
@@ -80,6 +81,8 @@ struct drm_panel *of_drm_find_panel(struct device_node *np)
 {
 	struct drm_panel *panel;
 
+	of_device_probe(np);
+
 	mutex_lock(&panel_lock);
 
 	list_for_each_entry(panel, &panel_list, list) {
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 10/22] drm/tegra: Probe dpaux devices on demand
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (8 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 09/22] drm: Probe panels " Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-07 12:23 ` [PATCH v4 11/22] i2c: core: Probe i2c adapters and " Tomeu Vizoso
                   ` (12 subsequent siblings)
  22 siblings, 0 replies; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, Terje Bergström, dri-devel,
	linux-tegra, Alexandre Courbot, David Airlie

When looking up a dpaux device through its OF node, probe it if it
hasn't already.

The goal is to reduce deferred probes to a minimum, as it makes it very
cumbersome to find out why a device failed to probe, and can introduce
very big delays in when a critical device is probed.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/gpu/drm/tegra/dpaux.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/gpu/drm/tegra/dpaux.c b/drivers/gpu/drm/tegra/dpaux.c
index 224a7dc8e4ed..96a2eec7e020 100644
--- a/drivers/gpu/drm/tegra/dpaux.c
+++ b/drivers/gpu/drm/tegra/dpaux.c
@@ -12,6 +12,7 @@
 #include <linux/interrupt.h>
 #include <linux/io.h>
 #include <linux/of_gpio.h>
+#include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <linux/reset.h>
 #include <linux/regulator/consumer.h>
@@ -439,6 +440,8 @@ struct tegra_dpaux *tegra_dpaux_find_by_of_node(struct device_node *np)
 {
 	struct tegra_dpaux *dpaux;
 
+	of_device_probe(np);
+
 	mutex_lock(&dpaux_lock);
 
 	list_for_each_entry(dpaux, &dpaux_list, list)
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 11/22] i2c: core: Probe i2c adapters and devices on demand
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (9 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 10/22] drm/tegra: Probe dpaux devices " Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-10-20 10:42   ` Wolfram Sang
  2015-09-07 12:23 ` [PATCH v4 12/22] pwm: Probe PWM chip " Tomeu Vizoso
                   ` (11 subsequent siblings)
  22 siblings, 1 reply; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, Wolfram Sang, linux-i2c

When looking up an i2c adapter or device through its OF node, probe it
if it hasn't already.

The goal is to reduce deferred probes to a minimum, as it makes it very
cumbersome to find out why a device failed to probe, and can introduce
very big delays in when a critical device is probed.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/i2c/i2c-core.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
index 5f89f1e3c2f2..02da3acbbd35 100644
--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -1413,6 +1413,8 @@ struct i2c_client *of_find_i2c_device_by_node(struct device_node *node)
 	struct device *dev;
 	struct i2c_client *client;
 
+	of_device_probe(node);
+
 	dev = bus_find_device(&i2c_bus_type, NULL, node, of_dev_node_match);
 	if (!dev)
 		return NULL;
@@ -1431,6 +1433,8 @@ struct i2c_adapter *of_find_i2c_adapter_by_node(struct device_node *node)
 	struct device *dev;
 	struct i2c_adapter *adapter;
 
+	of_device_probe(node);
+
 	dev = bus_find_device(&i2c_bus_type, NULL, node, of_dev_node_match);
 	if (!dev)
 		return NULL;
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 12/22] pwm: Probe PWM chip devices on demand
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (10 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 11/22] i2c: core: Probe i2c adapters and " Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-07 12:23 ` [PATCH v4 13/22] backlight: Probe backlight " Tomeu Vizoso
                   ` (10 subsequent siblings)
  22 siblings, 0 replies; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, linux-pwm

When looking up a PWM chip through its OF node, probe it if it hasn't
already.

The goal is to reduce deferred probes to a minimum, as it makes it very
cumbersome to find out why a device failed to probe, and can introduce
very big delays in when a critical device is probed.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/pwm/core.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
index 3f9df3ea3350..794a923df0d8 100644
--- a/drivers/pwm/core.c
+++ b/drivers/pwm/core.c
@@ -29,6 +29,7 @@
 #include <linux/device.h>
 #include <linux/debugfs.h>
 #include <linux/seq_file.h>
+#include <linux/of_device.h>
 
 #include <dt-bindings/pwm/pwm.h>
 
@@ -516,6 +517,8 @@ static struct pwm_chip *of_node_to_pwmchip(struct device_node *np)
 {
 	struct pwm_chip *chip;
 
+	of_device_probe(np);
+
 	mutex_lock(&pwm_lock);
 
 	list_for_each_entry(chip, &pwm_chips, list)
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 13/22] backlight: Probe backlight devices on demand
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (11 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 12/22] pwm: Probe PWM chip " Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-07 12:23 ` [PATCH v4 14/22] usb: phy: Probe phy " Tomeu Vizoso
                   ` (9 subsequent siblings)
  22 siblings, 0 replies; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, linux-fbdev, Tomi Valkeinen,
	Jingoo Han, Jean-Christophe Plagniol-Villard, Lee Jones

When looking up a backlight device through its OF node, probe it if it
hasn't already.

The goal is to reduce deferred probes to a minimum, as it makes it very
cumbersome to find out why a device failed to probe, and can introduce
very big delays in when a critical device is probed.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/video/backlight/backlight.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c
index bddc8b17a4d8..9bcdc16eacdf 100644
--- a/drivers/video/backlight/backlight.c
+++ b/drivers/video/backlight/backlight.c
@@ -16,6 +16,7 @@
 #include <linux/err.h>
 #include <linux/fb.h>
 #include <linux/slab.h>
+#include <linux/of_device.h>
 
 #ifdef CONFIG_PMAC_BACKLIGHT
 #include <asm/backlight.h>
@@ -559,6 +560,8 @@ struct backlight_device *of_find_backlight_by_node(struct device_node *node)
 {
 	struct device *dev;
 
+	of_device_probe(node);
+
 	dev = class_find_device(backlight_class, NULL, node, of_parent_match);
 
 	return dev ? to_backlight_device(dev) : NULL;
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 14/22] usb: phy: Probe phy devices on demand
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (12 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 13/22] backlight: Probe backlight " Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-07 12:23 ` [PATCH v4 15/22] clk: Probe clk providers " Tomeu Vizoso
                   ` (8 subsequent siblings)
  22 siblings, 0 replies; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, Greg Kroah-Hartman, linux-usb,
	Felipe Balbi

When looking up a phy through its OF node, probe it if it hasn't
already.

The goal is to reduce deferred probes to a minimum, as it makes it very
cumbersome to find out why a device failed to probe, and can introduce
very big delays in when a critical device is probed.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/usb/phy/phy.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/usb/phy/phy.c b/drivers/usb/phy/phy.c
index 98f75d2842b7..fb0b650bb494 100644
--- a/drivers/usb/phy/phy.c
+++ b/drivers/usb/phy/phy.c
@@ -15,6 +15,7 @@
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 
 #include <linux/usb/phy.h>
 
@@ -196,6 +197,8 @@ struct  usb_phy *devm_usb_get_phy_by_node(struct device *dev,
 		goto err0;
 	}
 
+	of_device_probe(node);
+
 	spin_lock_irqsave(&phy_lock, flags);
 
 	phy = __of_usb_find_phy(node);
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 15/22] clk: Probe clk providers on demand
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (13 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 14/22] usb: phy: Probe phy " Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-07 12:23 ` [PATCH v4 16/22] pinctrl: Probe pinctrl devices " Tomeu Vizoso
                   ` (7 subsequent siblings)
  22 siblings, 0 replies; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, Stephen Boyd, Michael Turquette,
	linux-clk

When looking up a clock through its OF node, probe it if it hasn't
already.

The goal is to reduce deferred probes to a minimum, as it makes it very
cumbersome to find out why a device failed to probe, and can introduce
very big delays in when a critical device is probed.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/clk/clk.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index 43e2c3ad6c31..e5fe02a11c36 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -19,6 +19,7 @@
 #include <linux/list.h>
 #include <linux/slab.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/device.h>
 #include <linux/init.h>
 #include <linux/sched.h>
@@ -3004,6 +3005,8 @@ struct clk *__of_clk_get_from_provider(struct of_phandle_args *clkspec,
 	if (!clkspec)
 		return ERR_PTR(-EINVAL);
 
+	of_device_probe(clkspec->np);
+
 	/* Check if we have such a provider in our array */
 	mutex_lock(&of_clk_mutex);
 	list_for_each_entry(provider, &of_clk_providers, link) {
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 16/22] pinctrl: Probe pinctrl devices on demand
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (14 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 15/22] clk: Probe clk providers " Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-25 17:03   ` Linus Walleij
  2015-09-07 12:23 ` [PATCH v4 17/22] phy: core: Probe phy providers " Tomeu Vizoso
                   ` (6 subsequent siblings)
  22 siblings, 1 reply; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, linux-gpio

When looking up a pin controller through its OF node, probe it if it
hasn't already.

The goal is to reduce deferred probes to a minimum, as it makes it very
cumbersome to find out why a device failed to probe, and can introduce
very big delays in when a critical device is probed.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/pinctrl/devicetree.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/pinctrl/devicetree.c b/drivers/pinctrl/devicetree.c
index fe04e748dfe4..f5340b8e1dbe 100644
--- a/drivers/pinctrl/devicetree.c
+++ b/drivers/pinctrl/devicetree.c
@@ -18,6 +18,7 @@
 
 #include <linux/device.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/pinctrl/pinctrl.h>
 #include <linux/slab.h>
 
@@ -110,6 +111,8 @@ static int dt_to_map_one_config(struct pinctrl *p, const char *statename,
 	struct pinctrl_map *map;
 	unsigned num_maps;
 
+	of_device_probe(np_config);
+
 	/* Find the pin controller containing np_config */
 	np_pctldev = of_node_get(np_config);
 	for (;;) {
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 17/22] phy: core: Probe phy providers on demand
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (15 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 16/22] pinctrl: Probe pinctrl devices " Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-07 12:23 ` [PATCH v4 18/22] dma: of: Probe DMA controllers " Tomeu Vizoso
                   ` (5 subsequent siblings)
  22 siblings, 0 replies; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, Kishon Vijay Abraham I

When looking up a phy provider through its OF node, probe it if it
hasn't already.

The goal is to reduce deferred probes to a minimum, as it makes it very
cumbersome to find out why a device failed to probe, and can introduce
very big delays in when a critical device is probed.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/phy/phy-core.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c
index fc48fac003a6..94e90031d7f3 100644
--- a/drivers/phy/phy-core.c
+++ b/drivers/phy/phy-core.c
@@ -18,6 +18,7 @@
 #include <linux/device.h>
 #include <linux/slab.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/phy/phy.h>
 #include <linux/idr.h>
 #include <linux/pm_runtime.h>
@@ -363,6 +364,8 @@ static struct phy *_of_phy_get(struct device_node *np, int index)
 	if (ret)
 		return ERR_PTR(-ENODEV);
 
+	of_device_probe(args.np);
+
 	mutex_lock(&phy_provider_mutex);
 	phy_provider = of_phy_provider_lookup(args.np);
 	if (IS_ERR(phy_provider) || !try_module_get(phy_provider->owner)) {
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 18/22] dma: of: Probe DMA controllers on demand
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (16 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 17/22] phy: core: Probe phy providers " Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-07 12:23 ` [PATCH v4 19/22] power-supply: Probe power supplies " Tomeu Vizoso
                   ` (4 subsequent siblings)
  22 siblings, 0 replies; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, Dan Williams, dmaengine, Vinod Koul

When looking up a DMA controller through its OF node, probe it if it
hasn't already.

The goal is to reduce deferred probes to a minimum, as it makes it very
cumbersome to find out why a device failed to probe, and can introduce
very big delays in when a critical device is probed.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/dma/of-dma.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/dma/of-dma.c b/drivers/dma/of-dma.c
index 1e1f2986eba8..e899832f7df3 100644
--- a/drivers/dma/of-dma.c
+++ b/drivers/dma/of-dma.c
@@ -16,6 +16,7 @@
 #include <linux/mutex.h>
 #include <linux/slab.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/of_dma.h>
 
 static LIST_HEAD(of_dma_list);
@@ -263,6 +264,8 @@ struct dma_chan *of_dma_request_slave_channel(struct device_node *np,
 		if (of_dma_match_channel(np, name, i, &dma_spec))
 			continue;
 
+		of_device_probe(dma_spec.np);
+
 		mutex_lock(&of_dma_lock);
 		ofdma = of_dma_find_controller(&dma_spec);
 
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 19/22] power-supply: Probe power supplies on demand
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (17 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 18/22] dma: of: Probe DMA controllers " Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-07 12:23 ` [PATCH v4 20/22] driver core: Allow deferring probes until late init Tomeu Vizoso
                   ` (3 subsequent siblings)
  22 siblings, 0 replies; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, Sebastian Reichel,
	Dmitry Eremin-Solenikov, David Woodhouse, linux-pm

When looking up a power supply through its OF node, probe it if it
hasn't already.

The goal is to reduce deferred probes to a minimum, as it makes it very
cumbersome to find out why a device failed to probe, and can introduce
very big delays in when a critical device is probed.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/power/power_supply_core.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c
index 456987c88baa..80bc89f4ae89 100644
--- a/drivers/power/power_supply_core.c
+++ b/drivers/power/power_supply_core.c
@@ -19,6 +19,7 @@
 #include <linux/err.h>
 #include <linux/power_supply.h>
 #include <linux/thermal.h>
+#include <linux/of_device.h>
 #include "power_supply.h"
 
 /* exported for the APM Power driver, APM emulation */
@@ -206,6 +207,8 @@ static int power_supply_find_supply_from_node(struct device_node *supply_node)
 {
 	int error;
 
+	of_device_probe(supply_node);
+
 	/*
 	 * class_for_each_device() either returns its own errors or values
 	 * returned by __power_supply_find_supply_from_node().
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 20/22] driver core: Allow deferring probes until late init
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (18 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 19/22] power-supply: Probe power supplies " Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-11 12:17   ` Mark Brown
  2015-09-07 12:23 ` [PATCH v4 21/22] driver core: Start processing deferred probes earlier Tomeu Vizoso
                   ` (2 subsequent siblings)
  22 siblings, 1 reply; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, Greg Kroah-Hartman

Add a field to struct device that instructs the device-driver core to
defer the probe of this device until the late_initcall level.

By letting all built-in drivers to register before starting to probe, we
can avoid any deferred probes by probing dependencies on demand.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>

---

Changes in v4:
- Add Kconfig DELAY_DEVICE_PROBES to allow disabling delayed probing in
  machines with initcalls that depend on devices probing at a given time.

Changes in v3: None
Changes in v2: None

 drivers/base/Kconfig   | 18 ++++++++++++++++++
 drivers/base/dd.c      |  7 +++++++
 include/linux/device.h |  2 ++
 3 files changed, 27 insertions(+)

diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig
index 98504ec99c7d..44b5d33b1f49 100644
--- a/drivers/base/Kconfig
+++ b/drivers/base/Kconfig
@@ -324,4 +324,22 @@ config CMA_ALIGNMENT
 
 endif
 
+config DELAY_DEVICE_PROBES
+	bool "Allow delaying the probe of some devices"
+	default y
+	help
+	  Devices can be matched to a driver and probed from the moment they
+	  are registered, but early during boot their probes are likely to be
+	  deferred because some dependency isn't available yet because most
+	  drivers haven't been registered yet.
+
+	  Enabling this option allows the device registration code to delay the
+	  probing of a specific device until device_initcall_sync, when all
+	  built-in drivers have been registered already.
+
+	  In some platforms there may be implicit assumptions about when some
+	  devices are probed, so enabling this option could cause problems there.
+
+	  If unsure, say Y here.
+
 endmenu
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index faf60bfc46b3..0654fb771a53 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -417,6 +417,13 @@ int driver_probe_device(struct device_driver *drv, struct device *dev)
 	if (!device_is_registered(dev))
 		return -ENODEV;
 
+#if IS_ENABLED(CONFIG_DELAY_DEVICE_PROBES)
+	if (!driver_deferred_probe_enable && dev->probe_late) {
+		driver_deferred_probe_add(dev);
+		return 0;
+	}
+#endif
+
 	pr_debug("bus: '%s': %s: matched device %s with driver %s\n",
 		 drv->bus->name, __func__, dev_name(dev), drv->name);
 
diff --git a/include/linux/device.h b/include/linux/device.h
index d8be07bc9c3f..fe5c50ffd7d3 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -748,6 +748,7 @@ struct device_dma_parameters {
  *
  * @offline_disabled: If set, the device is permanently online.
  * @offline:	Set after successful invocation of bus type's .offline().
+ * @probe_late:	If set, device will be probed in the late initcall level.
  *
  * At the lowest level, every device in a Linux system is represented by an
  * instance of struct device. The device structure contains the information
@@ -832,6 +833,7 @@ struct device {
 
 	bool			offline_disabled:1;
 	bool			offline:1;
+	bool			probe_late:1;
 };
 
 static inline struct device *kobj_to_dev(struct kobject *kobj)
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 21/22] driver core: Start processing deferred probes earlier
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (19 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 20/22] driver core: Allow deferring probes until late init Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-11 12:24   ` Mark Brown
  2015-09-07 12:23 ` [PATCH v4 22/22] of/platform: Defer probes of registered devices Tomeu Vizoso
  2015-09-07 20:50 ` [PATCH v4 0/22] On-demand device probing Rob Herring
  22 siblings, 1 reply; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, Greg Kroah-Hartman

Some initcalls in the late level assume that some devices will have
already probed without explicitly checking for that.

After the recent move to defer most device probes when they are
registered, pressure increased in the late initcall level.

By starting the processing of the deferred queue in device_initcall_sync
we increase the chances that the initcalls mentioned before will find
the devices they depend on to have already probed.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4:
- Start processing deferred probes in device_initcall_sync

Changes in v3: None
Changes in v2: None

 drivers/base/dd.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index 0654fb771a53..b6a22cff78cf 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -176,7 +176,7 @@ static void driver_deferred_probe_trigger(void)
  *
  * We don't want to get in the way when the bulk of drivers are getting probed.
  * Instead, this initcall makes sure that deferred probing is delayed until
- * late_initcall time.
+ * device_initcall_sync time.
  */
 static int deferred_probe_initcall(void)
 {
@@ -190,7 +190,7 @@ static int deferred_probe_initcall(void)
 	flush_workqueue(deferred_wq);
 	return 0;
 }
-late_initcall(deferred_probe_initcall);
+device_initcall_sync(deferred_probe_initcall);
 
 static void driver_bound(struct device *dev)
 {
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v4 22/22] of/platform: Defer probes of registered devices
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (20 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 21/22] driver core: Start processing deferred probes earlier Tomeu Vizoso
@ 2015-09-07 12:23 ` Tomeu Vizoso
  2015-09-07 20:50 ` [PATCH v4 0/22] On-demand device probing Rob Herring
  22 siblings, 0 replies; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-07 12:23 UTC (permalink / raw)
  To: linux-kernel
  Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Tomeu Vizoso, Frank Rowand, Grant Likely

Instead of trying to match and probe platform and AMBA devices right
after each is registered, delay their probes until device_initcall_sync.

This means that devices will start probing once all built-in drivers
have registered, and after all platform and AMBA devices from the DT
have been registered already.

This allows us to prevent deferred probes by probing dependencies on
demand.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---

Changes in v4:
- Also defer probes of AMBA devices registered from the DT as they can
  also request resources.

Changes in v3: None
Changes in v2: None

 drivers/of/platform.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/of/platform.c b/drivers/of/platform.c
index f089d95ac961..a9397ce838ea 100644
--- a/drivers/of/platform.c
+++ b/drivers/of/platform.c
@@ -164,7 +164,8 @@ static struct platform_device *of_platform_device_create_pdata(
 					struct device_node *np,
 					const char *bus_id,
 					void *platform_data,
-					struct device *parent)
+					struct device *parent,
+					bool probe_late)
 {
 	struct platform_device *dev;
 
@@ -178,6 +179,7 @@ static struct platform_device *of_platform_device_create_pdata(
 
 	dev->dev.bus = &platform_bus_type;
 	dev->dev.platform_data = platform_data;
+	dev->dev.probe_late = probe_late;
 	of_dma_configure(&dev->dev, dev->dev.of_node);
 	of_msi_configure(&dev->dev, dev->dev.of_node);
 
@@ -209,7 +211,8 @@ struct platform_device *of_platform_device_create(struct device_node *np,
 					    const char *bus_id,
 					    struct device *parent)
 {
-	return of_platform_device_create_pdata(np, bus_id, NULL, parent);
+	return of_platform_device_create_pdata(np, bus_id, NULL, parent,
+					       false);
 }
 EXPORT_SYMBOL(of_platform_device_create);
 
@@ -240,6 +243,7 @@ static struct amba_device *of_amba_device_create(struct device_node *node,
 	dev->dev.of_node = of_node_get(node);
 	dev->dev.parent = parent ? : &platform_bus;
 	dev->dev.platform_data = platform_data;
+	dev->dev.probe_late = true;
 	if (bus_id)
 		dev_set_name(&dev->dev, "%s", bus_id);
 	else
@@ -358,7 +362,8 @@ static int of_platform_bus_create(struct device_node *bus,
 		return 0;
 	}
 
-	dev = of_platform_device_create_pdata(bus, bus_id, platform_data, parent);
+	dev = of_platform_device_create_pdata(bus, bus_id, platform_data,
+					      parent, true);
 	if (!dev || !of_match_node(matches, bus))
 		return 0;
 
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 0/22] On-demand device probing
  2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
                   ` (21 preceding siblings ...)
  2015-09-07 12:23 ` [PATCH v4 22/22] of/platform: Defer probes of registered devices Tomeu Vizoso
@ 2015-09-07 20:50 ` Rob Herring
  2015-09-08  7:30   ` Tomeu Vizoso
  22 siblings, 1 reply; 43+ messages in thread
From: Rob Herring @ 2015-09-07 20:50 UTC (permalink / raw)
  To: Tomeu Vizoso
  Cc: linux-kernel, Rob Herring, Stephen Warren,
	Javier Martinez Canillas, Mark Brown, Thierry Reding,
	Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
	Linus Walleij, linux-acpi, Arnd Bergmann, linux-fbdev,
	Linux USB List, Felipe Balbi, Linux PWM List,
	Terje Bergström, Greg Kroah-Hartman, Jingoo Han,
	David Airlie, Michael Turquette, linux-clk, dmaengine,
	Jean-Christophe Plagniol-Villard, Tomi Valkeinen, Grant Likely,
	Sebastian Reichel, Frank Rowand, Alexandre Courbot, linux-pm,
	Stephen Boyd, Wolfram Sang, Russell King, linux-gpio, Vinod Koul,
	Liam Girdwood, dri-devel, Lee Jones, linux-tegra, Dan Williams,
	Dmitry Eremin-Solenikov, David Woodhouse, Kishon Vijay Abraham I,
	linux-i2c

On Mon, Sep 7, 2015 at 7:23 AM, Tomeu Vizoso <tomeu.vizoso@collabora.com> wrote:
> Hello,
>
> I have a problem with the panel on my Tegra Chromebook taking longer
> than expected to be ready during boot (Stéphane Marchesin reported what
> is basically the same issue in [0]), and have looked into ordered
> probing as a better way of solving this than moving nodes around in the
> DT or playing with initcall levels and linking order.
>
> While reading the thread [1] that Alexander Holler started with his
> series to make probing order deterministic, it occurred to me that it
> should be possible to achieve the same by probing devices as they are
> referenced by other devices.
>
> This basically reuses the information that is already implicit in the
> probe() implementations, saving us from refactoring existing drivers or
> adding information to DTBs.
>
> During review of v1 of this series Linus Walleij suggested that it
> should be the device driver core to make sure that dependencies are
> ready before probing a device. I gave this idea a try [2] but Mark Brown
> pointed out to the logic duplication between the resource acquisition
> and dependency discovery code paths (though I think it's fairly minor).
>
> To address that code duplication I experimented with Arnd's devm_probe
> [3] concept of having drivers declare their dependencies instead of
> acquiring them during probe, and while it worked [4], I don't think we
> end up winning anything when compared to just probing devices on-demand
> from resource getters.
>
> One remaining objection is to the "sprinkling" of calls to
> of_device_probe() in the resource getters of each subsystem, but I think
> it's the right thing to do given that the storage of resources is
> currently subsystem-specific.
>
> We could avoid the above by moving resource storage into the core, but I
> don't think there's a compelling case for that.
>
> I have tested this on boards with Tegra, iMX.6, Exynos, Rockchip and
> OMAP SoCs, and these patches were enough to eliminate all the deferred
> probes (except one in PandaBoard because omap_dma_system doesn't have a
> firmware node as of yet).
>
> Have submitted a branch [5] with only these patches on top of thursday's
> linux-next to kernelci.org and I don't see any issues that could be
> caused by them. For some reason it currently has more passes than the
> version of -next it's based on!
>
> With this series I get the kernel to output to the panel in 0.5s,
> instead of 2.8s.
>
> Regards,
>
> Tomeu
>
> [0] http://lists.freedesktop.org/archives/dri-devel/2014-August/066527.html
>
> [1] https://lkml.org/lkml/2014/5/12/452
>
> [2] https://lkml.org/lkml/2015/6/17/305
>
> [3] http://article.gmane.org/gmane.linux.ports.arm.kernel/277689
>
> [4] https://lkml.org/lkml/2015/7/21/441a
>
> [5] https://git.collabora.com/cgit/user/tomeu/linux.git/log/?h=on-demand-probes-v6
>
> [6] http://kernelci.org/boot/all/job/collabora/kernel/v4.2-11902-g25d80c927f8b/
>
> [7] http://kernelci.org/boot/all/job/next/kernel/next-20150903/
>
> Changes in v4:
> - Added bus.pre_probe callback so the probes of Primecell devices can be
>   deferred if their device IDs cannot be yet read because of the clock
>   driver not having probed when they are registered. Maybe this goes
>   overboard and the matching information should be in the DT if there is
>   one.

Seems overboard to me or at least a separate problem. Most clocks have
to be setup before the driver model simply because timers depend on
clocks usually.

Rob

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 0/22] On-demand device probing
  2015-09-07 20:50 ` [PATCH v4 0/22] On-demand device probing Rob Herring
@ 2015-09-08  7:30   ` Tomeu Vizoso
  2015-09-09  1:33     ` Rob Herring
  0 siblings, 1 reply; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-08  7:30 UTC (permalink / raw)
  To: Rob Herring
  Cc: linux-kernel, Rob Herring, Stephen Warren,
	Javier Martinez Canillas, Mark Brown, Thierry Reding,
	Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
	Linus Walleij, linux-acpi, Arnd Bergmann, linux-fbdev,
	Linux USB List, Felipe Balbi, Linux PWM List,
	Terje Bergström, Greg Kroah-Hartman, Jingoo Han,
	David Airlie, Michael Turquette, linux-clk, dmaengine,
	Jean-Christophe Plagniol-Villard, Tomi Valkeinen, Grant Likely,
	Sebastian Reichel, Frank Rowand, Alexandre Courbot, linux-pm,
	Stephen Boyd, Wolfram Sang, Russell King, linux-gpio, Vinod Koul,
	Liam Girdwood, dri-devel, Lee Jones, linux-tegra, Dan Williams,
	Dmitry Eremin-Solenikov, David Woodhouse, Kishon Vijay Abraham I,
	linux-i2c

On 7 September 2015 at 22:50, Rob Herring <robherring2@gmail.com> wrote:
> On Mon, Sep 7, 2015 at 7:23 AM, Tomeu Vizoso <tomeu.vizoso@collabora.com> wrote:
>> Hello,
>>
>> I have a problem with the panel on my Tegra Chromebook taking longer
>> than expected to be ready during boot (Stéphane Marchesin reported what
>> is basically the same issue in [0]), and have looked into ordered
>> probing as a better way of solving this than moving nodes around in the
>> DT or playing with initcall levels and linking order.
>>
>> While reading the thread [1] that Alexander Holler started with his
>> series to make probing order deterministic, it occurred to me that it
>> should be possible to achieve the same by probing devices as they are
>> referenced by other devices.
>>
>> This basically reuses the information that is already implicit in the
>> probe() implementations, saving us from refactoring existing drivers or
>> adding information to DTBs.
>>
>> During review of v1 of this series Linus Walleij suggested that it
>> should be the device driver core to make sure that dependencies are
>> ready before probing a device. I gave this idea a try [2] but Mark Brown
>> pointed out to the logic duplication between the resource acquisition
>> and dependency discovery code paths (though I think it's fairly minor).
>>
>> To address that code duplication I experimented with Arnd's devm_probe
>> [3] concept of having drivers declare their dependencies instead of
>> acquiring them during probe, and while it worked [4], I don't think we
>> end up winning anything when compared to just probing devices on-demand
>> from resource getters.
>>
>> One remaining objection is to the "sprinkling" of calls to
>> of_device_probe() in the resource getters of each subsystem, but I think
>> it's the right thing to do given that the storage of resources is
>> currently subsystem-specific.
>>
>> We could avoid the above by moving resource storage into the core, but I
>> don't think there's a compelling case for that.
>>
>> I have tested this on boards with Tegra, iMX.6, Exynos, Rockchip and
>> OMAP SoCs, and these patches were enough to eliminate all the deferred
>> probes (except one in PandaBoard because omap_dma_system doesn't have a
>> firmware node as of yet).
>>
>> Have submitted a branch [5] with only these patches on top of thursday's
>> linux-next to kernelci.org and I don't see any issues that could be
>> caused by them. For some reason it currently has more passes than the
>> version of -next it's based on!
>>
>> With this series I get the kernel to output to the panel in 0.5s,
>> instead of 2.8s.
>>
>> Regards,
>>
>> Tomeu
>>
>> [0] http://lists.freedesktop.org/archives/dri-devel/2014-August/066527.html
>>
>> [1] https://lkml.org/lkml/2014/5/12/452
>>
>> [2] https://lkml.org/lkml/2015/6/17/305
>>
>> [3] http://article.gmane.org/gmane.linux.ports.arm.kernel/277689
>>
>> [4] https://lkml.org/lkml/2015/7/21/441a
>>
>> [5] https://git.collabora.com/cgit/user/tomeu/linux.git/log/?h=on-demand-probes-v6
>>
>> [6] http://kernelci.org/boot/all/job/collabora/kernel/v4.2-11902-g25d80c927f8b/
>>
>> [7] http://kernelci.org/boot/all/job/next/kernel/next-20150903/
>>
>> Changes in v4:
>> - Added bus.pre_probe callback so the probes of Primecell devices can be
>>   deferred if their device IDs cannot be yet read because of the clock
>>   driver not having probed when they are registered. Maybe this goes
>>   overboard and the matching information should be in the DT if there is
>>   one.
>
> Seems overboard to me or at least a separate problem.

It's a separate problem but this was preventing the series from
working on a few boards.

> Most clocks have
> to be setup before the driver model simply because timers depend on
> clocks usually.

Yes, but in this case the apb clocks for the primecell devices are
implemented in a normal platform driver (vexpress_osc_driver), instead
of using CLK_OF_DECLARE.

Regards,

Tomeu

> Rob
> --
> 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/

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 04/22] of: add function to allow probing a device from a OF node
  2015-09-07 12:23 ` [PATCH v4 04/22] of: add function to allow probing a device from a OF node Tomeu Vizoso
@ 2015-09-09  1:29   ` Rob Herring
  2015-09-10 14:53     ` Tomeu Vizoso
  2015-09-11 12:08   ` Mark Brown
  2015-10-21 11:29   ` Geert Uytterhoeven
  2 siblings, 1 reply; 43+ messages in thread
From: Rob Herring @ 2015-09-09  1:29 UTC (permalink / raw)
  To: Tomeu Vizoso, linux-kernel
  Cc: Stephen Warren, Javier Martinez Canillas, Mark Brown,
	Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Frank Rowand, Grant Likely

On 09/07/2015 07:23 AM, Tomeu Vizoso wrote:
> Walks the OF tree up and finds the closest ancestor that has a struct
> device associated with it, probing it if isn't bound to a driver yet.
> 
> The above should ensure that the dependency represented by the passed OF
> node is available, because probing a device should cause its descendants
> to be probed as well (when they get registered).
> 
> Subsystems can use this when looking up resources for drivers, to reduce
> the chances of deferred probes because of the probing order of devices.
> 
> Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>

Looks pretty good to me. One comment below.

[...]

> diff --git a/drivers/of/platform.c b/drivers/of/platform.c
> index baf04d7249bd..f089d95ac961 100644
> --- a/drivers/of/platform.c
> +++ b/drivers/of/platform.c
> @@ -269,6 +269,8 @@ static struct amba_device *of_amba_device_create(struct device_node *node,
>  		goto err_free;
>  	}
>  
> +	node->device = &dev->dev;
> +

This seems oddly placed. Can you move to patch 3?

>  	return dev;
>  
>  err_free:
> diff --git a/include/linux/of_device.h b/include/linux/of_device.h
> index cc7dd687a89d..da8d489e73ad 100644
> --- a/include/linux/of_device.h
> +++ b/include/linux/of_device.h
> @@ -40,6 +40,7 @@ extern ssize_t of_device_get_modalias(struct device *dev,
>  
>  extern void of_device_uevent(struct device *dev, struct kobj_uevent_env *env);
>  extern int of_device_uevent_modalias(struct device *dev, struct kobj_uevent_env *env);
> +extern void of_device_probe(struct device_node *np);
>  
>  static inline void of_device_node_put(struct device *dev)
>  {
> @@ -84,6 +85,8 @@ static inline int of_device_uevent_modalias(struct device *dev,
>  	return -ENODEV;
>  }
>  
> +static inline void of_device_probe(struct device_node *np) { }
> +
>  static inline void of_device_node_put(struct device *dev) { }
>  
>  static inline const struct of_device_id *__of_match_device(
> 


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 0/22] On-demand device probing
  2015-09-08  7:30   ` Tomeu Vizoso
@ 2015-09-09  1:33     ` Rob Herring
  2015-09-09  9:40       ` Tomeu Vizoso
  0 siblings, 1 reply; 43+ messages in thread
From: Rob Herring @ 2015-09-09  1:33 UTC (permalink / raw)
  To: Tomeu Vizoso
  Cc: linux-kernel, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, linux-fbdev, Linux USB List, Felipe Balbi,
	Linux PWM List, Terje Bergström, Greg Kroah-Hartman,
	Jingoo Han, David Airlie, Michael Turquette, linux-clk,
	dmaengine, Jean-Christophe Plagniol-Villard, Tomi Valkeinen,
	Grant Likely, Sebastian Reichel, Frank Rowand, Alexandre Courbot,
	linux-pm, Stephen Boyd, Wolfram Sang, Russell King, linux-gpio,
	Vinod Koul, Liam Girdwood, dri-devel, Lee Jones, linux-tegra,
	Dan Williams, Dmitry Eremin-Solenikov, David Woodhouse,
	Kishon Vijay Abraham I, linux-i2c

On 09/08/2015 02:30 AM, Tomeu Vizoso wrote:
> On 7 September 2015 at 22:50, Rob Herring <robherring2@gmail.com> wrote:
>> On Mon, Sep 7, 2015 at 7:23 AM, Tomeu Vizoso <tomeu.vizoso@collabora.com> wrote:
>>> Hello,
>>>
>>> I have a problem with the panel on my Tegra Chromebook taking longer
>>> than expected to be ready during boot (Stéphane Marchesin reported what
>>> is basically the same issue in [0]), and have looked into ordered
>>> probing as a better way of solving this than moving nodes around in the
>>> DT or playing with initcall levels and linking order.
>>>
>>> While reading the thread [1] that Alexander Holler started with his
>>> series to make probing order deterministic, it occurred to me that it
>>> should be possible to achieve the same by probing devices as they are
>>> referenced by other devices.
>>>
>>> This basically reuses the information that is already implicit in the
>>> probe() implementations, saving us from refactoring existing drivers or
>>> adding information to DTBs.
>>>
>>> During review of v1 of this series Linus Walleij suggested that it
>>> should be the device driver core to make sure that dependencies are
>>> ready before probing a device. I gave this idea a try [2] but Mark Brown
>>> pointed out to the logic duplication between the resource acquisition
>>> and dependency discovery code paths (though I think it's fairly minor).
>>>
>>> To address that code duplication I experimented with Arnd's devm_probe
>>> [3] concept of having drivers declare their dependencies instead of
>>> acquiring them during probe, and while it worked [4], I don't think we
>>> end up winning anything when compared to just probing devices on-demand
>>> from resource getters.
>>>
>>> One remaining objection is to the "sprinkling" of calls to
>>> of_device_probe() in the resource getters of each subsystem, but I think
>>> it's the right thing to do given that the storage of resources is
>>> currently subsystem-specific.
>>>
>>> We could avoid the above by moving resource storage into the core, but I
>>> don't think there's a compelling case for that.
>>>
>>> I have tested this on boards with Tegra, iMX.6, Exynos, Rockchip and
>>> OMAP SoCs, and these patches were enough to eliminate all the deferred
>>> probes (except one in PandaBoard because omap_dma_system doesn't have a
>>> firmware node as of yet).
>>>
>>> Have submitted a branch [5] with only these patches on top of thursday's
>>> linux-next to kernelci.org and I don't see any issues that could be
>>> caused by them. For some reason it currently has more passes than the
>>> version of -next it's based on!
>>>
>>> With this series I get the kernel to output to the panel in 0.5s,
>>> instead of 2.8s.
>>>
>>> Regards,
>>>
>>> Tomeu
>>>
>>> [0] http://lists.freedesktop.org/archives/dri-devel/2014-August/066527.html
>>>
>>> [1] https://lkml.org/lkml/2014/5/12/452
>>>
>>> [2] https://lkml.org/lkml/2015/6/17/305
>>>
>>> [3] http://article.gmane.org/gmane.linux.ports.arm.kernel/277689
>>>
>>> [4] https://lkml.org/lkml/2015/7/21/441a
>>>
>>> [5] https://git.collabora.com/cgit/user/tomeu/linux.git/log/?h=on-demand-probes-v6
>>>
>>> [6] http://kernelci.org/boot/all/job/collabora/kernel/v4.2-11902-g25d80c927f8b/
>>>
>>> [7] http://kernelci.org/boot/all/job/next/kernel/next-20150903/
>>>
>>> Changes in v4:
>>> - Added bus.pre_probe callback so the probes of Primecell devices can be
>>>   deferred if their device IDs cannot be yet read because of the clock
>>>   driver not having probed when they are registered. Maybe this goes
>>>   overboard and the matching information should be in the DT if there is
>>>   one.
>>
>> Seems overboard to me or at least a separate problem.
> 
> It's a separate problem but this was preventing the series from
> working on a few boards.

What is the failure? Not booting? Fixing not working would certainly not
be overboard.

> 
>> Most clocks have
>> to be setup before the driver model simply because timers depend on
>> clocks usually.
> 
> Yes, but in this case the apb clocks for the primecell devices are
> implemented in a normal platform driver (vexpress_osc_driver), instead
> of using CLK_OF_DECLARE.

Okay.

Rob


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 0/22] On-demand device probing
  2015-09-09  1:33     ` Rob Herring
@ 2015-09-09  9:40       ` Tomeu Vizoso
  0 siblings, 0 replies; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-09  9:40 UTC (permalink / raw)
  To: Rob Herring
  Cc: linux-kernel, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, linux-fbdev, Linux USB List, Felipe Balbi,
	Linux PWM List, Terje Bergström, Greg Kroah-Hartman,
	Jingoo Han, David Airlie, Michael Turquette, linux-clk,
	dmaengine, Jean-Christophe Plagniol-Villard, Tomi Valkeinen,
	Grant Likely, Sebastian Reichel, Frank Rowand, Alexandre Courbot,
	linux-pm, Stephen Boyd, Wolfram Sang, Russell King, linux-gpio,
	Vinod Koul, Liam Girdwood, dri-devel, Lee Jones, linux-tegra,
	Dan Williams, Dmitry Eremin-Solenikov, David Woodhouse,
	Kishon Vijay Abraham I, linux-i2c

On 9 September 2015 at 03:33, Rob Herring <robh@kernel.org> wrote:
> On 09/08/2015 02:30 AM, Tomeu Vizoso wrote:
>> On 7 September 2015 at 22:50, Rob Herring <robherring2@gmail.com> wrote:
>>> On Mon, Sep 7, 2015 at 7:23 AM, Tomeu Vizoso <tomeu.vizoso@collabora.com> wrote:
>>>> Hello,
>>>>
>>>> I have a problem with the panel on my Tegra Chromebook taking longer
>>>> than expected to be ready during boot (Stéphane Marchesin reported what
>>>> is basically the same issue in [0]), and have looked into ordered
>>>> probing as a better way of solving this than moving nodes around in the
>>>> DT or playing with initcall levels and linking order.
>>>>
>>>> While reading the thread [1] that Alexander Holler started with his
>>>> series to make probing order deterministic, it occurred to me that it
>>>> should be possible to achieve the same by probing devices as they are
>>>> referenced by other devices.
>>>>
>>>> This basically reuses the information that is already implicit in the
>>>> probe() implementations, saving us from refactoring existing drivers or
>>>> adding information to DTBs.
>>>>
>>>> During review of v1 of this series Linus Walleij suggested that it
>>>> should be the device driver core to make sure that dependencies are
>>>> ready before probing a device. I gave this idea a try [2] but Mark Brown
>>>> pointed out to the logic duplication between the resource acquisition
>>>> and dependency discovery code paths (though I think it's fairly minor).
>>>>
>>>> To address that code duplication I experimented with Arnd's devm_probe
>>>> [3] concept of having drivers declare their dependencies instead of
>>>> acquiring them during probe, and while it worked [4], I don't think we
>>>> end up winning anything when compared to just probing devices on-demand
>>>> from resource getters.
>>>>
>>>> One remaining objection is to the "sprinkling" of calls to
>>>> of_device_probe() in the resource getters of each subsystem, but I think
>>>> it's the right thing to do given that the storage of resources is
>>>> currently subsystem-specific.
>>>>
>>>> We could avoid the above by moving resource storage into the core, but I
>>>> don't think there's a compelling case for that.
>>>>
>>>> I have tested this on boards with Tegra, iMX.6, Exynos, Rockchip and
>>>> OMAP SoCs, and these patches were enough to eliminate all the deferred
>>>> probes (except one in PandaBoard because omap_dma_system doesn't have a
>>>> firmware node as of yet).
>>>>
>>>> Have submitted a branch [5] with only these patches on top of thursday's
>>>> linux-next to kernelci.org and I don't see any issues that could be
>>>> caused by them. For some reason it currently has more passes than the
>>>> version of -next it's based on!
>>>>
>>>> With this series I get the kernel to output to the panel in 0.5s,
>>>> instead of 2.8s.
>>>>
>>>> Regards,
>>>>
>>>> Tomeu
>>>>
>>>> [0] http://lists.freedesktop.org/archives/dri-devel/2014-August/066527.html
>>>>
>>>> [1] https://lkml.org/lkml/2014/5/12/452
>>>>
>>>> [2] https://lkml.org/lkml/2015/6/17/305
>>>>
>>>> [3] http://article.gmane.org/gmane.linux.ports.arm.kernel/277689
>>>>
>>>> [4] https://lkml.org/lkml/2015/7/21/441a
>>>>
>>>> [5] https://git.collabora.com/cgit/user/tomeu/linux.git/log/?h=on-demand-probes-v6
>>>>
>>>> [6] http://kernelci.org/boot/all/job/collabora/kernel/v4.2-11902-g25d80c927f8b/
>>>>
>>>> [7] http://kernelci.org/boot/all/job/next/kernel/next-20150903/
>>>>
>>>> Changes in v4:
>>>> - Added bus.pre_probe callback so the probes of Primecell devices can be
>>>>   deferred if their device IDs cannot be yet read because of the clock
>>>>   driver not having probed when they are registered. Maybe this goes
>>>>   overboard and the matching information should be in the DT if there is
>>>>   one.
>>>
>>> Seems overboard to me or at least a separate problem.
>>
>> It's a separate problem but this was preventing the series from
>> working on a few boards.
>
> What is the failure? Not booting? Fixing not working would certainly not
> be overboard.

On the device I was testing on (qemu's vexpress-a15 machine) the
machine booted and I was able to open a ssh session, but serial was
broken among other AMBA devices:

/memory-controller@2b0a0000
/memory-controller@7ffd0000
/dma@7ffb0000
/smb/motherboard/iofpga@3,00000000/sysctl@020000
/smb/motherboard/iofpga@3,00000000/aaci@040000
/smb/motherboard/iofpga@3,00000000/mmci@050000
/smb/motherboard/iofpga@3,00000000/kmi@060000
/smb/motherboard/iofpga@3,00000000/kmi@070000
/smb/motherboard/iofpga@3,00000000/uart@090000
/smb/motherboard/iofpga@3,00000000/uart@0a0000
/smb/motherboard/iofpga@3,00000000/uart@0b0000
/smb/motherboard/iofpga@3,00000000/uart@0c0000
/smb/motherboard/iofpga@3,00000000/wdt@0f0000
/smb/motherboard/iofpga@3,00000000/timer@110000
/smb/motherboard/iofpga@3,00000000/timer@120000
/smb/motherboard/iofpga@3,00000000/rtc@170000
/smb/motherboard/iofpga@3,00000000/clcd@1f0000

Another way of avoiding this particular problem would be not delaying
the probe of devices in the configuration bus, by doing something like
this:

diff --git a/drivers/bus/vexpress-config.c b/drivers/bus/vexpress-config.c
index 6575c0fe6a4e..eda293869cd3 100644
--- a/drivers/bus/vexpress-config.c
+++ b/drivers/bus/vexpress-config.c
@@ -181,7 +181,7 @@ static int vexpress_config_populate(struct
device_node *node)
        if (WARN_ON(!parent))
                return -ENODEV;

-       return of_platform_populate(node, NULL, NULL, parent);
+       return of_platform_populate_early(node, NULL, NULL, parent);
 }

 static int __init vexpress_config_init(void)

But I think this would be papering over the underlying issue and it
would be better to have proper explicit dependencies.

Regards,

Tomeu

>>> Most clocks have
>>> to be setup before the driver model simply because timers depend on
>>> clocks usually.
>>
>> Yes, but in this case the apb clocks for the primecell devices are
>> implemented in a normal platform driver (vexpress_osc_driver), instead
>> of using CLK_OF_DECLARE.
>
> Okay.
>
> Rob
>
> --
> 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/

^ permalink raw reply related	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 04/22] of: add function to allow probing a device from a OF node
  2015-09-09  1:29   ` Rob Herring
@ 2015-09-10 14:53     ` Tomeu Vizoso
  0 siblings, 0 replies; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-10 14:53 UTC (permalink / raw)
  To: Rob Herring
  Cc: linux-kernel, Stephen Warren, Javier Martinez Canillas,
	Mark Brown, Thierry Reding, Rafael J. Wysocki, linux-arm-kernel,
	Dmitry Torokhov, devicetree, Linus Walleij, linux-acpi,
	Arnd Bergmann, Frank Rowand, Grant Likely

On 9 September 2015 at 03:29, Rob Herring <robh@kernel.org> wrote:
> On 09/07/2015 07:23 AM, Tomeu Vizoso wrote:
>> Walks the OF tree up and finds the closest ancestor that has a struct
>> device associated with it, probing it if isn't bound to a driver yet.
>>
>> The above should ensure that the dependency represented by the passed OF
>> node is available, because probing a device should cause its descendants
>> to be probed as well (when they get registered).
>>
>> Subsystems can use this when looking up resources for drivers, to reduce
>> the chances of deferred probes because of the probing order of devices.
>>
>> Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
>
> Looks pretty good to me. One comment below.
>
> [...]
>
>> diff --git a/drivers/of/platform.c b/drivers/of/platform.c
>> index baf04d7249bd..f089d95ac961 100644
>> --- a/drivers/of/platform.c
>> +++ b/drivers/of/platform.c
>> @@ -269,6 +269,8 @@ static struct amba_device *of_amba_device_create(struct device_node *node,
>>               goto err_free;
>>       }
>>
>> +     node->device = &dev->dev;
>> +
>
> This seems oddly placed. Can you move to patch 3?

Sure, no problem. Besides this, are you ok with the rest of the series?

Regards,

Tomeu

>>       return dev;
>>
>>  err_free:
>> diff --git a/include/linux/of_device.h b/include/linux/of_device.h
>> index cc7dd687a89d..da8d489e73ad 100644
>> --- a/include/linux/of_device.h
>> +++ b/include/linux/of_device.h
>> @@ -40,6 +40,7 @@ extern ssize_t of_device_get_modalias(struct device *dev,
>>
>>  extern void of_device_uevent(struct device *dev, struct kobj_uevent_env *env);
>>  extern int of_device_uevent_modalias(struct device *dev, struct kobj_uevent_env *env);
>> +extern void of_device_probe(struct device_node *np);
>>
>>  static inline void of_device_node_put(struct device *dev)
>>  {
>> @@ -84,6 +85,8 @@ static inline int of_device_uevent_modalias(struct device *dev,
>>       return -ENODEV;
>>  }
>>
>> +static inline void of_device_probe(struct device_node *np) { }
>> +
>>  static inline void of_device_node_put(struct device *dev) { }
>>
>>  static inline const struct of_device_id *__of_match_device(
>>
>
> --
> 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/

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 01/22] driver core: Add pre_probe callback to bus_type
  2015-09-07 12:23 ` [PATCH v4 01/22] driver core: Add pre_probe callback to bus_type Tomeu Vizoso
@ 2015-09-11 12:04   ` Mark Brown
  0 siblings, 0 replies; 43+ messages in thread
From: Mark Brown @ 2015-09-11 12:04 UTC (permalink / raw)
  To: Tomeu Vizoso
  Cc: linux-kernel, Rob Herring, Stephen Warren,
	Javier Martinez Canillas, Thierry Reding, Rafael J. Wysocki,
	linux-arm-kernel, Dmitry Torokhov, devicetree, Linus Walleij,
	linux-acpi, Arnd Bergmann, Greg Kroah-Hartman

[-- Attachment #1: Type: text/plain, Size: 631 bytes --]

On Mon, Sep 07, 2015 at 02:23:26PM +0200, Tomeu Vizoso wrote:

> +	if (dev->bus && dev->bus->pre_probe) {
> +		ret = dev->bus->pre_probe(dev);
> +		if (ret) {
> +			if (ret == -EPROBE_DEFER)
> +				driver_deferred_probe_add(dev);
> +			ret = 0;
> +			goto out_unlock;
> +		}
> +	}

So if we get an error other than -EPROBE_DEFER we silently ignore it?
That seems surprising and at least worth a comment.

> +	if (dev->bus && dev->bus->pre_probe) {
> +		ret = dev->bus->pre_probe(dev);
> +		if (ret) {
> +			if (ret == -EPROBE_DEFER)
> +				driver_deferred_probe_add(dev);
> +			goto out;
> +		}
> +	}

That's more what I'd expect.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 04/22] of: add function to allow probing a device from a OF node
  2015-09-07 12:23 ` [PATCH v4 04/22] of: add function to allow probing a device from a OF node Tomeu Vizoso
  2015-09-09  1:29   ` Rob Herring
@ 2015-09-11 12:08   ` Mark Brown
  2015-09-16  8:17     ` Tomeu Vizoso
  2015-10-21 11:29   ` Geert Uytterhoeven
  2 siblings, 1 reply; 43+ messages in thread
From: Mark Brown @ 2015-09-11 12:08 UTC (permalink / raw)
  To: Tomeu Vizoso
  Cc: linux-kernel, Rob Herring, Stephen Warren,
	Javier Martinez Canillas, Thierry Reding, Rafael J. Wysocki,
	linux-arm-kernel, Dmitry Torokhov, devicetree, Linus Walleij,
	linux-acpi, Arnd Bergmann, Frank Rowand, Grant Likely

[-- Attachment #1: Type: text/plain, Size: 503 bytes --]

On Mon, Sep 07, 2015 at 02:23:29PM +0200, Tomeu Vizoso wrote:
> Walks the OF tree up and finds the closest ancestor that has a struct
> device associated with it, probing it if isn't bound to a driver yet.

> The above should ensure that the dependency represented by the passed OF
> node is available, because probing a device should cause its descendants
> to be probed as well (when they get registered).

I'm still not seeing how this works for MFDs where the MFD binding is
present directly in DT.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 07/22] regulator: core: Reduce critical area in _regulator_get
  2015-09-07 12:23 ` [PATCH v4 07/22] regulator: core: Reduce critical area in _regulator_get Tomeu Vizoso
@ 2015-09-11 12:10   ` Mark Brown
  0 siblings, 0 replies; 43+ messages in thread
From: Mark Brown @ 2015-09-11 12:10 UTC (permalink / raw)
  To: Tomeu Vizoso
  Cc: linux-kernel, Rob Herring, Stephen Warren,
	Javier Martinez Canillas, Thierry Reding, Rafael J. Wysocki,
	linux-arm-kernel, Dmitry Torokhov, devicetree, Linus Walleij,
	linux-acpi, Arnd Bergmann, Liam Girdwood

[-- Attachment #1: Type: text/plain, Size: 1004 bytes --]

On Mon, Sep 07, 2015 at 02:23:32PM +0200, Tomeu Vizoso wrote:
> By moving the locking of regulator_list_mutex into regulator_dev_lookup,
> where it is iterated over. The reference count of the regulator's device
> is increased in case it's unregistered while in use.
> 
> In _regulator_get() the regulator_list_mutex mutex was held for most of
> the function, but that is only strictly needed to protect the list
> lookups.
> 
> This change would be useful if for example regulator devices could be
> registered on demand when a driver requests them. regulator_register()
> could end up being called from within _regulator_get while the lock on
> regulator_list_mutex is being held, causing a deadlock.

The fix for this is to convert the code to use the list maintained by
the driver core for regulator class to iterate the regulators rather
than fiddle about with the locking.  I'm pretty sure the current locking
has problems and I'm worried that this may make those problems worse.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 20/22] driver core: Allow deferring probes until late init
  2015-09-07 12:23 ` [PATCH v4 20/22] driver core: Allow deferring probes until late init Tomeu Vizoso
@ 2015-09-11 12:17   ` Mark Brown
  2015-09-14  9:04     ` Tomeu Vizoso
  0 siblings, 1 reply; 43+ messages in thread
From: Mark Brown @ 2015-09-11 12:17 UTC (permalink / raw)
  To: Tomeu Vizoso
  Cc: linux-kernel, Rob Herring, Stephen Warren,
	Javier Martinez Canillas, Thierry Reding, Rafael J. Wysocki,
	linux-arm-kernel, Dmitry Torokhov, devicetree, Linus Walleij,
	linux-acpi, Arnd Bergmann, Greg Kroah-Hartman

[-- Attachment #1: Type: text/plain, Size: 632 bytes --]

On Mon, Sep 07, 2015 at 02:23:45PM +0200, Tomeu Vizoso wrote:
> Add a field to struct device that instructs the device-driver core to
> defer the probe of this device until the late_initcall level.
> 
> By letting all built-in drivers to register before starting to probe, we
> can avoid any deferred probes by probing dependencies on demand.

Is this not going to resut in massive churn as we go through and set
this flag for a massive proportion of drivers?  Could we mitigate this
by having a first pass at setting this per subsystem or something so
that we get a good proportion of drivers with changes in core code?

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 21/22] driver core: Start processing deferred probes earlier
  2015-09-07 12:23 ` [PATCH v4 21/22] driver core: Start processing deferred probes earlier Tomeu Vizoso
@ 2015-09-11 12:24   ` Mark Brown
  2015-09-15 13:16     ` Tomeu Vizoso
  0 siblings, 1 reply; 43+ messages in thread
From: Mark Brown @ 2015-09-11 12:24 UTC (permalink / raw)
  To: Tomeu Vizoso
  Cc: linux-kernel, Rob Herring, Stephen Warren,
	Javier Martinez Canillas, Thierry Reding, Rafael J. Wysocki,
	linux-arm-kernel, Dmitry Torokhov, devicetree, Linus Walleij,
	linux-acpi, Arnd Bergmann, Greg Kroah-Hartman

[-- Attachment #1: Type: text/plain, Size: 1224 bytes --]

On Mon, Sep 07, 2015 at 02:23:46PM +0200, Tomeu Vizoso wrote:
> Some initcalls in the late level assume that some devices will have
> already probed without explicitly checking for that.
> 
> After the recent move to defer most device probes when they are
> registered, pressure increased in the late initcall level.
> 
> By starting the processing of the deferred queue in device_initcall_sync
> we increase the chances that the initcalls mentioned before will find
> the devices they depend on to have already probed.

Which cases do we have that are outside the driver model and thus
affected by this?  USB gadgets are one case I'm aware of, and cpufreq is
still problematic.  I'm wondering if it might be tractable to address
the actual problems with the remaining reliance on init ordering here.

I'm also wondering if we might end up running into situations where this
makes the problem with havinng to defer probes more of an issue on some
systems - since we start trying earlier while we are still doing our
first pass initialisation we could end up deferring some device then
retrying it a bunch of times while going through the earlier phases of
init as we continue to register more devices.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 20/22] driver core: Allow deferring probes until late init
  2015-09-11 12:17   ` Mark Brown
@ 2015-09-14  9:04     ` Tomeu Vizoso
  0 siblings, 0 replies; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-14  9:04 UTC (permalink / raw)
  To: Mark Brown
  Cc: linux-kernel, Rob Herring, Stephen Warren,
	Javier Martinez Canillas, Thierry Reding, Rafael J. Wysocki,
	linux-arm-kernel, Dmitry Torokhov, devicetree, Linus Walleij,
	linux-acpi, Arnd Bergmann, Greg Kroah-Hartman

On 11 September 2015 at 14:17, Mark Brown <broonie@kernel.org> wrote:
> On Mon, Sep 07, 2015 at 02:23:45PM +0200, Tomeu Vizoso wrote:
>> Add a field to struct device that instructs the device-driver core to
>> defer the probe of this device until the late_initcall level.
>>
>> By letting all built-in drivers to register before starting to probe, we
>> can avoid any deferred probes by probing dependencies on demand.
>
> Is this not going to resut in massive churn as we go through and set
> this flag for a massive proportion of drivers?  Could we mitigate this
> by having a first pass at setting this per subsystem or something so
> that we get a good proportion of drivers with changes in core code?

I think this flag should be only set during the initial registration
of devices (eg. acpi_device_add, of_device_add, etc), as by delaying
the probe of those we are automatically delaying the probe of the
rest.

Regards,

Tomeu

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 21/22] driver core: Start processing deferred probes earlier
  2015-09-11 12:24   ` Mark Brown
@ 2015-09-15 13:16     ` Tomeu Vizoso
  0 siblings, 0 replies; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-15 13:16 UTC (permalink / raw)
  To: Mark Brown
  Cc: linux-kernel, Rob Herring, Stephen Warren,
	Javier Martinez Canillas, Thierry Reding, Rafael J. Wysocki,
	linux-arm-kernel, Dmitry Torokhov, devicetree, Linus Walleij,
	linux-acpi, Arnd Bergmann, Greg Kroah-Hartman

On 11 September 2015 at 14:24, Mark Brown <broonie@kernel.org> wrote:
> On Mon, Sep 07, 2015 at 02:23:46PM +0200, Tomeu Vizoso wrote:
>> Some initcalls in the late level assume that some devices will have
>> already probed without explicitly checking for that.
>>
>> After the recent move to defer most device probes when they are
>> registered, pressure increased in the late initcall level.
>>
>> By starting the processing of the deferred queue in device_initcall_sync
>> we increase the chances that the initcalls mentioned before will find
>> the devices they depend on to have already probed.
>
> Which cases do we have that are outside the driver model and thus
> affected by this?  USB gadgets are one case I'm aware of, and cpufreq is
> still problematic.  I'm wondering if it might be tractable to address
> the actual problems with the remaining reliance on init ordering here.

Actually, I don't know of any specific case that needs this commit.
The present series without this patch passes on all the boards in
kernelci, but Grygorii Strashko argued for it during the review of the
earlier version of this series:
http://lkml.kernel.org/g/55CE3D04.8000607@ti.com

IMO it would be better to not apply this patch until the need arises,
and even then, it may be better to make the dependencies explicit
instead of relying on implicit ordering and messing with the link
order.

> I'm also wondering if we might end up running into situations where this
> makes the problem with havinng to defer probes more of an issue on some
> systems - since we start trying earlier while we are still doing our
> first pass initialisation we could end up deferring some device then
> retrying it a bunch of times while going through the earlier phases of
> init as we continue to register more devices.

With the rest of the series this shouldn't happen as all/most deferred
probes should be avoided.

Regards,

Tomeu

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 04/22] of: add function to allow probing a device from a OF node
  2015-09-11 12:08   ` Mark Brown
@ 2015-09-16  8:17     ` Tomeu Vizoso
  2015-09-16 19:35       ` Mark Brown
  0 siblings, 1 reply; 43+ messages in thread
From: Tomeu Vizoso @ 2015-09-16  8:17 UTC (permalink / raw)
  To: Mark Brown
  Cc: linux-kernel, Rob Herring, Stephen Warren,
	Javier Martinez Canillas, Thierry Reding, Rafael J. Wysocki,
	linux-arm-kernel, Dmitry Torokhov, devicetree, Linus Walleij,
	linux-acpi, Arnd Bergmann, Frank Rowand, Grant Likely,
	Alan Stern

On 11 September 2015 at 14:08, Mark Brown <broonie@kernel.org> wrote:
> On Mon, Sep 07, 2015 at 02:23:29PM +0200, Tomeu Vizoso wrote:
>> Walks the OF tree up and finds the closest ancestor that has a struct
>> device associated with it, probing it if isn't bound to a driver yet.
>
>> The above should ensure that the dependency represented by the passed OF
>> node is available, because probing a device should cause its descendants
>> to be probed as well (when they get registered).
>
> I'm still not seeing how this works for MFDs where the MFD binding is
> present directly in DT.

The same problem should happen with simple-bus nodes such as
nvidia,tegra124-host1x in which children devices are represented in
the DT (and registered right after their parent) and depend on their
parent for their operation.

Looked at why it wasn't being a problem in my tests and Thierry
mentioned that tegra_host1x_driver takes care of the synchronization
between the bus and their children. So children would make use of the
bus only once it has finished probing and is ready to work (the init
and exit callbacks in host1x_client_ops signal when the bus is safe to
use).

AFAICS, this is a must currently for correct operation in simple-bus
and simple-mfd situations, because probing order is currently very
unpredictable and it's totally possible for the probing of a child to
start before the probing of its parent has finished (if async probing
is enabled or if a module is loaded that registers a child's driver at
the wrong time).

I would prefer if the core would take care of making sure that parents
are always probed before their children, but the unconditional locking
of the parent device stands in the way.

Regards,

Tomeu

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 04/22] of: add function to allow probing a device from a OF node
  2015-09-16  8:17     ` Tomeu Vizoso
@ 2015-09-16 19:35       ` Mark Brown
  0 siblings, 0 replies; 43+ messages in thread
From: Mark Brown @ 2015-09-16 19:35 UTC (permalink / raw)
  To: Tomeu Vizoso
  Cc: linux-kernel, Rob Herring, Stephen Warren,
	Javier Martinez Canillas, Thierry Reding, Rafael J. Wysocki,
	linux-arm-kernel, Dmitry Torokhov, devicetree, Linus Walleij,
	linux-acpi, Arnd Bergmann, Frank Rowand, Grant Likely,
	Alan Stern

[-- Attachment #1: Type: text/plain, Size: 892 bytes --]

On Wed, Sep 16, 2015 at 10:17:43AM +0200, Tomeu Vizoso wrote:

> AFAICS, this is a must currently for correct operation in simple-bus
> and simple-mfd situations, because probing order is currently very
> unpredictable and it's totally possible for the probing of a child to
> start before the probing of its parent has finished (if async probing
> is enabled or if a module is loaded that registers a child's driver at
> the wrong time).

Hrm.  That's worrying for devices that rely on peering into their parent
device for things...

> I would prefer if the core would take care of making sure that parents
> are always probed before their children, but the unconditional locking
> of the parent device stands in the way.

In the MFD case this is another reason for not putting the device
structure into the DT - if it isn't then the ordering is controlled by
the device being instantiated.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 05/22] gpio: Probe GPIO drivers on demand
  2015-09-07 12:23 ` [PATCH v4 05/22] gpio: Probe GPIO drivers on demand Tomeu Vizoso
@ 2015-09-25 17:01   ` Linus Walleij
  0 siblings, 0 replies; 43+ messages in thread
From: Linus Walleij @ 2015-09-25 17:01 UTC (permalink / raw)
  To: Tomeu Vizoso
  Cc: linux-kernel, Rob Herring, Stephen Warren,
	Javier Martinez Canillas, Mark Brown, Thierry Reding,
	Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
	ACPI Devel Maling List, Arnd Bergmann, linux-gpio,
	Alexandre Courbot

On Mon, Sep 7, 2015 at 5:23 AM, Tomeu Vizoso <tomeu.vizoso@collabora.com> wrote:

> When looking up a gpiochip through its firmware node, probe it if it
> hasn't already.
>
> The goal is to reduce deferred probes to a minimum, as it makes it very
> cumbersome to find out why a device failed to probe, and can introduce
> very big delays in when a critical device is probed.
>
> Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
> ---
>
> Changes in v4: None
> Changes in v3: None
> Changes in v2: None

Acked-by: Linus Walleij <linus.walleij@linaro.org>

That is if the whole thing goes in as-is for the GPIO parts.

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 06/22] gpio: Probe pinctrl devices on demand
  2015-09-07 12:23 ` [PATCH v4 06/22] gpio: Probe pinctrl devices " Tomeu Vizoso
@ 2015-09-25 17:02   ` Linus Walleij
  0 siblings, 0 replies; 43+ messages in thread
From: Linus Walleij @ 2015-09-25 17:02 UTC (permalink / raw)
  To: Tomeu Vizoso
  Cc: linux-kernel, Rob Herring, Stephen Warren,
	Javier Martinez Canillas, Mark Brown, Thierry Reding,
	Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
	ACPI Devel Maling List, Arnd Bergmann, linux-gpio,
	Alexandre Courbot

On Mon, Sep 7, 2015 at 5:23 AM, Tomeu Vizoso <tomeu.vizoso@collabora.com> wrote:

Nit: prefix patch with "pinctrl:"

> When looking up a pin controller through its OF node, probe it if it
> hasn't already.
>
> The goal is to reduce deferred probes to a minimum, as it makes it very
> cumbersome to find out why a device failed to probe, and can introduce
> very big delays in when a critical device is probed.
>
> Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
> ---
>
> Changes in v4: None
> Changes in v3: None
> Changes in v2: None

Acked-by: Linus Walleij <linus.walleij@linaro.org>

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 16/22] pinctrl: Probe pinctrl devices on demand
  2015-09-07 12:23 ` [PATCH v4 16/22] pinctrl: Probe pinctrl devices " Tomeu Vizoso
@ 2015-09-25 17:03   ` Linus Walleij
  0 siblings, 0 replies; 43+ messages in thread
From: Linus Walleij @ 2015-09-25 17:03 UTC (permalink / raw)
  To: Tomeu Vizoso
  Cc: linux-kernel, Rob Herring, Stephen Warren,
	Javier Martinez Canillas, Mark Brown, Thierry Reding,
	Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
	ACPI Devel Maling List, Arnd Bergmann, linux-gpio

On Mon, Sep 7, 2015 at 5:23 AM, Tomeu Vizoso <tomeu.vizoso@collabora.com> wrote:

> When looking up a pin controller through its OF node, probe it if it
> hasn't already.
>
> The goal is to reduce deferred probes to a minimum, as it makes it very
> cumbersome to find out why a device failed to probe, and can introduce
> very big delays in when a critical device is probed.
>
> Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
> ---
>
> Changes in v4: None
> Changes in v3: None
> Changes in v2: None

Acked-by: Linus Walleij <linus.walleij@linaro.org>

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 11/22] i2c: core: Probe i2c adapters and devices on demand
  2015-09-07 12:23 ` [PATCH v4 11/22] i2c: core: Probe i2c adapters and " Tomeu Vizoso
@ 2015-10-20 10:42   ` Wolfram Sang
  0 siblings, 0 replies; 43+ messages in thread
From: Wolfram Sang @ 2015-10-20 10:42 UTC (permalink / raw)
  To: Tomeu Vizoso
  Cc: linux-kernel, Rob Herring, Stephen Warren,
	Javier Martinez Canillas, Mark Brown, Thierry Reding,
	Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
	Linus Walleij, linux-acpi, Arnd Bergmann, linux-i2c

[-- Attachment #1: Type: text/plain, Size: 597 bytes --]

On Mon, Sep 07, 2015 at 02:23:36PM +0200, Tomeu Vizoso wrote:
> When looking up an i2c adapter or device through its OF node, probe it
> if it hasn't already.
> 
> The goal is to reduce deferred probes to a minimum, as it makes it very
> cumbersome to find out why a device failed to probe, and can introduce
> very big delays in when a critical device is probed.
> 
> Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>

If the I2C part stays that simple and the core part of the series is
accepted, then:

Acked-by: Wolfram Sang <wsa@the-dreams.de>

Thanks,

   Wolfram


[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v4 04/22] of: add function to allow probing a device from a OF node
  2015-09-07 12:23 ` [PATCH v4 04/22] of: add function to allow probing a device from a OF node Tomeu Vizoso
  2015-09-09  1:29   ` Rob Herring
  2015-09-11 12:08   ` Mark Brown
@ 2015-10-21 11:29   ` Geert Uytterhoeven
  2 siblings, 0 replies; 43+ messages in thread
From: Geert Uytterhoeven @ 2015-10-21 11:29 UTC (permalink / raw)
  To: Tomeu Vizoso
  Cc: linux-kernel, Rob Herring, Stephen Warren,
	Javier Martinez Canillas, Mark Brown, Thierry Reding,
	Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
	Linus Walleij, ACPI Devel Maling List, Arnd Bergmann,
	Frank Rowand, Grant Likely, Linux-sh list

Hi Tomeu,

On Mon, Sep 7, 2015 at 2:23 PM, Tomeu Vizoso <tomeu.vizoso@collabora.com> wrote:
> Walks the OF tree up and finds the closest ancestor that has a struct
> device associated with it, probing it if isn't bound to a driver yet.
>
> The above should ensure that the dependency represented by the passed OF
> node is available, because probing a device should cause its descendants
> to be probed as well (when they get registered).
>
> Subsystems can use this when looking up resources for drivers, to reduce
> the chances of deferred probes because of the probing order of devices.
>
> Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
> ---
>
> Changes in v4:
> - Rename of_platform_probe to of_device_probe
> - Use device_node.device instead of device_node.platform_dev
>
> Changes in v3:
> - Set and use device_node.platform_dev instead of reversing the logic to
>   find the platform device that encloses a device node.
> - Drop the fwnode API to probe firmware nodes and add OF-only API for
>   now. I think this same scheme could be used for machines with ACPI,
>   but I haven't been able to find one that had to defer its probes because
>   of the device probe order.
>
> Changes in v2: None
>
>  drivers/of/device.c       | 58 +++++++++++++++++++++++++++++++++++++++++++++++
>  drivers/of/platform.c     |  2 ++
>  include/linux/of_device.h |  3 +++
>  3 files changed, 63 insertions(+)
>
> diff --git a/drivers/of/device.c b/drivers/of/device.c
> index 8b91ea241b10..c32ac7b6fbe2 100644
> --- a/drivers/of/device.c
> +++ b/drivers/of/device.c
> @@ -286,3 +286,61 @@ int of_device_uevent_modalias(struct device *dev, struct kobj_uevent_env *env)
>
>         return 0;
>  }
> +
> +/**
> + * of_device_probe() - Probe device associated with OF node
> + * @np: node to probe
> + *
> + * Probe the device associated with the passed device node.
> + */
> +void of_device_probe(struct device_node *np)
> +{
> +       struct device_node *target;
> +       struct device *dev = NULL;
> +
> +       if (!of_root || !of_node_check_flag(of_root, OF_POPULATED_BUS))
> +               return;
> +
> +       if (!np)
> +               return;
> +
> +       of_node_get(np);
> +
> +       /* Find the closest ancestor that has a device associated */
> +       for (target = np;
> +            !of_node_is_root(target);
> +            target = of_get_next_parent(target))
> +               if (target->device) {
> +                       dev = target->device;
> +                       break;
> +               }
> +
> +       of_node_put(target);
> +
> +       if (!dev) {
> +               pr_warn("Couldn't find a device for node '%s'\n",
> +                       of_node_full_name(np));

This is triggered for all devices with clocks instantiated through
CLK_OF_DECLARE().
E.g. on r8a7791/koelsch ("... | sort | uniq -c"):

      1 Couldn't find a device for node '/clocks/audio_clk_a'
      1 Couldn't find a device for node '/clocks/audio_clk_b'
      1 Couldn't find a device for node '/clocks/audio_clk_c'
      2 Couldn't find a device for node '/clocks/cpg_clocks@e6150000'
      1 Couldn't find a device for node '/clocks/m2_clk'
      2 Couldn't find a device for node '/clocks/mstp0_clks@e6150130'
     34 Couldn't find a device for node '/clocks/mstp10_clks@e6150998'
      2 Couldn't find a device for node '/clocks/mstp1_clks@e6150134'
      2 Couldn't find a device for node '/clocks/mstp2_clks@e6150138'
     10 Couldn't find a device for node '/clocks/mstp3_clks@e615013c'
      3 Couldn't find a device for node '/clocks/mstp5_clks@e6150144'
      8 Couldn't find a device for node '/clocks/mstp7_clks@e615014c'
      4 Couldn't find a device for node '/clocks/mstp8_clks@e6150990'
     22 Couldn't find a device for node '/clocks/mstp9_clks@e6150994'
      1 Couldn't find a device for node '/clocks/pcie_bus_clk'

Corresponding DTS is arch/arm/boot/dts/r8a7791.dtsi.

> +               return;
> +       }

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply	[flat|nested] 43+ messages in thread

end of thread, other threads:[~2015-10-21 11:29 UTC | newest]

Thread overview: 43+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-09-07 12:23 [PATCH v4 0/22] On-demand device probing Tomeu Vizoso
2015-09-07 12:23 ` [PATCH v4 01/22] driver core: Add pre_probe callback to bus_type Tomeu Vizoso
2015-09-11 12:04   ` Mark Brown
2015-09-07 12:23 ` [PATCH v4 02/22] ARM: amba: Move reading of periphid to pre_probe() Tomeu Vizoso
2015-09-07 12:23 ` [PATCH v4 03/22] of/platform: Point to struct device from device node Tomeu Vizoso
2015-09-07 12:23 ` [PATCH v4 04/22] of: add function to allow probing a device from a OF node Tomeu Vizoso
2015-09-09  1:29   ` Rob Herring
2015-09-10 14:53     ` Tomeu Vizoso
2015-09-11 12:08   ` Mark Brown
2015-09-16  8:17     ` Tomeu Vizoso
2015-09-16 19:35       ` Mark Brown
2015-10-21 11:29   ` Geert Uytterhoeven
2015-09-07 12:23 ` [PATCH v4 05/22] gpio: Probe GPIO drivers on demand Tomeu Vizoso
2015-09-25 17:01   ` Linus Walleij
2015-09-07 12:23 ` [PATCH v4 06/22] gpio: Probe pinctrl devices " Tomeu Vizoso
2015-09-25 17:02   ` Linus Walleij
2015-09-07 12:23 ` [PATCH v4 07/22] regulator: core: Reduce critical area in _regulator_get Tomeu Vizoso
2015-09-11 12:10   ` Mark Brown
2015-09-07 12:23 ` [PATCH v4 08/22] regulator: core: Probe regulators on demand Tomeu Vizoso
2015-09-07 12:23 ` [PATCH v4 09/22] drm: Probe panels " Tomeu Vizoso
2015-09-07 12:23 ` [PATCH v4 10/22] drm/tegra: Probe dpaux devices " Tomeu Vizoso
2015-09-07 12:23 ` [PATCH v4 11/22] i2c: core: Probe i2c adapters and " Tomeu Vizoso
2015-10-20 10:42   ` Wolfram Sang
2015-09-07 12:23 ` [PATCH v4 12/22] pwm: Probe PWM chip " Tomeu Vizoso
2015-09-07 12:23 ` [PATCH v4 13/22] backlight: Probe backlight " Tomeu Vizoso
2015-09-07 12:23 ` [PATCH v4 14/22] usb: phy: Probe phy " Tomeu Vizoso
2015-09-07 12:23 ` [PATCH v4 15/22] clk: Probe clk providers " Tomeu Vizoso
2015-09-07 12:23 ` [PATCH v4 16/22] pinctrl: Probe pinctrl devices " Tomeu Vizoso
2015-09-25 17:03   ` Linus Walleij
2015-09-07 12:23 ` [PATCH v4 17/22] phy: core: Probe phy providers " Tomeu Vizoso
2015-09-07 12:23 ` [PATCH v4 18/22] dma: of: Probe DMA controllers " Tomeu Vizoso
2015-09-07 12:23 ` [PATCH v4 19/22] power-supply: Probe power supplies " Tomeu Vizoso
2015-09-07 12:23 ` [PATCH v4 20/22] driver core: Allow deferring probes until late init Tomeu Vizoso
2015-09-11 12:17   ` Mark Brown
2015-09-14  9:04     ` Tomeu Vizoso
2015-09-07 12:23 ` [PATCH v4 21/22] driver core: Start processing deferred probes earlier Tomeu Vizoso
2015-09-11 12:24   ` Mark Brown
2015-09-15 13:16     ` Tomeu Vizoso
2015-09-07 12:23 ` [PATCH v4 22/22] of/platform: Defer probes of registered devices Tomeu Vizoso
2015-09-07 20:50 ` [PATCH v4 0/22] On-demand device probing Rob Herring
2015-09-08  7:30   ` Tomeu Vizoso
2015-09-09  1:33     ` Rob Herring
2015-09-09  9:40       ` Tomeu Vizoso

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).