aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/dd.c
diff options
context:
space:
mode:
authorTomeu Vizoso <tomeu.vizoso@collabora.com>2016-02-15 03:25:06 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2016-02-16 11:28:51 -0500
commit656b8035b0eebcac0172b24ca04e448c70dd047f (patch)
tree9310d64d29e0130957ef33362d34c46392f6b42f /drivers/base/dd.c
parent17f29d36e4732b91ae299a163d34ed1954500f42 (diff)
ARM: 8524/1: driver cohandle -EPROBE_DEFER from bus_type.match()
Allow 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). [changed if-else code structure, adjusted documentation to match the code, extended comments] Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/base/dd.c')
-rw-r--r--drivers/base/dd.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index c4da2df62e02..16688f50729c 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -560,6 +560,7 @@ static int __device_attach_driver(struct device_driver *drv, void *_data)
560 struct device_attach_data *data = _data; 560 struct device_attach_data *data = _data;
561 struct device *dev = data->dev; 561 struct device *dev = data->dev;
562 bool async_allowed; 562 bool async_allowed;
563 int ret;
563 564
564 /* 565 /*
565 * Check if device has already been claimed. This may 566 * Check if device has already been claimed. This may
@@ -570,8 +571,17 @@ static int __device_attach_driver(struct device_driver *drv, void *_data)
570 if (dev->driver) 571 if (dev->driver)
571 return -EBUSY; 572 return -EBUSY;
572 573
573 if (!driver_match_device(drv, dev)) 574 ret = driver_match_device(drv, dev);
575 if (ret == 0) {
576 /* no match */
574 return 0; 577 return 0;
578 } else if (ret == -EPROBE_DEFER) {
579 dev_dbg(dev, "Device match requests probe deferral\n");
580 driver_deferred_probe_add(dev);
581 } else if (ret < 0) {
582 dev_dbg(dev, "Bus failed to match device: %d", ret);
583 return ret;
584 } /* ret > 0 means positive match */
575 585
576 async_allowed = driver_allows_async_probing(drv); 586 async_allowed = driver_allows_async_probing(drv);
577 587
@@ -691,6 +701,7 @@ void device_initial_probe(struct device *dev)
691static int __driver_attach(struct device *dev, void *data) 701static int __driver_attach(struct device *dev, void *data)
692{ 702{
693 struct device_driver *drv = data; 703 struct device_driver *drv = data;
704 int ret;
694 705
695 /* 706 /*
696 * Lock device and try to bind to it. We drop the error 707 * Lock device and try to bind to it. We drop the error
@@ -702,8 +713,17 @@ static int __driver_attach(struct device *dev, void *data)
702 * is an error. 713 * is an error.
703 */ 714 */
704 715
705 if (!driver_match_device(drv, dev)) 716 ret = driver_match_device(drv, dev);
717 if (ret == 0) {
718 /* no match */
706 return 0; 719 return 0;
720 } else if (ret == -EPROBE_DEFER) {
721 dev_dbg(dev, "Device match requests probe deferral\n");
722 driver_deferred_probe_add(dev);
723 } else if (ret < 0) {
724 dev_dbg(dev, "Bus failed to match device: %d", ret);
725 return ret;
726 } /* ret > 0 means positive match */
707 727
708 if (dev->parent) /* Needed for USB */ 728 if (dev->parent) /* Needed for USB */
709 device_lock(dev->parent); 729 device_lock(dev->parent);