* [PATCH v7 01/20] driver core: handle -EPROBE_DEFER from bus_type.match()
2015-09-29 9:10 [PATCH v7 0/20] On-demand device probing Tomeu Vizoso
@ 2015-09-29 9:10 ` Tomeu Vizoso
2015-10-17 6:51 ` Greg Kroah-Hartman
2015-09-29 9:10 ` [PATCH v7 02/20] ARM: amba: Move reading of periphid to amba_match() Tomeu Vizoso
` (15 subsequent siblings)
16 siblings, 1 reply; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
Russell King, Linus Walleij, Ulf Hansson, linux-acpi,
Arnd Bergmann, Tomeu Vizoso
Lets implementations of the match() callback in struct bus_type to
return errors and if it's -EPROBE_DEFER then queue the device for
deferred probing.
This is useful to buses such as AMBA in which devices are registered
before their matching information can be retrieved from the HW
(typically because a clock driver hasn't probed yet).
Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---
drivers/base/dd.c | 24 ++++++++++++++++++++++--
include/linux/device.h | 2 +-
2 files changed, 23 insertions(+), 3 deletions(-)
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index be0eb4639128..7dc04ee81c8b 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -488,6 +488,7 @@ static int __device_attach_driver(struct device_driver *drv, void *_data)
struct device_attach_data *data = _data;
struct device *dev = data->dev;
bool async_allowed;
+ int ret;
/*
* Check if device has already been claimed. This may
@@ -498,8 +499,17 @@ static int __device_attach_driver(struct device_driver *drv, void *_data)
if (dev->driver)
return -EBUSY;
- if (!driver_match_device(drv, dev))
+ ret = driver_match_device(drv, dev);
+ if (!ret)
return 0;
+ else if (ret < 0) {
+ if (ret == -EPROBE_DEFER) {
+ dev_dbg(dev, "Device match requests probe deferral\n");
+ driver_deferred_probe_add(dev);
+ } else
+ dev_warn(dev, "Bus failed to match device: %d", ret);
+ return ret;
+ }
async_allowed = driver_allows_async_probing(drv);
@@ -619,6 +629,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
@@ -630,8 +641,17 @@ static int __driver_attach(struct device *dev, void *data)
* is an error.
*/
- if (!driver_match_device(drv, dev))
+ ret = driver_match_device(drv, dev);
+ if (!ret)
+ return 0;
+ else if (ret < 0) {
+ if (ret == -EPROBE_DEFER) {
+ dev_dbg(dev, "Device match requests probe deferral\n");
+ driver_deferred_probe_add(dev);
+ } else
+ dev_warn(dev, "Bus failed to match device: %d", ret);
return 0;
+ }
if (dev->parent) /* Needed for USB */
device_lock(dev->parent);
diff --git a/include/linux/device.h b/include/linux/device.h
index 5d7bc6349930..8e7b806f0744 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -70,7 +70,7 @@ extern void bus_remove_file(struct bus_type *, struct bus_attribute *);
* @dev_groups: Default attributes of the devices on the bus.
* @drv_groups: Default attributes of the device drivers on the bus.
* @match: Called, perhaps multiple times, whenever a new device or driver
- * is added for this bus. It should return a nonzero value if the
+ * is added for this bus. It should return a positive value if the
* 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.
--
2.4.3
^ permalink raw reply related [flat|nested] 26+ messages in thread
* Re: [PATCH v7 01/20] driver core: handle -EPROBE_DEFER from bus_type.match()
2015-09-29 9:10 ` [PATCH v7 01/20] driver core: handle -EPROBE_DEFER from bus_type.match() Tomeu Vizoso
@ 2015-10-17 6:51 ` Greg Kroah-Hartman
0 siblings, 0 replies; 26+ messages in thread
From: Greg Kroah-Hartman @ 2015-10-17 6:51 UTC (permalink / raw)
To: Tomeu Vizoso
Cc: linux-kernel, Rob Herring, Stephen Warren,
Javier Martinez Canillas, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
Russell King, Linus Walleij, Ulf Hansson, linux-acpi,
Arnd Bergmann
On Tue, Sep 29, 2015 at 11:10:39AM +0200, Tomeu Vizoso wrote:
> Lets implementations of the match() callback in struct bus_type to
> return errors and if it's -EPROBE_DEFER then queue the device for
> deferred probing.
>
> This is useful to buses such as AMBA in which devices are registered
> before their matching information can be retrieved from the HW
> (typically because a clock driver hasn't probed yet).
>
> Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
> ---
>
>
> drivers/base/dd.c | 24 ++++++++++++++++++++++--
> include/linux/device.h | 2 +-
> 2 files changed, 23 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/base/dd.c b/drivers/base/dd.c
> index be0eb4639128..7dc04ee81c8b 100644
> --- a/drivers/base/dd.c
> +++ b/drivers/base/dd.c
> @@ -488,6 +488,7 @@ static int __device_attach_driver(struct device_driver *drv, void *_data)
> struct device_attach_data *data = _data;
> struct device *dev = data->dev;
> bool async_allowed;
> + int ret;
>
> /*
> * Check if device has already been claimed. This may
> @@ -498,8 +499,17 @@ static int __device_attach_driver(struct device_driver *drv, void *_data)
> if (dev->driver)
> return -EBUSY;
>
> - if (!driver_match_device(drv, dev))
> + ret = driver_match_device(drv, dev);
> + if (!ret)
> return 0;
> + else if (ret < 0) {
> + if (ret == -EPROBE_DEFER) {
> + dev_dbg(dev, "Device match requests probe deferral\n");
> + driver_deferred_probe_add(dev);
> + } else
> + dev_warn(dev, "Bus failed to match device: %d", ret);
This is going to start to cause warnings where there were previously
none, which isn't going to be a good idea. It's completly normal for a
bus to not match a device, let's not be noisy for no good reason, unless
you are going to deal with all of the confused user emails?
You do this a bunch in this patch, please don't.
thanks,
greg k-h
^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH v7 02/20] ARM: amba: Move reading of periphid to amba_match()
2015-09-29 9:10 [PATCH v7 0/20] On-demand device probing Tomeu Vizoso
2015-09-29 9:10 ` [PATCH v7 01/20] driver core: handle -EPROBE_DEFER from bus_type.match() Tomeu Vizoso
@ 2015-09-29 9:10 ` Tomeu Vizoso
2015-09-29 9:10 ` [PATCH v7 04/20] of: add function to allow probing a device from a OF node Tomeu Vizoso
` (14 subsequent siblings)
16 siblings, 0 replies; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
Russell King, Linus Walleij, Ulf Hansson, linux-acpi,
Arnd Bergmann, Tomeu Vizoso
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 reading the periphid in amba_match() we can return -EPROBE_DEFER if
the apb pclk isn't there yet and the device will be retried later.
Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---
Changes in v6:
- Drop bus_type.pre_probe and read the periphid in match() instead as
suggested by Alan Stern.
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.
drivers/amba/bus.c | 88 ++++++++++++++++++++++++++++--------------------------
1 file changed, 46 insertions(+), 42 deletions(-)
diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c
index f0099360039e..72ebf9b1c715 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 read_periphid(struct amba_device *d, unsigned int *periphid);
+
static const struct amba_id *
amba_lookup(const struct amba_id *table, struct amba_device *dev)
{
@@ -43,11 +45,22 @@ static int amba_match(struct device *dev, struct device_driver *drv)
{
struct amba_device *pcdev = to_amba_device(dev);
struct amba_driver *pcdrv = to_amba_driver(drv);
+ int ret;
/* When driver_override is set, only bind to the matching driver */
if (pcdev->driver_override)
return !strcmp(pcdev->driver_override, drv->name);
+ if (!pcdev->periphid) {
+ ret = read_periphid(pcdev, &pcdev->periphid);
+ if (ret) {
+ if (ret != -EPROBE_DEFER)
+ dev_err(dev, "Failed to read periphid: %d",
+ ret);
+ return ret;
+ }
+ }
+
return amba_lookup(pcdrv->id_table, pcdev) != NULL;
}
@@ -336,44 +349,22 @@ 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 read_periphid(struct amba_device *d, unsigned int *periphid)
{
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;
+ int i, ret = 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 +379,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;
+ *periphid = pid;
- if (!dev->periphid)
+ if (!*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] 26+ messages in thread
* [PATCH v7 04/20] of: add function to allow probing a device from a OF node
2015-09-29 9:10 [PATCH v7 0/20] On-demand device probing Tomeu Vizoso
2015-09-29 9:10 ` [PATCH v7 01/20] driver core: handle -EPROBE_DEFER from bus_type.match() Tomeu Vizoso
2015-09-29 9:10 ` [PATCH v7 02/20] ARM: amba: Move reading of periphid to amba_match() Tomeu Vizoso
@ 2015-09-29 9:10 ` Tomeu Vizoso
2015-10-17 6:53 ` Greg Kroah-Hartman
2015-09-29 9:10 ` [PATCH v7 05/20] gpio: Probe GPIO drivers on demand Tomeu Vizoso
` (13 subsequent siblings)
16 siblings, 1 reply; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
Russell King, Linus Walleij, Ulf Hansson, linux-acpi,
Arnd Bergmann, Tomeu Vizoso
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 v5:
- Move the assignment to device_node->device for AMBA devices to another
commit.
- Hold a reference to the struct device while it's in use in
of_device_probe().
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.
drivers/of/device.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++
include/linux/of_device.h | 3 +++
2 files changed, 64 insertions(+)
diff --git a/drivers/of/device.c b/drivers/of/device.c
index 8b91ea241b10..836be71fc90e 100644
--- a/drivers/of/device.c
+++ b/drivers/of/device.c
@@ -286,3 +286,64 @@ 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 (get_device(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)
+ goto out;
+
+ /*
+ * 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));
+
+out:
+ put_device(dev);
+}
+EXPORT_SYMBOL_GPL(of_device_probe);
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] 26+ messages in thread
* Re: [PATCH v7 04/20] of: add function to allow probing a device from a OF node
2015-09-29 9:10 ` [PATCH v7 04/20] of: add function to allow probing a device from a OF node Tomeu Vizoso
@ 2015-10-17 6:53 ` Greg Kroah-Hartman
0 siblings, 0 replies; 26+ messages in thread
From: Greg Kroah-Hartman @ 2015-10-17 6:53 UTC (permalink / raw)
To: Tomeu Vizoso
Cc: linux-kernel, Rob Herring, Stephen Warren,
Javier Martinez Canillas, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
Russell King, Linus Walleij, Ulf Hansson, linux-acpi,
Arnd Bergmann
On Tue, Sep 29, 2015 at 11:10:42AM +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).
>
> Subsystems can use this when looking up resources for drivers, to reduce
> the chances of deferred probes because of the probing order of devices.
How do subsystems know to do this? Under what situation? Why is this a
of-only type thing? Why don't other busses need this?
I don't like to special-case a single bus like this at all if
possible...
thanks,
greg k-h
^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH v7 05/20] gpio: Probe GPIO drivers on demand
2015-09-29 9:10 [PATCH v7 0/20] On-demand device probing Tomeu Vizoso
` (2 preceding siblings ...)
2015-09-29 9:10 ` [PATCH v7 04/20] of: add function to allow probing a device from a OF node Tomeu Vizoso
@ 2015-09-29 9:10 ` Tomeu Vizoso
2015-09-29 9:10 ` [PATCH v7 06/20] pinctrl: Probe pinctrl devices " Tomeu Vizoso
` (12 subsequent siblings)
16 siblings, 0 replies; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
Russell King, Linus Walleij, Ulf Hansson, linux-acpi,
Arnd Bergmann, Tomeu Vizoso
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>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
---
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] 26+ messages in thread
* [PATCH v7 06/20] pinctrl: Probe pinctrl devices on demand
2015-09-29 9:10 [PATCH v7 0/20] On-demand device probing Tomeu Vizoso
` (3 preceding siblings ...)
2015-09-29 9:10 ` [PATCH v7 05/20] gpio: Probe GPIO drivers on demand Tomeu Vizoso
@ 2015-09-29 9:10 ` Tomeu Vizoso
2015-09-29 9:10 ` [PATCH v7 07/20] regulator: core: Probe regulators " Tomeu Vizoso
` (11 subsequent siblings)
16 siblings, 0 replies; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
Russell King, Linus Walleij, Ulf Hansson, linux-acpi,
Arnd Bergmann, Tomeu Vizoso
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>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
---
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] 26+ messages in thread
* [PATCH v7 07/20] regulator: core: Probe regulators on demand
2015-09-29 9:10 [PATCH v7 0/20] On-demand device probing Tomeu Vizoso
` (4 preceding siblings ...)
2015-09-29 9:10 ` [PATCH v7 06/20] pinctrl: Probe pinctrl devices " Tomeu Vizoso
@ 2015-09-29 9:10 ` Tomeu Vizoso
2015-09-29 9:10 ` [PATCH v7 09/20] drm/tegra: Probe dpaux devices " Tomeu Vizoso
` (10 subsequent siblings)
16 siblings, 0 replies; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
Russell King, Linus Walleij, Ulf Hansson, linux-acpi,
Arnd Bergmann, Tomeu Vizoso
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>
Acked-by: Mark Brown <broonie@kernel.org>
---
drivers/regulator/core.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 7a85ac9e32c5..ee75199c2cfa 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);
list_for_each_entry(r, ®ulator_list, list)
if (r->dev.parent &&
node == r->dev.of_node)
--
2.4.3
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH v7 09/20] drm/tegra: Probe dpaux devices on demand
2015-09-29 9:10 [PATCH v7 0/20] On-demand device probing Tomeu Vizoso
` (5 preceding siblings ...)
2015-09-29 9:10 ` [PATCH v7 07/20] regulator: core: Probe regulators " Tomeu Vizoso
@ 2015-09-29 9:10 ` Tomeu Vizoso
2015-09-29 9:10 ` [PATCH v7 10/20] i2c: core: Probe i2c adapters and " Tomeu Vizoso
` (9 subsequent siblings)
16 siblings, 0 replies; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
Russell King, Linus Walleij, Ulf Hansson, linux-acpi,
Arnd Bergmann, Tomeu Vizoso
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>
---
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] 26+ messages in thread
* [PATCH v7 10/20] i2c: core: Probe i2c adapters and devices on demand
2015-09-29 9:10 [PATCH v7 0/20] On-demand device probing Tomeu Vizoso
` (6 preceding siblings ...)
2015-09-29 9:10 ` [PATCH v7 09/20] drm/tegra: Probe dpaux devices " Tomeu Vizoso
@ 2015-09-29 9:10 ` Tomeu Vizoso
2015-09-29 9:10 ` [PATCH v7 12/20] backlight: Probe backlight " Tomeu Vizoso
` (8 subsequent siblings)
16 siblings, 0 replies; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
Russell King, Linus Walleij, Ulf Hansson, linux-acpi,
Arnd Bergmann, Tomeu Vizoso
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>
---
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] 26+ messages in thread
* [PATCH v7 12/20] backlight: Probe backlight devices on demand
2015-09-29 9:10 [PATCH v7 0/20] On-demand device probing Tomeu Vizoso
` (7 preceding siblings ...)
2015-09-29 9:10 ` [PATCH v7 10/20] i2c: core: Probe i2c adapters and " Tomeu Vizoso
@ 2015-09-29 9:10 ` Tomeu Vizoso
2015-09-29 9:10 ` [PATCH v7 13/20] usb: phy: Probe phy " Tomeu Vizoso
` (7 subsequent siblings)
16 siblings, 0 replies; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
Russell King, Linus Walleij, Ulf Hansson, linux-acpi,
Arnd Bergmann, Tomeu Vizoso
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>
---
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] 26+ messages in thread
* [PATCH v7 13/20] usb: phy: Probe phy devices on demand
2015-09-29 9:10 [PATCH v7 0/20] On-demand device probing Tomeu Vizoso
` (8 preceding siblings ...)
2015-09-29 9:10 ` [PATCH v7 12/20] backlight: Probe backlight " Tomeu Vizoso
@ 2015-09-29 9:10 ` Tomeu Vizoso
2015-10-17 6:55 ` Greg Kroah-Hartman
2015-09-29 9:10 ` [PATCH v7 14/20] clk: Probe clk providers " Tomeu Vizoso
` (6 subsequent siblings)
16 siblings, 1 reply; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
Russell King, Linus Walleij, Ulf Hansson, linux-acpi,
Arnd Bergmann, Tomeu Vizoso
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>
---
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] 26+ messages in thread
* Re: [PATCH v7 13/20] usb: phy: Probe phy devices on demand
2015-09-29 9:10 ` [PATCH v7 13/20] usb: phy: Probe phy " Tomeu Vizoso
@ 2015-10-17 6:55 ` Greg Kroah-Hartman
0 siblings, 0 replies; 26+ messages in thread
From: Greg Kroah-Hartman @ 2015-10-17 6:55 UTC (permalink / raw)
To: Tomeu Vizoso
Cc: linux-kernel, Rob Herring, Stephen Warren,
Javier Martinez Canillas, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
Russell King, Linus Walleij, Ulf Hansson, linux-acpi,
Arnd Bergmann
On Tue, Sep 29, 2015 at 11:10:51AM +0200, Tomeu Vizoso wrote:
> 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>
> ---
>
>
> 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);
Ugh, this "sprinkling" of calls all over different subsystems like this
isn't ok. Why is of just so broken that it has to do crap like this?
I really don't like this solution / series at all, sorry. We have
deferred probing, if you need stuff like that (where the dependancy tree
isn't in order), how slow is that really? What is taking your hardware
so long to init that warrents this being spread all across the tree?
thanks,
greg k-h
^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH v7 14/20] clk: Probe clk providers on demand
2015-09-29 9:10 [PATCH v7 0/20] On-demand device probing Tomeu Vizoso
` (9 preceding siblings ...)
2015-09-29 9:10 ` [PATCH v7 13/20] usb: phy: Probe phy " Tomeu Vizoso
@ 2015-09-29 9:10 ` Tomeu Vizoso
2015-09-29 9:10 ` [PATCH v7 15/20] pinctrl: Probe pinctrl devices " Tomeu Vizoso
` (5 subsequent siblings)
16 siblings, 0 replies; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
Russell King, Linus Walleij, Ulf Hansson, linux-acpi,
Arnd Bergmann, Tomeu Vizoso
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>
---
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] 26+ messages in thread
* [PATCH v7 15/20] pinctrl: Probe pinctrl devices on demand
2015-09-29 9:10 [PATCH v7 0/20] On-demand device probing Tomeu Vizoso
` (10 preceding siblings ...)
2015-09-29 9:10 ` [PATCH v7 14/20] clk: Probe clk providers " Tomeu Vizoso
@ 2015-09-29 9:10 ` Tomeu Vizoso
2015-09-29 9:10 ` [PATCH v7 16/20] phy: core: Probe phy providers " Tomeu Vizoso
` (4 subsequent siblings)
16 siblings, 0 replies; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
Russell King, Linus Walleij, Ulf Hansson, linux-acpi,
Arnd Bergmann, Tomeu Vizoso
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>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
---
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] 26+ messages in thread
* [PATCH v7 16/20] phy: core: Probe phy providers on demand
2015-09-29 9:10 [PATCH v7 0/20] On-demand device probing Tomeu Vizoso
` (11 preceding siblings ...)
2015-09-29 9:10 ` [PATCH v7 15/20] pinctrl: Probe pinctrl devices " Tomeu Vizoso
@ 2015-09-29 9:10 ` Tomeu Vizoso
[not found] ` <1443517859-30376-1-git-send-email-tomeu.vizoso-ZGY8ohtN/8qB+jHODAdFcQ@public.gmane.org>
` (3 subsequent siblings)
16 siblings, 0 replies; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
Russell King, Linus Walleij, Ulf Hansson, linux-acpi,
Arnd Bergmann, Tomeu Vizoso
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>
---
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] 26+ messages in thread
[parent not found: <1443517859-30376-1-git-send-email-tomeu.vizoso-ZGY8ohtN/8qB+jHODAdFcQ@public.gmane.org>]
* [PATCH v7 03/20] of/platform: Point to struct device from device node
[not found] ` <1443517859-30376-1-git-send-email-tomeu.vizoso-ZGY8ohtN/8qB+jHODAdFcQ@public.gmane.org>
@ 2015-09-29 9:10 ` Tomeu Vizoso
2015-09-29 9:10 ` [PATCH v7 08/20] drm: Probe panels on demand Tomeu Vizoso
` (2 subsequent siblings)
3 siblings, 0 replies; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
Dmitry Torokhov, devicetree-u79uwXL29TY76Z2rM5mHXA, Russell King,
Linus Walleij, Ulf Hansson, linux-acpi-u79uwXL29TY76Z2rM5mHXA,
Arnd Bergmann, Tomeu Vizoso
When adding platform and AMBA devices, set the device node's device
member to point to it.
This speeds lookups considerably and is safe because we only create one
of these devices for any given device node.
Signed-off-by: Tomeu Vizoso <tomeu.vizoso-ZGY8ohtN/8qB+jHODAdFcQ@public.gmane.org>
---
Changes in v5:
- Set the pointer to struct device also for AMBA devices
- Unset the pointer to struct device when the platform device is about
to be unregistered
- Increase the reference count of the device before returning from
of_find_device_by_node()
drivers/of/platform.c | 19 ++++++++++---------
include/linux/of.h | 1 +
2 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/drivers/of/platform.c b/drivers/of/platform.c
index 1001efaedcb8..408d89f1d124 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;
-
- dev = bus_find_device(&platform_bus_type, NULL, np, of_dev_node_match);
- return dev ? to_platform_device(dev) : NULL;
+ if (np->device && np->device->bus == &platform_bus_type &&
+ get_device(np->device))
+ return to_platform_device(np->device);
+ 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:
@@ -272,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:
@@ -476,6 +475,8 @@ static int of_platform_device_destroy(struct device *dev, void *data)
if (of_node_check_flag(dev->of_node, OF_POPULATED_BUS))
device_for_each_child(dev, NULL, of_platform_device_destroy);
+ dev->of_node->device = NULL;
+
if (dev->bus == &platform_bus_type)
platform_device_unregister(to_platform_device(dev));
#ifdef CONFIG_ARM_AMBA
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
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH v7 08/20] drm: Probe panels on demand
[not found] ` <1443517859-30376-1-git-send-email-tomeu.vizoso-ZGY8ohtN/8qB+jHODAdFcQ@public.gmane.org>
2015-09-29 9:10 ` [PATCH v7 03/20] of/platform: Point to struct device from device node Tomeu Vizoso
@ 2015-09-29 9:10 ` Tomeu Vizoso
2015-09-29 9:10 ` [PATCH v7 11/20] pwm: Probe PWM chip devices " Tomeu Vizoso
2015-09-29 9:10 ` [PATCH v7 17/20] dma: of: Probe DMA controllers " Tomeu Vizoso
3 siblings, 0 replies; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
Dmitry Torokhov, devicetree-u79uwXL29TY76Z2rM5mHXA, Russell King,
Linus Walleij, Ulf Hansson, linux-acpi-u79uwXL29TY76Z2rM5mHXA,
Arnd Bergmann, Tomeu Vizoso
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-ZGY8ohtN/8qB+jHODAdFcQ@public.gmane.org>
---
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
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH v7 11/20] pwm: Probe PWM chip devices on demand
[not found] ` <1443517859-30376-1-git-send-email-tomeu.vizoso-ZGY8ohtN/8qB+jHODAdFcQ@public.gmane.org>
2015-09-29 9:10 ` [PATCH v7 03/20] of/platform: Point to struct device from device node Tomeu Vizoso
2015-09-29 9:10 ` [PATCH v7 08/20] drm: Probe panels on demand Tomeu Vizoso
@ 2015-09-29 9:10 ` Tomeu Vizoso
2015-09-29 9:10 ` [PATCH v7 17/20] dma: of: Probe DMA controllers " Tomeu Vizoso
3 siblings, 0 replies; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
Dmitry Torokhov, devicetree-u79uwXL29TY76Z2rM5mHXA, Russell King,
Linus Walleij, Ulf Hansson, linux-acpi-u79uwXL29TY76Z2rM5mHXA,
Arnd Bergmann, Tomeu Vizoso
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-ZGY8ohtN/8qB+jHODAdFcQ@public.gmane.org>
---
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
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH v7 17/20] dma: of: Probe DMA controllers on demand
[not found] ` <1443517859-30376-1-git-send-email-tomeu.vizoso-ZGY8ohtN/8qB+jHODAdFcQ@public.gmane.org>
` (2 preceding siblings ...)
2015-09-29 9:10 ` [PATCH v7 11/20] pwm: Probe PWM chip devices " Tomeu Vizoso
@ 2015-09-29 9:10 ` Tomeu Vizoso
3 siblings, 0 replies; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
Dmitry Torokhov, devicetree-u79uwXL29TY76Z2rM5mHXA, Russell King,
Linus Walleij, Ulf Hansson, linux-acpi-u79uwXL29TY76Z2rM5mHXA,
Arnd Bergmann, Tomeu Vizoso
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-ZGY8ohtN/8qB+jHODAdFcQ@public.gmane.org>
---
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
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH v7 18/20] power-supply: Probe power supplies on demand
2015-09-29 9:10 [PATCH v7 0/20] On-demand device probing Tomeu Vizoso
` (13 preceding siblings ...)
[not found] ` <1443517859-30376-1-git-send-email-tomeu.vizoso-ZGY8ohtN/8qB+jHODAdFcQ@public.gmane.org>
@ 2015-09-29 9:10 ` Tomeu Vizoso
2015-09-29 9:10 ` [PATCH v7 19/20] driver core: Allow deferring probes until late init Tomeu Vizoso
2015-09-29 9:10 ` [PATCH v7 20/20] of/platform: Defer probes of registered devices Tomeu Vizoso
16 siblings, 0 replies; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
Russell King, Linus Walleij, Ulf Hansson, linux-acpi,
Arnd Bergmann, Tomeu Vizoso
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>
---
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] 26+ messages in thread
* [PATCH v7 19/20] driver core: Allow deferring probes until late init
2015-09-29 9:10 [PATCH v7 0/20] On-demand device probing Tomeu Vizoso
` (14 preceding siblings ...)
2015-09-29 9:10 ` [PATCH v7 18/20] power-supply: Probe power supplies " Tomeu Vizoso
@ 2015-09-29 9:10 ` Tomeu Vizoso
[not found] ` <1443517859-30376-20-git-send-email-tomeu.vizoso-ZGY8ohtN/8qB+jHODAdFcQ@public.gmane.org>
2015-09-29 9:10 ` [PATCH v7 20/20] of/platform: Defer probes of registered devices Tomeu Vizoso
16 siblings, 1 reply; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
Russell King, Linus Walleij, Ulf Hansson, linux-acpi,
Arnd Bergmann, Tomeu Vizoso
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 v7:
- Move IS_ENABLED(CONFIG_DELAY_DEVICE_PROBES) into if condition
- Hide CONFIG_DELAY_DEVICE_PROBES behind EXPERT
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.
drivers/base/Kconfig | 18 ++++++++++++++++++
drivers/base/dd.c | 6 ++++++
include/linux/device.h | 2 ++
3 files changed, 26 insertions(+)
diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig
index 98504ec99c7d..8bb7b556da1b 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" if EXPERT
+ 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 7dc04ee81c8b..c4a3f298e726 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -417,6 +417,12 @@ 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) &&
+ !driver_deferred_probe_enable && dev->probe_late) {
+ driver_deferred_probe_add(dev);
+ return 0;
+ }
+
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 8e7b806f0744..e64f4c7e243d 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -744,6 +744,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
@@ -828,6 +829,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] 26+ messages in thread
* [PATCH v7 20/20] of/platform: Defer probes of registered devices
2015-09-29 9:10 [PATCH v7 0/20] On-demand device probing Tomeu Vizoso
` (15 preceding siblings ...)
2015-09-29 9:10 ` [PATCH v7 19/20] driver core: Allow deferring probes until late init Tomeu Vizoso
@ 2015-09-29 9:10 ` Tomeu Vizoso
2015-10-14 23:12 ` Frank Rowand
16 siblings, 1 reply; 26+ messages in thread
From: Tomeu Vizoso @ 2015-09-29 9:10 UTC (permalink / raw)
To: linux-kernel
Cc: Rob Herring, Stephen Warren, Javier Martinez Canillas,
Greg Kroah-Hartman, Mark Brown, Thierry Reding, Alan Stern,
Rafael J. Wysocki, linux-arm-kernel, Dmitry Torokhov, devicetree,
Russell King, Linus Walleij, Ulf Hansson, linux-acpi,
Arnd Bergmann, Tomeu Vizoso
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 v7:
- Removed patch that moved deferred probe processing to
device_initcall_sync, as it's not currently needed and can be applied
later if we find any boards that fail to boot without this change.
Changes in v4:
- Also defer probes of AMBA devices registered from the DT as they can
also request resources.
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 408d89f1d124..7b33e0369374 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] 26+ messages in thread
* Re: [PATCH v7 20/20] of/platform: Defer probes of registered devices
2015-09-29 9:10 ` [PATCH v7 20/20] of/platform: Defer probes of registered devices Tomeu Vizoso
@ 2015-10-14 23:12 ` Frank Rowand
0 siblings, 0 replies; 26+ messages in thread
From: Frank Rowand @ 2015-10-14 23:12 UTC (permalink / raw)
To: Tomeu Vizoso
Cc: linux-kernel, Rob Herring, Stephen Warren,
Javier Martinez Canillas, Greg Kroah-Hartman, Mark Brown,
Thierry Reding, Alan Stern, Rafael J. Wysocki, linux-arm-kernel,
Dmitry Torokhov, devicetree, Russell King, Linus Walleij,
Ulf Hansson, linux-acpi, Arnd Bergmann
On 9/29/2015 2:10 AM, Tomeu Vizoso wrote:
> Instead of trying to match and probe platform and AMBA devices right
> after each is registered, delay their probes until device_initcall_sync.
^^^^^^^^^^^^^^^^^^^^
late_initcall
>
> 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>
> ---
< snip >
^ permalink raw reply [flat|nested] 26+ messages in thread