The re-probing of subdevices when unregistering a notifier is tricky to understand, and implemented somewhat as a hack. Add a comment trying to explain why the re-probing is needed in the first place and why existing helper functions can't be used in this situation. Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@xxxxxxxxxxxx> --- drivers/media/v4l2-core/v4l2-async.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/drivers/media/v4l2-core/v4l2-async.c b/drivers/media/v4l2-core/v4l2-async.c index d91ff0a33fd3eaff..a3c5a1f6d4d2ab03 100644 --- a/drivers/media/v4l2-core/v4l2-async.c +++ b/drivers/media/v4l2-core/v4l2-async.c @@ -234,6 +234,23 @@ void v4l2_async_notifier_unregister(struct v4l2_async_notifier *notifier) mutex_unlock(&list_lock); + /* + * Try to re-probe the subdevices which where part of the notifier. + * This is done so subdevices which where part of the notifier will + * be re-probed to a pristine state and put back on the global + * list of subdevices so they can once more be found and associated + * with a new notifier. + * + * One might be tempted to use device_reprobe() to handle the re- + * probing. Unfortunately this is not possible since some video + * device drivers call v4l2_async_notifier_unregister() from + * there remove function leading to a dead lock situation on + * device_lock(dev->parent). This lock is held when video device + * drivers remove function is called and device_reprobe() also + * tries to take the same lock, so using it here could lead to a + * dead lock situation. + */ + for (i = 0; i < count; i++) { /* If we handled USB devices, we'd have to lock the parent too */ device_release_driver(dev[i]); -- 2.13.3