]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - drivers/base/dd.c
clocksource: hyper-v: unexport __init-annotated hv_init_clocksource()
[mirror_ubuntu-jammy-kernel.git] / drivers / base / dd.c
index 68ea1f949daa901df46d22951c10c8932103678b..76ded601d0c1b8e8a0b15ee9f41a53ba82df6f41 100644 (file)
@@ -257,7 +257,6 @@ DEFINE_SHOW_ATTRIBUTE(deferred_devs);
 
 int driver_deferred_probe_timeout;
 EXPORT_SYMBOL_GPL(driver_deferred_probe_timeout);
-static DECLARE_WAIT_QUEUE_HEAD(probe_timeout_waitqueue);
 
 static int __init deferred_probe_timeout_setup(char *str)
 {
@@ -296,6 +295,7 @@ int driver_deferred_probe_check_state(struct device *dev)
 
        return -EPROBE_DEFER;
 }
+EXPORT_SYMBOL_GPL(driver_deferred_probe_check_state);
 
 static void deferred_probe_timeout_work_func(struct work_struct *work)
 {
@@ -311,7 +311,6 @@ static void deferred_probe_timeout_work_func(struct work_struct *work)
        list_for_each_entry(p, &deferred_probe_pending_list, deferred_probe)
                dev_info(p->device, "deferred probe pending\n");
        mutex_unlock(&deferred_probe_mutex);
-       wake_up_all(&probe_timeout_waitqueue);
 }
 static DECLARE_DELAYED_WORK(deferred_probe_timeout_work, deferred_probe_timeout_work_func);
 
@@ -629,6 +628,9 @@ re_probe:
                        drv->remove(dev);
 
                devres_release_all(dev);
+               arch_teardown_dma_ops(dev);
+               kfree(dev->dma_range_map);
+               dev->dma_range_map = NULL;
                driver_sysfs_remove(dev);
                dev->driver = NULL;
                dev_set_drvdata(dev, NULL);
@@ -715,9 +717,6 @@ int driver_probe_done(void)
  */
 void wait_for_device_probe(void)
 {
-       /* wait for probe timeout */
-       wait_event(probe_timeout_waitqueue, !driver_deferred_probe_timeout);
-
        /* wait for the deferred probe workqueue to finish */
        flush_work(&deferred_probe_work);
 
@@ -806,7 +805,7 @@ static int __init save_async_options(char *buf)
                pr_warn("Too long list of driver names for 'driver_async_probe'!\n");
 
        strlcpy(async_probe_drv_names, buf, ASYNC_DRV_NAMES_MAX_LEN);
-       return 0;
+       return 1;
 }
 __setup("driver_async_probe=", save_async_options);
 
@@ -940,6 +939,7 @@ out_unlock:
 static int __device_attach(struct device *dev, bool allow_async)
 {
        int ret = 0;
+       bool async = false;
 
        device_lock(dev);
        if (dev->p->dead) {
@@ -978,7 +978,7 @@ static int __device_attach(struct device *dev, bool allow_async)
                         */
                        dev_dbg(dev, "scheduling asynchronous probe\n");
                        get_device(dev);
-                       async_schedule_dev(__device_attach_async_helper, dev);
+                       async = true;
                } else {
                        pm_request_idle(dev);
                }
@@ -988,6 +988,8 @@ static int __device_attach(struct device *dev, bool allow_async)
        }
 out_unlock:
        device_unlock(dev);
+       if (async)
+               async_schedule_dev(__device_attach_async_helper, dev);
        return ret;
 }
 
@@ -1208,6 +1210,8 @@ static void __device_release_driver(struct device *dev, struct device *parent)
 
                devres_release_all(dev);
                arch_teardown_dma_ops(dev);
+               kfree(dev->dma_range_map);
+               dev->dma_range_map = NULL;
                dev->driver = NULL;
                dev_set_drvdata(dev, NULL);
                if (dev->pm_domain && dev->pm_domain->dismiss)