From 123b0e7a639f18f880eeb758692c0b0e2422855e Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Mon, 5 Oct 2015 16:45:29 +0200 Subject: [PATCH] FROMLIST: device core: add device_is_bound() Adds a function that tells whether a device is already bound to a driver. This is needed to warn when there is an attempt to change the PM domain of a device that has finished probing already. The reason why we want to enforce that is because in the general case that can cause problems and also that we can simplify code quite a bit if we can always assume that. BUG=chrome-os-partner:46491 TEST=boot glados Signed-off-by: Tomeu Vizoso (am from https://patchwork.kernel.org/patch/7328221/) Signed-off-by: Derek Basehore Change-Id: I02b842a5ce3beca1d3228243bed64ad9b9a7d7d3 Reviewed-on: https://chromium-review.googlesource.com/305813 Commit-Ready: Derek Basehore Tested-by: Derek Basehore Reviewed-by: Sameer Nanda --- drivers/base/dd.c | 18 ++++++++++++++++-- include/linux/device.h | 2 ++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/drivers/base/dd.c b/drivers/base/dd.c index 2aacc9cb84a77..d25ddcbbfbef5 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c @@ -192,9 +192,23 @@ static int deferred_probe_initcall(void) } late_initcall(deferred_probe_initcall); +/** + * device_is_bound() - Check if device is bound to a driver + * @dev: device to check + * + * Returns true if passed device has already finished probing successfully + * against a driver. + * + * This function must be called with the device lock held. + */ +bool device_is_bound(struct device *dev) +{ + return klist_node_attached(&dev->p->knode_driver); +} + static void driver_bound(struct device *dev) { - if (klist_node_attached(&dev->p->knode_driver)) { + if (device_is_bound(dev)) { printk(KERN_WARNING "%s: device %s already bound\n", __func__, kobject_name(&dev->kobj)); return; @@ -496,7 +510,7 @@ int __device_attach(struct device *dev, bool allow_async) device_lock(dev); if (dev->driver) { - if (klist_node_attached(&dev->p->knode_driver)) { + if (device_is_bound(dev)) { ret = 1; goto out_unlock; } diff --git a/include/linux/device.h b/include/linux/device.h index eeb47586c99fa..e043af094ce5c 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -973,6 +973,8 @@ extern int __must_check driver_attach(struct device_driver *drv); extern void device_initial_probe(struct device *dev); extern int __must_check device_reprobe(struct device *dev); +extern bool device_is_bound(struct device *dev); + /* * Easy functions for dynamically creating devices on the fly */