162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * drivers/base/dd.c - The core device/driver interactions. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * This file contains the (sometimes tricky) code that controls the 662306a36Sopenharmony_ci * interactions between devices and drivers, which primarily includes 762306a36Sopenharmony_ci * driver binding and unbinding. 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * All of this code used to exist in drivers/base/bus.c, but was 1062306a36Sopenharmony_ci * relocated to here in the name of compartmentalization (since it wasn't 1162306a36Sopenharmony_ci * strictly code just for the 'struct bus_type'. 1262306a36Sopenharmony_ci * 1362306a36Sopenharmony_ci * Copyright (c) 2002-5 Patrick Mochel 1462306a36Sopenharmony_ci * Copyright (c) 2002-3 Open Source Development Labs 1562306a36Sopenharmony_ci * Copyright (c) 2007-2009 Greg Kroah-Hartman <gregkh@suse.de> 1662306a36Sopenharmony_ci * Copyright (c) 2007-2009 Novell Inc. 1762306a36Sopenharmony_ci */ 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#include <linux/debugfs.h> 2062306a36Sopenharmony_ci#include <linux/device.h> 2162306a36Sopenharmony_ci#include <linux/delay.h> 2262306a36Sopenharmony_ci#include <linux/dma-map-ops.h> 2362306a36Sopenharmony_ci#include <linux/init.h> 2462306a36Sopenharmony_ci#include <linux/module.h> 2562306a36Sopenharmony_ci#include <linux/kthread.h> 2662306a36Sopenharmony_ci#include <linux/wait.h> 2762306a36Sopenharmony_ci#include <linux/async.h> 2862306a36Sopenharmony_ci#include <linux/pm_runtime.h> 2962306a36Sopenharmony_ci#include <linux/pinctrl/devinfo.h> 3062306a36Sopenharmony_ci#include <linux/slab.h> 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#include "base.h" 3362306a36Sopenharmony_ci#include "power/power.h" 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci/* 3662306a36Sopenharmony_ci * Deferred Probe infrastructure. 3762306a36Sopenharmony_ci * 3862306a36Sopenharmony_ci * Sometimes driver probe order matters, but the kernel doesn't always have 3962306a36Sopenharmony_ci * dependency information which means some drivers will get probed before a 4062306a36Sopenharmony_ci * resource it depends on is available. For example, an SDHCI driver may 4162306a36Sopenharmony_ci * first need a GPIO line from an i2c GPIO controller before it can be 4262306a36Sopenharmony_ci * initialized. If a required resource is not available yet, a driver can 4362306a36Sopenharmony_ci * request probing to be deferred by returning -EPROBE_DEFER from its probe hook 4462306a36Sopenharmony_ci * 4562306a36Sopenharmony_ci * Deferred probe maintains two lists of devices, a pending list and an active 4662306a36Sopenharmony_ci * list. A driver returning -EPROBE_DEFER causes the device to be added to the 4762306a36Sopenharmony_ci * pending list. A successful driver probe will trigger moving all devices 4862306a36Sopenharmony_ci * from the pending to the active list so that the workqueue will eventually 4962306a36Sopenharmony_ci * retry them. 5062306a36Sopenharmony_ci * 5162306a36Sopenharmony_ci * The deferred_probe_mutex must be held any time the deferred_probe_*_list 5262306a36Sopenharmony_ci * of the (struct device*)->p->deferred_probe pointers are manipulated 5362306a36Sopenharmony_ci */ 5462306a36Sopenharmony_cistatic DEFINE_MUTEX(deferred_probe_mutex); 5562306a36Sopenharmony_cistatic LIST_HEAD(deferred_probe_pending_list); 5662306a36Sopenharmony_cistatic LIST_HEAD(deferred_probe_active_list); 5762306a36Sopenharmony_cistatic atomic_t deferred_trigger_count = ATOMIC_INIT(0); 5862306a36Sopenharmony_cistatic bool initcalls_done; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci/* Save the async probe drivers' name from kernel cmdline */ 6162306a36Sopenharmony_ci#define ASYNC_DRV_NAMES_MAX_LEN 256 6262306a36Sopenharmony_cistatic char async_probe_drv_names[ASYNC_DRV_NAMES_MAX_LEN]; 6362306a36Sopenharmony_cistatic bool async_probe_default; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci/* 6662306a36Sopenharmony_ci * In some cases, like suspend to RAM or hibernation, It might be reasonable 6762306a36Sopenharmony_ci * to prohibit probing of devices as it could be unsafe. 6862306a36Sopenharmony_ci * Once defer_all_probes is true all drivers probes will be forcibly deferred. 6962306a36Sopenharmony_ci */ 7062306a36Sopenharmony_cistatic bool defer_all_probes; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_cistatic void __device_set_deferred_probe_reason(const struct device *dev, char *reason) 7362306a36Sopenharmony_ci{ 7462306a36Sopenharmony_ci kfree(dev->p->deferred_probe_reason); 7562306a36Sopenharmony_ci dev->p->deferred_probe_reason = reason; 7662306a36Sopenharmony_ci} 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci/* 7962306a36Sopenharmony_ci * deferred_probe_work_func() - Retry probing devices in the active list. 8062306a36Sopenharmony_ci */ 8162306a36Sopenharmony_cistatic void deferred_probe_work_func(struct work_struct *work) 8262306a36Sopenharmony_ci{ 8362306a36Sopenharmony_ci struct device *dev; 8462306a36Sopenharmony_ci struct device_private *private; 8562306a36Sopenharmony_ci /* 8662306a36Sopenharmony_ci * This block processes every device in the deferred 'active' list. 8762306a36Sopenharmony_ci * Each device is removed from the active list and passed to 8862306a36Sopenharmony_ci * bus_probe_device() to re-attempt the probe. The loop continues 8962306a36Sopenharmony_ci * until every device in the active list is removed and retried. 9062306a36Sopenharmony_ci * 9162306a36Sopenharmony_ci * Note: Once the device is removed from the list and the mutex is 9262306a36Sopenharmony_ci * released, it is possible for the device get freed by another thread 9362306a36Sopenharmony_ci * and cause a illegal pointer dereference. This code uses 9462306a36Sopenharmony_ci * get/put_device() to ensure the device structure cannot disappear 9562306a36Sopenharmony_ci * from under our feet. 9662306a36Sopenharmony_ci */ 9762306a36Sopenharmony_ci mutex_lock(&deferred_probe_mutex); 9862306a36Sopenharmony_ci while (!list_empty(&deferred_probe_active_list)) { 9962306a36Sopenharmony_ci private = list_first_entry(&deferred_probe_active_list, 10062306a36Sopenharmony_ci typeof(*dev->p), deferred_probe); 10162306a36Sopenharmony_ci dev = private->device; 10262306a36Sopenharmony_ci list_del_init(&private->deferred_probe); 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci get_device(dev); 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci __device_set_deferred_probe_reason(dev, NULL); 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci /* 10962306a36Sopenharmony_ci * Drop the mutex while probing each device; the probe path may 11062306a36Sopenharmony_ci * manipulate the deferred list 11162306a36Sopenharmony_ci */ 11262306a36Sopenharmony_ci mutex_unlock(&deferred_probe_mutex); 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci /* 11562306a36Sopenharmony_ci * Force the device to the end of the dpm_list since 11662306a36Sopenharmony_ci * the PM code assumes that the order we add things to 11762306a36Sopenharmony_ci * the list is a good order for suspend but deferred 11862306a36Sopenharmony_ci * probe makes that very unsafe. 11962306a36Sopenharmony_ci */ 12062306a36Sopenharmony_ci device_pm_move_to_tail(dev); 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci dev_dbg(dev, "Retrying from deferred list\n"); 12362306a36Sopenharmony_ci bus_probe_device(dev); 12462306a36Sopenharmony_ci mutex_lock(&deferred_probe_mutex); 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci put_device(dev); 12762306a36Sopenharmony_ci } 12862306a36Sopenharmony_ci mutex_unlock(&deferred_probe_mutex); 12962306a36Sopenharmony_ci} 13062306a36Sopenharmony_cistatic DECLARE_WORK(deferred_probe_work, deferred_probe_work_func); 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_civoid driver_deferred_probe_add(struct device *dev) 13362306a36Sopenharmony_ci{ 13462306a36Sopenharmony_ci if (!dev->can_match) 13562306a36Sopenharmony_ci return; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci mutex_lock(&deferred_probe_mutex); 13862306a36Sopenharmony_ci if (list_empty(&dev->p->deferred_probe)) { 13962306a36Sopenharmony_ci dev_dbg(dev, "Added to deferred list\n"); 14062306a36Sopenharmony_ci list_add_tail(&dev->p->deferred_probe, &deferred_probe_pending_list); 14162306a36Sopenharmony_ci } 14262306a36Sopenharmony_ci mutex_unlock(&deferred_probe_mutex); 14362306a36Sopenharmony_ci} 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_civoid driver_deferred_probe_del(struct device *dev) 14662306a36Sopenharmony_ci{ 14762306a36Sopenharmony_ci mutex_lock(&deferred_probe_mutex); 14862306a36Sopenharmony_ci if (!list_empty(&dev->p->deferred_probe)) { 14962306a36Sopenharmony_ci dev_dbg(dev, "Removed from deferred list\n"); 15062306a36Sopenharmony_ci list_del_init(&dev->p->deferred_probe); 15162306a36Sopenharmony_ci __device_set_deferred_probe_reason(dev, NULL); 15262306a36Sopenharmony_ci } 15362306a36Sopenharmony_ci mutex_unlock(&deferred_probe_mutex); 15462306a36Sopenharmony_ci} 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_cistatic bool driver_deferred_probe_enable; 15762306a36Sopenharmony_ci/** 15862306a36Sopenharmony_ci * driver_deferred_probe_trigger() - Kick off re-probing deferred devices 15962306a36Sopenharmony_ci * 16062306a36Sopenharmony_ci * This functions moves all devices from the pending list to the active 16162306a36Sopenharmony_ci * list and schedules the deferred probe workqueue to process them. It 16262306a36Sopenharmony_ci * should be called anytime a driver is successfully bound to a device. 16362306a36Sopenharmony_ci * 16462306a36Sopenharmony_ci * Note, there is a race condition in multi-threaded probe. In the case where 16562306a36Sopenharmony_ci * more than one device is probing at the same time, it is possible for one 16662306a36Sopenharmony_ci * probe to complete successfully while another is about to defer. If the second 16762306a36Sopenharmony_ci * depends on the first, then it will get put on the pending list after the 16862306a36Sopenharmony_ci * trigger event has already occurred and will be stuck there. 16962306a36Sopenharmony_ci * 17062306a36Sopenharmony_ci * The atomic 'deferred_trigger_count' is used to determine if a successful 17162306a36Sopenharmony_ci * trigger has occurred in the midst of probing a driver. If the trigger count 17262306a36Sopenharmony_ci * changes in the midst of a probe, then deferred processing should be triggered 17362306a36Sopenharmony_ci * again. 17462306a36Sopenharmony_ci */ 17562306a36Sopenharmony_civoid driver_deferred_probe_trigger(void) 17662306a36Sopenharmony_ci{ 17762306a36Sopenharmony_ci if (!driver_deferred_probe_enable) 17862306a36Sopenharmony_ci return; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci /* 18162306a36Sopenharmony_ci * A successful probe means that all the devices in the pending list 18262306a36Sopenharmony_ci * should be triggered to be reprobed. Move all the deferred devices 18362306a36Sopenharmony_ci * into the active list so they can be retried by the workqueue 18462306a36Sopenharmony_ci */ 18562306a36Sopenharmony_ci mutex_lock(&deferred_probe_mutex); 18662306a36Sopenharmony_ci atomic_inc(&deferred_trigger_count); 18762306a36Sopenharmony_ci list_splice_tail_init(&deferred_probe_pending_list, 18862306a36Sopenharmony_ci &deferred_probe_active_list); 18962306a36Sopenharmony_ci mutex_unlock(&deferred_probe_mutex); 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci /* 19262306a36Sopenharmony_ci * Kick the re-probe thread. It may already be scheduled, but it is 19362306a36Sopenharmony_ci * safe to kick it again. 19462306a36Sopenharmony_ci */ 19562306a36Sopenharmony_ci queue_work(system_unbound_wq, &deferred_probe_work); 19662306a36Sopenharmony_ci} 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci/** 19962306a36Sopenharmony_ci * device_block_probing() - Block/defer device's probes 20062306a36Sopenharmony_ci * 20162306a36Sopenharmony_ci * It will disable probing of devices and defer their probes instead. 20262306a36Sopenharmony_ci */ 20362306a36Sopenharmony_civoid device_block_probing(void) 20462306a36Sopenharmony_ci{ 20562306a36Sopenharmony_ci defer_all_probes = true; 20662306a36Sopenharmony_ci /* sync with probes to avoid races. */ 20762306a36Sopenharmony_ci wait_for_device_probe(); 20862306a36Sopenharmony_ci} 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci/** 21162306a36Sopenharmony_ci * device_unblock_probing() - Unblock/enable device's probes 21262306a36Sopenharmony_ci * 21362306a36Sopenharmony_ci * It will restore normal behavior and trigger re-probing of deferred 21462306a36Sopenharmony_ci * devices. 21562306a36Sopenharmony_ci */ 21662306a36Sopenharmony_civoid device_unblock_probing(void) 21762306a36Sopenharmony_ci{ 21862306a36Sopenharmony_ci defer_all_probes = false; 21962306a36Sopenharmony_ci driver_deferred_probe_trigger(); 22062306a36Sopenharmony_ci} 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci/** 22362306a36Sopenharmony_ci * device_set_deferred_probe_reason() - Set defer probe reason message for device 22462306a36Sopenharmony_ci * @dev: the pointer to the struct device 22562306a36Sopenharmony_ci * @vaf: the pointer to va_format structure with message 22662306a36Sopenharmony_ci */ 22762306a36Sopenharmony_civoid device_set_deferred_probe_reason(const struct device *dev, struct va_format *vaf) 22862306a36Sopenharmony_ci{ 22962306a36Sopenharmony_ci const char *drv = dev_driver_string(dev); 23062306a36Sopenharmony_ci char *reason; 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci mutex_lock(&deferred_probe_mutex); 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci reason = kasprintf(GFP_KERNEL, "%s: %pV", drv, vaf); 23562306a36Sopenharmony_ci __device_set_deferred_probe_reason(dev, reason); 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci mutex_unlock(&deferred_probe_mutex); 23862306a36Sopenharmony_ci} 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci/* 24162306a36Sopenharmony_ci * deferred_devs_show() - Show the devices in the deferred probe pending list. 24262306a36Sopenharmony_ci */ 24362306a36Sopenharmony_cistatic int deferred_devs_show(struct seq_file *s, void *data) 24462306a36Sopenharmony_ci{ 24562306a36Sopenharmony_ci struct device_private *curr; 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci mutex_lock(&deferred_probe_mutex); 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_ci list_for_each_entry(curr, &deferred_probe_pending_list, deferred_probe) 25062306a36Sopenharmony_ci seq_printf(s, "%s\t%s", dev_name(curr->device), 25162306a36Sopenharmony_ci curr->device->p->deferred_probe_reason ?: "\n"); 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci mutex_unlock(&deferred_probe_mutex); 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci return 0; 25662306a36Sopenharmony_ci} 25762306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(deferred_devs); 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci#ifdef CONFIG_MODULES 26062306a36Sopenharmony_cistatic int driver_deferred_probe_timeout = 10; 26162306a36Sopenharmony_ci#else 26262306a36Sopenharmony_cistatic int driver_deferred_probe_timeout; 26362306a36Sopenharmony_ci#endif 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_cistatic int __init deferred_probe_timeout_setup(char *str) 26662306a36Sopenharmony_ci{ 26762306a36Sopenharmony_ci int timeout; 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci if (!kstrtoint(str, 10, &timeout)) 27062306a36Sopenharmony_ci driver_deferred_probe_timeout = timeout; 27162306a36Sopenharmony_ci return 1; 27262306a36Sopenharmony_ci} 27362306a36Sopenharmony_ci__setup("deferred_probe_timeout=", deferred_probe_timeout_setup); 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci/** 27662306a36Sopenharmony_ci * driver_deferred_probe_check_state() - Check deferred probe state 27762306a36Sopenharmony_ci * @dev: device to check 27862306a36Sopenharmony_ci * 27962306a36Sopenharmony_ci * Return: 28062306a36Sopenharmony_ci * * -ENODEV if initcalls have completed and modules are disabled. 28162306a36Sopenharmony_ci * * -ETIMEDOUT if the deferred probe timeout was set and has expired 28262306a36Sopenharmony_ci * and modules are enabled. 28362306a36Sopenharmony_ci * * -EPROBE_DEFER in other cases. 28462306a36Sopenharmony_ci * 28562306a36Sopenharmony_ci * Drivers or subsystems can opt-in to calling this function instead of directly 28662306a36Sopenharmony_ci * returning -EPROBE_DEFER. 28762306a36Sopenharmony_ci */ 28862306a36Sopenharmony_ciint driver_deferred_probe_check_state(struct device *dev) 28962306a36Sopenharmony_ci{ 29062306a36Sopenharmony_ci if (!IS_ENABLED(CONFIG_MODULES) && initcalls_done) { 29162306a36Sopenharmony_ci dev_warn(dev, "ignoring dependency for device, assuming no driver\n"); 29262306a36Sopenharmony_ci return -ENODEV; 29362306a36Sopenharmony_ci } 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci if (!driver_deferred_probe_timeout && initcalls_done) { 29662306a36Sopenharmony_ci dev_warn(dev, "deferred probe timeout, ignoring dependency\n"); 29762306a36Sopenharmony_ci return -ETIMEDOUT; 29862306a36Sopenharmony_ci } 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci return -EPROBE_DEFER; 30162306a36Sopenharmony_ci} 30262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(driver_deferred_probe_check_state); 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_cistatic void deferred_probe_timeout_work_func(struct work_struct *work) 30562306a36Sopenharmony_ci{ 30662306a36Sopenharmony_ci struct device_private *p; 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci fw_devlink_drivers_done(); 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci driver_deferred_probe_timeout = 0; 31162306a36Sopenharmony_ci driver_deferred_probe_trigger(); 31262306a36Sopenharmony_ci flush_work(&deferred_probe_work); 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ci mutex_lock(&deferred_probe_mutex); 31562306a36Sopenharmony_ci list_for_each_entry(p, &deferred_probe_pending_list, deferred_probe) 31662306a36Sopenharmony_ci dev_info(p->device, "deferred probe pending\n"); 31762306a36Sopenharmony_ci mutex_unlock(&deferred_probe_mutex); 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci fw_devlink_probing_done(); 32062306a36Sopenharmony_ci} 32162306a36Sopenharmony_cistatic DECLARE_DELAYED_WORK(deferred_probe_timeout_work, deferred_probe_timeout_work_func); 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_civoid deferred_probe_extend_timeout(void) 32462306a36Sopenharmony_ci{ 32562306a36Sopenharmony_ci /* 32662306a36Sopenharmony_ci * If the work hasn't been queued yet or if the work expired, don't 32762306a36Sopenharmony_ci * start a new one. 32862306a36Sopenharmony_ci */ 32962306a36Sopenharmony_ci if (cancel_delayed_work(&deferred_probe_timeout_work)) { 33062306a36Sopenharmony_ci schedule_delayed_work(&deferred_probe_timeout_work, 33162306a36Sopenharmony_ci driver_deferred_probe_timeout * HZ); 33262306a36Sopenharmony_ci pr_debug("Extended deferred probe timeout by %d secs\n", 33362306a36Sopenharmony_ci driver_deferred_probe_timeout); 33462306a36Sopenharmony_ci } 33562306a36Sopenharmony_ci} 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ci/** 33862306a36Sopenharmony_ci * deferred_probe_initcall() - Enable probing of deferred devices 33962306a36Sopenharmony_ci * 34062306a36Sopenharmony_ci * We don't want to get in the way when the bulk of drivers are getting probed. 34162306a36Sopenharmony_ci * Instead, this initcall makes sure that deferred probing is delayed until 34262306a36Sopenharmony_ci * late_initcall time. 34362306a36Sopenharmony_ci */ 34462306a36Sopenharmony_cistatic int deferred_probe_initcall(void) 34562306a36Sopenharmony_ci{ 34662306a36Sopenharmony_ci debugfs_create_file("devices_deferred", 0444, NULL, NULL, 34762306a36Sopenharmony_ci &deferred_devs_fops); 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci driver_deferred_probe_enable = true; 35062306a36Sopenharmony_ci driver_deferred_probe_trigger(); 35162306a36Sopenharmony_ci /* Sort as many dependencies as possible before exiting initcalls */ 35262306a36Sopenharmony_ci flush_work(&deferred_probe_work); 35362306a36Sopenharmony_ci initcalls_done = true; 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ci if (!IS_ENABLED(CONFIG_MODULES)) 35662306a36Sopenharmony_ci fw_devlink_drivers_done(); 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci /* 35962306a36Sopenharmony_ci * Trigger deferred probe again, this time we won't defer anything 36062306a36Sopenharmony_ci * that is optional 36162306a36Sopenharmony_ci */ 36262306a36Sopenharmony_ci driver_deferred_probe_trigger(); 36362306a36Sopenharmony_ci flush_work(&deferred_probe_work); 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci if (driver_deferred_probe_timeout > 0) { 36662306a36Sopenharmony_ci schedule_delayed_work(&deferred_probe_timeout_work, 36762306a36Sopenharmony_ci driver_deferred_probe_timeout * HZ); 36862306a36Sopenharmony_ci } 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci if (!IS_ENABLED(CONFIG_MODULES)) 37162306a36Sopenharmony_ci fw_devlink_probing_done(); 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci return 0; 37462306a36Sopenharmony_ci} 37562306a36Sopenharmony_cilate_initcall(deferred_probe_initcall); 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_cistatic void __exit deferred_probe_exit(void) 37862306a36Sopenharmony_ci{ 37962306a36Sopenharmony_ci debugfs_lookup_and_remove("devices_deferred", NULL); 38062306a36Sopenharmony_ci} 38162306a36Sopenharmony_ci__exitcall(deferred_probe_exit); 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ci/** 38462306a36Sopenharmony_ci * device_is_bound() - Check if device is bound to a driver 38562306a36Sopenharmony_ci * @dev: device to check 38662306a36Sopenharmony_ci * 38762306a36Sopenharmony_ci * Returns true if passed device has already finished probing successfully 38862306a36Sopenharmony_ci * against a driver. 38962306a36Sopenharmony_ci * 39062306a36Sopenharmony_ci * This function must be called with the device lock held. 39162306a36Sopenharmony_ci */ 39262306a36Sopenharmony_cibool device_is_bound(struct device *dev) 39362306a36Sopenharmony_ci{ 39462306a36Sopenharmony_ci return dev->p && klist_node_attached(&dev->p->knode_driver); 39562306a36Sopenharmony_ci} 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_cistatic void driver_bound(struct device *dev) 39862306a36Sopenharmony_ci{ 39962306a36Sopenharmony_ci if (device_is_bound(dev)) { 40062306a36Sopenharmony_ci pr_warn("%s: device %s already bound\n", 40162306a36Sopenharmony_ci __func__, kobject_name(&dev->kobj)); 40262306a36Sopenharmony_ci return; 40362306a36Sopenharmony_ci } 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_ci pr_debug("driver: '%s': %s: bound to device '%s'\n", dev->driver->name, 40662306a36Sopenharmony_ci __func__, dev_name(dev)); 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci klist_add_tail(&dev->p->knode_driver, &dev->driver->p->klist_devices); 40962306a36Sopenharmony_ci device_links_driver_bound(dev); 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci device_pm_check_callbacks(dev); 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci /* 41462306a36Sopenharmony_ci * Make sure the device is no longer in one of the deferred lists and 41562306a36Sopenharmony_ci * kick off retrying all pending devices 41662306a36Sopenharmony_ci */ 41762306a36Sopenharmony_ci driver_deferred_probe_del(dev); 41862306a36Sopenharmony_ci driver_deferred_probe_trigger(); 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_ci bus_notify(dev, BUS_NOTIFY_BOUND_DRIVER); 42162306a36Sopenharmony_ci kobject_uevent(&dev->kobj, KOBJ_BIND); 42262306a36Sopenharmony_ci} 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_cistatic ssize_t coredump_store(struct device *dev, struct device_attribute *attr, 42562306a36Sopenharmony_ci const char *buf, size_t count) 42662306a36Sopenharmony_ci{ 42762306a36Sopenharmony_ci device_lock(dev); 42862306a36Sopenharmony_ci dev->driver->coredump(dev); 42962306a36Sopenharmony_ci device_unlock(dev); 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci return count; 43262306a36Sopenharmony_ci} 43362306a36Sopenharmony_cistatic DEVICE_ATTR_WO(coredump); 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_cistatic int driver_sysfs_add(struct device *dev) 43662306a36Sopenharmony_ci{ 43762306a36Sopenharmony_ci int ret; 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_ci bus_notify(dev, BUS_NOTIFY_BIND_DRIVER); 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_ci ret = sysfs_create_link(&dev->driver->p->kobj, &dev->kobj, 44262306a36Sopenharmony_ci kobject_name(&dev->kobj)); 44362306a36Sopenharmony_ci if (ret) 44462306a36Sopenharmony_ci goto fail; 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_ci ret = sysfs_create_link(&dev->kobj, &dev->driver->p->kobj, 44762306a36Sopenharmony_ci "driver"); 44862306a36Sopenharmony_ci if (ret) 44962306a36Sopenharmony_ci goto rm_dev; 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ci if (!IS_ENABLED(CONFIG_DEV_COREDUMP) || !dev->driver->coredump) 45262306a36Sopenharmony_ci return 0; 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_ci ret = device_create_file(dev, &dev_attr_coredump); 45562306a36Sopenharmony_ci if (!ret) 45662306a36Sopenharmony_ci return 0; 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_ci sysfs_remove_link(&dev->kobj, "driver"); 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_cirm_dev: 46162306a36Sopenharmony_ci sysfs_remove_link(&dev->driver->p->kobj, 46262306a36Sopenharmony_ci kobject_name(&dev->kobj)); 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_cifail: 46562306a36Sopenharmony_ci return ret; 46662306a36Sopenharmony_ci} 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_cistatic void driver_sysfs_remove(struct device *dev) 46962306a36Sopenharmony_ci{ 47062306a36Sopenharmony_ci struct device_driver *drv = dev->driver; 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_ci if (drv) { 47362306a36Sopenharmony_ci if (drv->coredump) 47462306a36Sopenharmony_ci device_remove_file(dev, &dev_attr_coredump); 47562306a36Sopenharmony_ci sysfs_remove_link(&drv->p->kobj, kobject_name(&dev->kobj)); 47662306a36Sopenharmony_ci sysfs_remove_link(&dev->kobj, "driver"); 47762306a36Sopenharmony_ci } 47862306a36Sopenharmony_ci} 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_ci/** 48162306a36Sopenharmony_ci * device_bind_driver - bind a driver to one device. 48262306a36Sopenharmony_ci * @dev: device. 48362306a36Sopenharmony_ci * 48462306a36Sopenharmony_ci * Allow manual attachment of a driver to a device. 48562306a36Sopenharmony_ci * Caller must have already set @dev->driver. 48662306a36Sopenharmony_ci * 48762306a36Sopenharmony_ci * Note that this does not modify the bus reference count. 48862306a36Sopenharmony_ci * Please verify that is accounted for before calling this. 48962306a36Sopenharmony_ci * (It is ok to call with no other effort from a driver's probe() method.) 49062306a36Sopenharmony_ci * 49162306a36Sopenharmony_ci * This function must be called with the device lock held. 49262306a36Sopenharmony_ci * 49362306a36Sopenharmony_ci * Callers should prefer to use device_driver_attach() instead. 49462306a36Sopenharmony_ci */ 49562306a36Sopenharmony_ciint device_bind_driver(struct device *dev) 49662306a36Sopenharmony_ci{ 49762306a36Sopenharmony_ci int ret; 49862306a36Sopenharmony_ci 49962306a36Sopenharmony_ci ret = driver_sysfs_add(dev); 50062306a36Sopenharmony_ci if (!ret) { 50162306a36Sopenharmony_ci device_links_force_bind(dev); 50262306a36Sopenharmony_ci driver_bound(dev); 50362306a36Sopenharmony_ci } 50462306a36Sopenharmony_ci else 50562306a36Sopenharmony_ci bus_notify(dev, BUS_NOTIFY_DRIVER_NOT_BOUND); 50662306a36Sopenharmony_ci return ret; 50762306a36Sopenharmony_ci} 50862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(device_bind_driver); 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_cistatic atomic_t probe_count = ATOMIC_INIT(0); 51162306a36Sopenharmony_cistatic DECLARE_WAIT_QUEUE_HEAD(probe_waitqueue); 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_cistatic ssize_t state_synced_store(struct device *dev, 51462306a36Sopenharmony_ci struct device_attribute *attr, 51562306a36Sopenharmony_ci const char *buf, size_t count) 51662306a36Sopenharmony_ci{ 51762306a36Sopenharmony_ci int ret = 0; 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_ci if (strcmp("1", buf)) 52062306a36Sopenharmony_ci return -EINVAL; 52162306a36Sopenharmony_ci 52262306a36Sopenharmony_ci device_lock(dev); 52362306a36Sopenharmony_ci if (!dev->state_synced) { 52462306a36Sopenharmony_ci dev->state_synced = true; 52562306a36Sopenharmony_ci dev_sync_state(dev); 52662306a36Sopenharmony_ci } else { 52762306a36Sopenharmony_ci ret = -EINVAL; 52862306a36Sopenharmony_ci } 52962306a36Sopenharmony_ci device_unlock(dev); 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_ci return ret ? ret : count; 53262306a36Sopenharmony_ci} 53362306a36Sopenharmony_ci 53462306a36Sopenharmony_cistatic ssize_t state_synced_show(struct device *dev, 53562306a36Sopenharmony_ci struct device_attribute *attr, char *buf) 53662306a36Sopenharmony_ci{ 53762306a36Sopenharmony_ci bool val; 53862306a36Sopenharmony_ci 53962306a36Sopenharmony_ci device_lock(dev); 54062306a36Sopenharmony_ci val = dev->state_synced; 54162306a36Sopenharmony_ci device_unlock(dev); 54262306a36Sopenharmony_ci 54362306a36Sopenharmony_ci return sysfs_emit(buf, "%u\n", val); 54462306a36Sopenharmony_ci} 54562306a36Sopenharmony_cistatic DEVICE_ATTR_RW(state_synced); 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_cistatic void device_unbind_cleanup(struct device *dev) 54862306a36Sopenharmony_ci{ 54962306a36Sopenharmony_ci devres_release_all(dev); 55062306a36Sopenharmony_ci arch_teardown_dma_ops(dev); 55162306a36Sopenharmony_ci kfree(dev->dma_range_map); 55262306a36Sopenharmony_ci dev->dma_range_map = NULL; 55362306a36Sopenharmony_ci dev->driver = NULL; 55462306a36Sopenharmony_ci dev_set_drvdata(dev, NULL); 55562306a36Sopenharmony_ci if (dev->pm_domain && dev->pm_domain->dismiss) 55662306a36Sopenharmony_ci dev->pm_domain->dismiss(dev); 55762306a36Sopenharmony_ci pm_runtime_reinit(dev); 55862306a36Sopenharmony_ci dev_pm_set_driver_flags(dev, 0); 55962306a36Sopenharmony_ci} 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_cistatic void device_remove(struct device *dev) 56262306a36Sopenharmony_ci{ 56362306a36Sopenharmony_ci device_remove_file(dev, &dev_attr_state_synced); 56462306a36Sopenharmony_ci device_remove_groups(dev, dev->driver->dev_groups); 56562306a36Sopenharmony_ci 56662306a36Sopenharmony_ci if (dev->bus && dev->bus->remove) 56762306a36Sopenharmony_ci dev->bus->remove(dev); 56862306a36Sopenharmony_ci else if (dev->driver->remove) 56962306a36Sopenharmony_ci dev->driver->remove(dev); 57062306a36Sopenharmony_ci} 57162306a36Sopenharmony_ci 57262306a36Sopenharmony_cistatic int call_driver_probe(struct device *dev, struct device_driver *drv) 57362306a36Sopenharmony_ci{ 57462306a36Sopenharmony_ci int ret = 0; 57562306a36Sopenharmony_ci 57662306a36Sopenharmony_ci if (dev->bus->probe) 57762306a36Sopenharmony_ci ret = dev->bus->probe(dev); 57862306a36Sopenharmony_ci else if (drv->probe) 57962306a36Sopenharmony_ci ret = drv->probe(dev); 58062306a36Sopenharmony_ci 58162306a36Sopenharmony_ci switch (ret) { 58262306a36Sopenharmony_ci case 0: 58362306a36Sopenharmony_ci break; 58462306a36Sopenharmony_ci case -EPROBE_DEFER: 58562306a36Sopenharmony_ci /* Driver requested deferred probing */ 58662306a36Sopenharmony_ci dev_dbg(dev, "Driver %s requests probe deferral\n", drv->name); 58762306a36Sopenharmony_ci break; 58862306a36Sopenharmony_ci case -ENODEV: 58962306a36Sopenharmony_ci case -ENXIO: 59062306a36Sopenharmony_ci pr_debug("%s: probe of %s rejects match %d\n", 59162306a36Sopenharmony_ci drv->name, dev_name(dev), ret); 59262306a36Sopenharmony_ci break; 59362306a36Sopenharmony_ci default: 59462306a36Sopenharmony_ci /* driver matched but the probe failed */ 59562306a36Sopenharmony_ci pr_warn("%s: probe of %s failed with error %d\n", 59662306a36Sopenharmony_ci drv->name, dev_name(dev), ret); 59762306a36Sopenharmony_ci break; 59862306a36Sopenharmony_ci } 59962306a36Sopenharmony_ci 60062306a36Sopenharmony_ci return ret; 60162306a36Sopenharmony_ci} 60262306a36Sopenharmony_ci 60362306a36Sopenharmony_cistatic int really_probe(struct device *dev, struct device_driver *drv) 60462306a36Sopenharmony_ci{ 60562306a36Sopenharmony_ci bool test_remove = IS_ENABLED(CONFIG_DEBUG_TEST_DRIVER_REMOVE) && 60662306a36Sopenharmony_ci !drv->suppress_bind_attrs; 60762306a36Sopenharmony_ci int ret, link_ret; 60862306a36Sopenharmony_ci 60962306a36Sopenharmony_ci if (defer_all_probes) { 61062306a36Sopenharmony_ci /* 61162306a36Sopenharmony_ci * Value of defer_all_probes can be set only by 61262306a36Sopenharmony_ci * device_block_probing() which, in turn, will call 61362306a36Sopenharmony_ci * wait_for_device_probe() right after that to avoid any races. 61462306a36Sopenharmony_ci */ 61562306a36Sopenharmony_ci dev_dbg(dev, "Driver %s force probe deferral\n", drv->name); 61662306a36Sopenharmony_ci return -EPROBE_DEFER; 61762306a36Sopenharmony_ci } 61862306a36Sopenharmony_ci 61962306a36Sopenharmony_ci link_ret = device_links_check_suppliers(dev); 62062306a36Sopenharmony_ci if (link_ret == -EPROBE_DEFER) 62162306a36Sopenharmony_ci return link_ret; 62262306a36Sopenharmony_ci 62362306a36Sopenharmony_ci pr_debug("bus: '%s': %s: probing driver %s with device %s\n", 62462306a36Sopenharmony_ci drv->bus->name, __func__, drv->name, dev_name(dev)); 62562306a36Sopenharmony_ci if (!list_empty(&dev->devres_head)) { 62662306a36Sopenharmony_ci dev_crit(dev, "Resources present before probing\n"); 62762306a36Sopenharmony_ci ret = -EBUSY; 62862306a36Sopenharmony_ci goto done; 62962306a36Sopenharmony_ci } 63062306a36Sopenharmony_ci 63162306a36Sopenharmony_cire_probe: 63262306a36Sopenharmony_ci dev->driver = drv; 63362306a36Sopenharmony_ci 63462306a36Sopenharmony_ci /* If using pinctrl, bind pins now before probing */ 63562306a36Sopenharmony_ci ret = pinctrl_bind_pins(dev); 63662306a36Sopenharmony_ci if (ret) 63762306a36Sopenharmony_ci goto pinctrl_bind_failed; 63862306a36Sopenharmony_ci 63962306a36Sopenharmony_ci if (dev->bus->dma_configure) { 64062306a36Sopenharmony_ci ret = dev->bus->dma_configure(dev); 64162306a36Sopenharmony_ci if (ret) 64262306a36Sopenharmony_ci goto pinctrl_bind_failed; 64362306a36Sopenharmony_ci } 64462306a36Sopenharmony_ci 64562306a36Sopenharmony_ci ret = driver_sysfs_add(dev); 64662306a36Sopenharmony_ci if (ret) { 64762306a36Sopenharmony_ci pr_err("%s: driver_sysfs_add(%s) failed\n", 64862306a36Sopenharmony_ci __func__, dev_name(dev)); 64962306a36Sopenharmony_ci goto sysfs_failed; 65062306a36Sopenharmony_ci } 65162306a36Sopenharmony_ci 65262306a36Sopenharmony_ci if (dev->pm_domain && dev->pm_domain->activate) { 65362306a36Sopenharmony_ci ret = dev->pm_domain->activate(dev); 65462306a36Sopenharmony_ci if (ret) 65562306a36Sopenharmony_ci goto probe_failed; 65662306a36Sopenharmony_ci } 65762306a36Sopenharmony_ci 65862306a36Sopenharmony_ci ret = call_driver_probe(dev, drv); 65962306a36Sopenharmony_ci if (ret) { 66062306a36Sopenharmony_ci /* 66162306a36Sopenharmony_ci * If fw_devlink_best_effort is active (denoted by -EAGAIN), the 66262306a36Sopenharmony_ci * device might actually probe properly once some of its missing 66362306a36Sopenharmony_ci * suppliers have probed. So, treat this as if the driver 66462306a36Sopenharmony_ci * returned -EPROBE_DEFER. 66562306a36Sopenharmony_ci */ 66662306a36Sopenharmony_ci if (link_ret == -EAGAIN) 66762306a36Sopenharmony_ci ret = -EPROBE_DEFER; 66862306a36Sopenharmony_ci 66962306a36Sopenharmony_ci /* 67062306a36Sopenharmony_ci * Return probe errors as positive values so that the callers 67162306a36Sopenharmony_ci * can distinguish them from other errors. 67262306a36Sopenharmony_ci */ 67362306a36Sopenharmony_ci ret = -ret; 67462306a36Sopenharmony_ci goto probe_failed; 67562306a36Sopenharmony_ci } 67662306a36Sopenharmony_ci 67762306a36Sopenharmony_ci ret = device_add_groups(dev, drv->dev_groups); 67862306a36Sopenharmony_ci if (ret) { 67962306a36Sopenharmony_ci dev_err(dev, "device_add_groups() failed\n"); 68062306a36Sopenharmony_ci goto dev_groups_failed; 68162306a36Sopenharmony_ci } 68262306a36Sopenharmony_ci 68362306a36Sopenharmony_ci if (dev_has_sync_state(dev)) { 68462306a36Sopenharmony_ci ret = device_create_file(dev, &dev_attr_state_synced); 68562306a36Sopenharmony_ci if (ret) { 68662306a36Sopenharmony_ci dev_err(dev, "state_synced sysfs add failed\n"); 68762306a36Sopenharmony_ci goto dev_sysfs_state_synced_failed; 68862306a36Sopenharmony_ci } 68962306a36Sopenharmony_ci } 69062306a36Sopenharmony_ci 69162306a36Sopenharmony_ci if (test_remove) { 69262306a36Sopenharmony_ci test_remove = false; 69362306a36Sopenharmony_ci 69462306a36Sopenharmony_ci device_remove(dev); 69562306a36Sopenharmony_ci driver_sysfs_remove(dev); 69662306a36Sopenharmony_ci if (dev->bus && dev->bus->dma_cleanup) 69762306a36Sopenharmony_ci dev->bus->dma_cleanup(dev); 69862306a36Sopenharmony_ci device_unbind_cleanup(dev); 69962306a36Sopenharmony_ci 70062306a36Sopenharmony_ci goto re_probe; 70162306a36Sopenharmony_ci } 70262306a36Sopenharmony_ci 70362306a36Sopenharmony_ci pinctrl_init_done(dev); 70462306a36Sopenharmony_ci 70562306a36Sopenharmony_ci if (dev->pm_domain && dev->pm_domain->sync) 70662306a36Sopenharmony_ci dev->pm_domain->sync(dev); 70762306a36Sopenharmony_ci 70862306a36Sopenharmony_ci driver_bound(dev); 70962306a36Sopenharmony_ci pr_debug("bus: '%s': %s: bound device %s to driver %s\n", 71062306a36Sopenharmony_ci drv->bus->name, __func__, dev_name(dev), drv->name); 71162306a36Sopenharmony_ci goto done; 71262306a36Sopenharmony_ci 71362306a36Sopenharmony_cidev_sysfs_state_synced_failed: 71462306a36Sopenharmony_cidev_groups_failed: 71562306a36Sopenharmony_ci device_remove(dev); 71662306a36Sopenharmony_ciprobe_failed: 71762306a36Sopenharmony_ci driver_sysfs_remove(dev); 71862306a36Sopenharmony_cisysfs_failed: 71962306a36Sopenharmony_ci bus_notify(dev, BUS_NOTIFY_DRIVER_NOT_BOUND); 72062306a36Sopenharmony_ci if (dev->bus && dev->bus->dma_cleanup) 72162306a36Sopenharmony_ci dev->bus->dma_cleanup(dev); 72262306a36Sopenharmony_cipinctrl_bind_failed: 72362306a36Sopenharmony_ci device_links_no_driver(dev); 72462306a36Sopenharmony_ci device_unbind_cleanup(dev); 72562306a36Sopenharmony_cidone: 72662306a36Sopenharmony_ci return ret; 72762306a36Sopenharmony_ci} 72862306a36Sopenharmony_ci 72962306a36Sopenharmony_ci/* 73062306a36Sopenharmony_ci * For initcall_debug, show the driver probe time. 73162306a36Sopenharmony_ci */ 73262306a36Sopenharmony_cistatic int really_probe_debug(struct device *dev, struct device_driver *drv) 73362306a36Sopenharmony_ci{ 73462306a36Sopenharmony_ci ktime_t calltime, rettime; 73562306a36Sopenharmony_ci int ret; 73662306a36Sopenharmony_ci 73762306a36Sopenharmony_ci calltime = ktime_get(); 73862306a36Sopenharmony_ci ret = really_probe(dev, drv); 73962306a36Sopenharmony_ci rettime = ktime_get(); 74062306a36Sopenharmony_ci /* 74162306a36Sopenharmony_ci * Don't change this to pr_debug() because that requires 74262306a36Sopenharmony_ci * CONFIG_DYNAMIC_DEBUG and we want a simple 'initcall_debug' on the 74362306a36Sopenharmony_ci * kernel commandline to print this all the time at the debug level. 74462306a36Sopenharmony_ci */ 74562306a36Sopenharmony_ci printk(KERN_DEBUG "probe of %s returned %d after %lld usecs\n", 74662306a36Sopenharmony_ci dev_name(dev), ret, ktime_us_delta(rettime, calltime)); 74762306a36Sopenharmony_ci return ret; 74862306a36Sopenharmony_ci} 74962306a36Sopenharmony_ci 75062306a36Sopenharmony_ci/** 75162306a36Sopenharmony_ci * driver_probe_done 75262306a36Sopenharmony_ci * Determine if the probe sequence is finished or not. 75362306a36Sopenharmony_ci * 75462306a36Sopenharmony_ci * Should somehow figure out how to use a semaphore, not an atomic variable... 75562306a36Sopenharmony_ci */ 75662306a36Sopenharmony_cibool __init driver_probe_done(void) 75762306a36Sopenharmony_ci{ 75862306a36Sopenharmony_ci int local_probe_count = atomic_read(&probe_count); 75962306a36Sopenharmony_ci 76062306a36Sopenharmony_ci pr_debug("%s: probe_count = %d\n", __func__, local_probe_count); 76162306a36Sopenharmony_ci return !local_probe_count; 76262306a36Sopenharmony_ci} 76362306a36Sopenharmony_ci 76462306a36Sopenharmony_ci/** 76562306a36Sopenharmony_ci * wait_for_device_probe 76662306a36Sopenharmony_ci * Wait for device probing to be completed. 76762306a36Sopenharmony_ci */ 76862306a36Sopenharmony_civoid wait_for_device_probe(void) 76962306a36Sopenharmony_ci{ 77062306a36Sopenharmony_ci /* wait for the deferred probe workqueue to finish */ 77162306a36Sopenharmony_ci flush_work(&deferred_probe_work); 77262306a36Sopenharmony_ci 77362306a36Sopenharmony_ci /* wait for the known devices to complete their probing */ 77462306a36Sopenharmony_ci wait_event(probe_waitqueue, atomic_read(&probe_count) == 0); 77562306a36Sopenharmony_ci async_synchronize_full(); 77662306a36Sopenharmony_ci} 77762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(wait_for_device_probe); 77862306a36Sopenharmony_ci 77962306a36Sopenharmony_cistatic int __driver_probe_device(struct device_driver *drv, struct device *dev) 78062306a36Sopenharmony_ci{ 78162306a36Sopenharmony_ci int ret = 0; 78262306a36Sopenharmony_ci 78362306a36Sopenharmony_ci if (dev->p->dead || !device_is_registered(dev)) 78462306a36Sopenharmony_ci return -ENODEV; 78562306a36Sopenharmony_ci if (dev->driver) 78662306a36Sopenharmony_ci return -EBUSY; 78762306a36Sopenharmony_ci 78862306a36Sopenharmony_ci dev->can_match = true; 78962306a36Sopenharmony_ci pr_debug("bus: '%s': %s: matched device %s with driver %s\n", 79062306a36Sopenharmony_ci drv->bus->name, __func__, dev_name(dev), drv->name); 79162306a36Sopenharmony_ci 79262306a36Sopenharmony_ci pm_runtime_get_suppliers(dev); 79362306a36Sopenharmony_ci if (dev->parent) 79462306a36Sopenharmony_ci pm_runtime_get_sync(dev->parent); 79562306a36Sopenharmony_ci 79662306a36Sopenharmony_ci pm_runtime_barrier(dev); 79762306a36Sopenharmony_ci if (initcall_debug) 79862306a36Sopenharmony_ci ret = really_probe_debug(dev, drv); 79962306a36Sopenharmony_ci else 80062306a36Sopenharmony_ci ret = really_probe(dev, drv); 80162306a36Sopenharmony_ci pm_request_idle(dev); 80262306a36Sopenharmony_ci 80362306a36Sopenharmony_ci if (dev->parent) 80462306a36Sopenharmony_ci pm_runtime_put(dev->parent); 80562306a36Sopenharmony_ci 80662306a36Sopenharmony_ci pm_runtime_put_suppliers(dev); 80762306a36Sopenharmony_ci return ret; 80862306a36Sopenharmony_ci} 80962306a36Sopenharmony_ci 81062306a36Sopenharmony_ci/** 81162306a36Sopenharmony_ci * driver_probe_device - attempt to bind device & driver together 81262306a36Sopenharmony_ci * @drv: driver to bind a device to 81362306a36Sopenharmony_ci * @dev: device to try to bind to the driver 81462306a36Sopenharmony_ci * 81562306a36Sopenharmony_ci * This function returns -ENODEV if the device is not registered, -EBUSY if it 81662306a36Sopenharmony_ci * already has a driver, 0 if the device is bound successfully and a positive 81762306a36Sopenharmony_ci * (inverted) error code for failures from the ->probe method. 81862306a36Sopenharmony_ci * 81962306a36Sopenharmony_ci * This function must be called with @dev lock held. When called for a 82062306a36Sopenharmony_ci * USB interface, @dev->parent lock must be held as well. 82162306a36Sopenharmony_ci * 82262306a36Sopenharmony_ci * If the device has a parent, runtime-resume the parent before driver probing. 82362306a36Sopenharmony_ci */ 82462306a36Sopenharmony_cistatic int driver_probe_device(struct device_driver *drv, struct device *dev) 82562306a36Sopenharmony_ci{ 82662306a36Sopenharmony_ci int trigger_count = atomic_read(&deferred_trigger_count); 82762306a36Sopenharmony_ci int ret; 82862306a36Sopenharmony_ci 82962306a36Sopenharmony_ci atomic_inc(&probe_count); 83062306a36Sopenharmony_ci ret = __driver_probe_device(drv, dev); 83162306a36Sopenharmony_ci if (ret == -EPROBE_DEFER || ret == EPROBE_DEFER) { 83262306a36Sopenharmony_ci driver_deferred_probe_add(dev); 83362306a36Sopenharmony_ci 83462306a36Sopenharmony_ci /* 83562306a36Sopenharmony_ci * Did a trigger occur while probing? Need to re-trigger if yes 83662306a36Sopenharmony_ci */ 83762306a36Sopenharmony_ci if (trigger_count != atomic_read(&deferred_trigger_count) && 83862306a36Sopenharmony_ci !defer_all_probes) 83962306a36Sopenharmony_ci driver_deferred_probe_trigger(); 84062306a36Sopenharmony_ci } 84162306a36Sopenharmony_ci atomic_dec(&probe_count); 84262306a36Sopenharmony_ci wake_up_all(&probe_waitqueue); 84362306a36Sopenharmony_ci return ret; 84462306a36Sopenharmony_ci} 84562306a36Sopenharmony_ci 84662306a36Sopenharmony_cistatic inline bool cmdline_requested_async_probing(const char *drv_name) 84762306a36Sopenharmony_ci{ 84862306a36Sopenharmony_ci bool async_drv; 84962306a36Sopenharmony_ci 85062306a36Sopenharmony_ci async_drv = parse_option_str(async_probe_drv_names, drv_name); 85162306a36Sopenharmony_ci 85262306a36Sopenharmony_ci return (async_probe_default != async_drv); 85362306a36Sopenharmony_ci} 85462306a36Sopenharmony_ci 85562306a36Sopenharmony_ci/* The option format is "driver_async_probe=drv_name1,drv_name2,..." */ 85662306a36Sopenharmony_cistatic int __init save_async_options(char *buf) 85762306a36Sopenharmony_ci{ 85862306a36Sopenharmony_ci if (strlen(buf) >= ASYNC_DRV_NAMES_MAX_LEN) 85962306a36Sopenharmony_ci pr_warn("Too long list of driver names for 'driver_async_probe'!\n"); 86062306a36Sopenharmony_ci 86162306a36Sopenharmony_ci strscpy(async_probe_drv_names, buf, ASYNC_DRV_NAMES_MAX_LEN); 86262306a36Sopenharmony_ci async_probe_default = parse_option_str(async_probe_drv_names, "*"); 86362306a36Sopenharmony_ci 86462306a36Sopenharmony_ci return 1; 86562306a36Sopenharmony_ci} 86662306a36Sopenharmony_ci__setup("driver_async_probe=", save_async_options); 86762306a36Sopenharmony_ci 86862306a36Sopenharmony_cistatic bool driver_allows_async_probing(struct device_driver *drv) 86962306a36Sopenharmony_ci{ 87062306a36Sopenharmony_ci switch (drv->probe_type) { 87162306a36Sopenharmony_ci case PROBE_PREFER_ASYNCHRONOUS: 87262306a36Sopenharmony_ci return true; 87362306a36Sopenharmony_ci 87462306a36Sopenharmony_ci case PROBE_FORCE_SYNCHRONOUS: 87562306a36Sopenharmony_ci return false; 87662306a36Sopenharmony_ci 87762306a36Sopenharmony_ci default: 87862306a36Sopenharmony_ci if (cmdline_requested_async_probing(drv->name)) 87962306a36Sopenharmony_ci return true; 88062306a36Sopenharmony_ci 88162306a36Sopenharmony_ci if (module_requested_async_probing(drv->owner)) 88262306a36Sopenharmony_ci return true; 88362306a36Sopenharmony_ci 88462306a36Sopenharmony_ci return false; 88562306a36Sopenharmony_ci } 88662306a36Sopenharmony_ci} 88762306a36Sopenharmony_ci 88862306a36Sopenharmony_cistruct device_attach_data { 88962306a36Sopenharmony_ci struct device *dev; 89062306a36Sopenharmony_ci 89162306a36Sopenharmony_ci /* 89262306a36Sopenharmony_ci * Indicates whether we are considering asynchronous probing or 89362306a36Sopenharmony_ci * not. Only initial binding after device or driver registration 89462306a36Sopenharmony_ci * (including deferral processing) may be done asynchronously, the 89562306a36Sopenharmony_ci * rest is always synchronous, as we expect it is being done by 89662306a36Sopenharmony_ci * request from userspace. 89762306a36Sopenharmony_ci */ 89862306a36Sopenharmony_ci bool check_async; 89962306a36Sopenharmony_ci 90062306a36Sopenharmony_ci /* 90162306a36Sopenharmony_ci * Indicates if we are binding synchronous or asynchronous drivers. 90262306a36Sopenharmony_ci * When asynchronous probing is enabled we'll execute 2 passes 90362306a36Sopenharmony_ci * over drivers: first pass doing synchronous probing and second 90462306a36Sopenharmony_ci * doing asynchronous probing (if synchronous did not succeed - 90562306a36Sopenharmony_ci * most likely because there was no driver requiring synchronous 90662306a36Sopenharmony_ci * probing - and we found asynchronous driver during first pass). 90762306a36Sopenharmony_ci * The 2 passes are done because we can't shoot asynchronous 90862306a36Sopenharmony_ci * probe for given device and driver from bus_for_each_drv() since 90962306a36Sopenharmony_ci * driver pointer is not guaranteed to stay valid once 91062306a36Sopenharmony_ci * bus_for_each_drv() iterates to the next driver on the bus. 91162306a36Sopenharmony_ci */ 91262306a36Sopenharmony_ci bool want_async; 91362306a36Sopenharmony_ci 91462306a36Sopenharmony_ci /* 91562306a36Sopenharmony_ci * We'll set have_async to 'true' if, while scanning for matching 91662306a36Sopenharmony_ci * driver, we'll encounter one that requests asynchronous probing. 91762306a36Sopenharmony_ci */ 91862306a36Sopenharmony_ci bool have_async; 91962306a36Sopenharmony_ci}; 92062306a36Sopenharmony_ci 92162306a36Sopenharmony_cistatic int __device_attach_driver(struct device_driver *drv, void *_data) 92262306a36Sopenharmony_ci{ 92362306a36Sopenharmony_ci struct device_attach_data *data = _data; 92462306a36Sopenharmony_ci struct device *dev = data->dev; 92562306a36Sopenharmony_ci bool async_allowed; 92662306a36Sopenharmony_ci int ret; 92762306a36Sopenharmony_ci 92862306a36Sopenharmony_ci ret = driver_match_device(drv, dev); 92962306a36Sopenharmony_ci if (ret == 0) { 93062306a36Sopenharmony_ci /* no match */ 93162306a36Sopenharmony_ci return 0; 93262306a36Sopenharmony_ci } else if (ret == -EPROBE_DEFER) { 93362306a36Sopenharmony_ci dev_dbg(dev, "Device match requests probe deferral\n"); 93462306a36Sopenharmony_ci dev->can_match = true; 93562306a36Sopenharmony_ci driver_deferred_probe_add(dev); 93662306a36Sopenharmony_ci /* 93762306a36Sopenharmony_ci * Device can't match with a driver right now, so don't attempt 93862306a36Sopenharmony_ci * to match or bind with other drivers on the bus. 93962306a36Sopenharmony_ci */ 94062306a36Sopenharmony_ci return ret; 94162306a36Sopenharmony_ci } else if (ret < 0) { 94262306a36Sopenharmony_ci dev_dbg(dev, "Bus failed to match device: %d\n", ret); 94362306a36Sopenharmony_ci return ret; 94462306a36Sopenharmony_ci } /* ret > 0 means positive match */ 94562306a36Sopenharmony_ci 94662306a36Sopenharmony_ci async_allowed = driver_allows_async_probing(drv); 94762306a36Sopenharmony_ci 94862306a36Sopenharmony_ci if (async_allowed) 94962306a36Sopenharmony_ci data->have_async = true; 95062306a36Sopenharmony_ci 95162306a36Sopenharmony_ci if (data->check_async && async_allowed != data->want_async) 95262306a36Sopenharmony_ci return 0; 95362306a36Sopenharmony_ci 95462306a36Sopenharmony_ci /* 95562306a36Sopenharmony_ci * Ignore errors returned by ->probe so that the next driver can try 95662306a36Sopenharmony_ci * its luck. 95762306a36Sopenharmony_ci */ 95862306a36Sopenharmony_ci ret = driver_probe_device(drv, dev); 95962306a36Sopenharmony_ci if (ret < 0) 96062306a36Sopenharmony_ci return ret; 96162306a36Sopenharmony_ci return ret == 0; 96262306a36Sopenharmony_ci} 96362306a36Sopenharmony_ci 96462306a36Sopenharmony_cistatic void __device_attach_async_helper(void *_dev, async_cookie_t cookie) 96562306a36Sopenharmony_ci{ 96662306a36Sopenharmony_ci struct device *dev = _dev; 96762306a36Sopenharmony_ci struct device_attach_data data = { 96862306a36Sopenharmony_ci .dev = dev, 96962306a36Sopenharmony_ci .check_async = true, 97062306a36Sopenharmony_ci .want_async = true, 97162306a36Sopenharmony_ci }; 97262306a36Sopenharmony_ci 97362306a36Sopenharmony_ci device_lock(dev); 97462306a36Sopenharmony_ci 97562306a36Sopenharmony_ci /* 97662306a36Sopenharmony_ci * Check if device has already been removed or claimed. This may 97762306a36Sopenharmony_ci * happen with driver loading, device discovery/registration, 97862306a36Sopenharmony_ci * and deferred probe processing happens all at once with 97962306a36Sopenharmony_ci * multiple threads. 98062306a36Sopenharmony_ci */ 98162306a36Sopenharmony_ci if (dev->p->dead || dev->driver) 98262306a36Sopenharmony_ci goto out_unlock; 98362306a36Sopenharmony_ci 98462306a36Sopenharmony_ci if (dev->parent) 98562306a36Sopenharmony_ci pm_runtime_get_sync(dev->parent); 98662306a36Sopenharmony_ci 98762306a36Sopenharmony_ci bus_for_each_drv(dev->bus, NULL, &data, __device_attach_driver); 98862306a36Sopenharmony_ci dev_dbg(dev, "async probe completed\n"); 98962306a36Sopenharmony_ci 99062306a36Sopenharmony_ci pm_request_idle(dev); 99162306a36Sopenharmony_ci 99262306a36Sopenharmony_ci if (dev->parent) 99362306a36Sopenharmony_ci pm_runtime_put(dev->parent); 99462306a36Sopenharmony_ciout_unlock: 99562306a36Sopenharmony_ci device_unlock(dev); 99662306a36Sopenharmony_ci 99762306a36Sopenharmony_ci put_device(dev); 99862306a36Sopenharmony_ci} 99962306a36Sopenharmony_ci 100062306a36Sopenharmony_cistatic int __device_attach(struct device *dev, bool allow_async) 100162306a36Sopenharmony_ci{ 100262306a36Sopenharmony_ci int ret = 0; 100362306a36Sopenharmony_ci bool async = false; 100462306a36Sopenharmony_ci 100562306a36Sopenharmony_ci device_lock(dev); 100662306a36Sopenharmony_ci if (dev->p->dead) { 100762306a36Sopenharmony_ci goto out_unlock; 100862306a36Sopenharmony_ci } else if (dev->driver) { 100962306a36Sopenharmony_ci if (device_is_bound(dev)) { 101062306a36Sopenharmony_ci ret = 1; 101162306a36Sopenharmony_ci goto out_unlock; 101262306a36Sopenharmony_ci } 101362306a36Sopenharmony_ci ret = device_bind_driver(dev); 101462306a36Sopenharmony_ci if (ret == 0) 101562306a36Sopenharmony_ci ret = 1; 101662306a36Sopenharmony_ci else { 101762306a36Sopenharmony_ci dev->driver = NULL; 101862306a36Sopenharmony_ci ret = 0; 101962306a36Sopenharmony_ci } 102062306a36Sopenharmony_ci } else { 102162306a36Sopenharmony_ci struct device_attach_data data = { 102262306a36Sopenharmony_ci .dev = dev, 102362306a36Sopenharmony_ci .check_async = allow_async, 102462306a36Sopenharmony_ci .want_async = false, 102562306a36Sopenharmony_ci }; 102662306a36Sopenharmony_ci 102762306a36Sopenharmony_ci if (dev->parent) 102862306a36Sopenharmony_ci pm_runtime_get_sync(dev->parent); 102962306a36Sopenharmony_ci 103062306a36Sopenharmony_ci ret = bus_for_each_drv(dev->bus, NULL, &data, 103162306a36Sopenharmony_ci __device_attach_driver); 103262306a36Sopenharmony_ci if (!ret && allow_async && data.have_async) { 103362306a36Sopenharmony_ci /* 103462306a36Sopenharmony_ci * If we could not find appropriate driver 103562306a36Sopenharmony_ci * synchronously and we are allowed to do 103662306a36Sopenharmony_ci * async probes and there are drivers that 103762306a36Sopenharmony_ci * want to probe asynchronously, we'll 103862306a36Sopenharmony_ci * try them. 103962306a36Sopenharmony_ci */ 104062306a36Sopenharmony_ci dev_dbg(dev, "scheduling asynchronous probe\n"); 104162306a36Sopenharmony_ci get_device(dev); 104262306a36Sopenharmony_ci async = true; 104362306a36Sopenharmony_ci } else { 104462306a36Sopenharmony_ci pm_request_idle(dev); 104562306a36Sopenharmony_ci } 104662306a36Sopenharmony_ci 104762306a36Sopenharmony_ci if (dev->parent) 104862306a36Sopenharmony_ci pm_runtime_put(dev->parent); 104962306a36Sopenharmony_ci } 105062306a36Sopenharmony_ciout_unlock: 105162306a36Sopenharmony_ci device_unlock(dev); 105262306a36Sopenharmony_ci if (async) 105362306a36Sopenharmony_ci async_schedule_dev(__device_attach_async_helper, dev); 105462306a36Sopenharmony_ci return ret; 105562306a36Sopenharmony_ci} 105662306a36Sopenharmony_ci 105762306a36Sopenharmony_ci/** 105862306a36Sopenharmony_ci * device_attach - try to attach device to a driver. 105962306a36Sopenharmony_ci * @dev: device. 106062306a36Sopenharmony_ci * 106162306a36Sopenharmony_ci * Walk the list of drivers that the bus has and call 106262306a36Sopenharmony_ci * driver_probe_device() for each pair. If a compatible 106362306a36Sopenharmony_ci * pair is found, break out and return. 106462306a36Sopenharmony_ci * 106562306a36Sopenharmony_ci * Returns 1 if the device was bound to a driver; 106662306a36Sopenharmony_ci * 0 if no matching driver was found; 106762306a36Sopenharmony_ci * -ENODEV if the device is not registered. 106862306a36Sopenharmony_ci * 106962306a36Sopenharmony_ci * When called for a USB interface, @dev->parent lock must be held. 107062306a36Sopenharmony_ci */ 107162306a36Sopenharmony_ciint device_attach(struct device *dev) 107262306a36Sopenharmony_ci{ 107362306a36Sopenharmony_ci return __device_attach(dev, false); 107462306a36Sopenharmony_ci} 107562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(device_attach); 107662306a36Sopenharmony_ci 107762306a36Sopenharmony_civoid device_initial_probe(struct device *dev) 107862306a36Sopenharmony_ci{ 107962306a36Sopenharmony_ci __device_attach(dev, true); 108062306a36Sopenharmony_ci} 108162306a36Sopenharmony_ci 108262306a36Sopenharmony_ci/* 108362306a36Sopenharmony_ci * __device_driver_lock - acquire locks needed to manipulate dev->drv 108462306a36Sopenharmony_ci * @dev: Device we will update driver info for 108562306a36Sopenharmony_ci * @parent: Parent device. Needed if the bus requires parent lock 108662306a36Sopenharmony_ci * 108762306a36Sopenharmony_ci * This function will take the required locks for manipulating dev->drv. 108862306a36Sopenharmony_ci * Normally this will just be the @dev lock, but when called for a USB 108962306a36Sopenharmony_ci * interface, @parent lock will be held as well. 109062306a36Sopenharmony_ci */ 109162306a36Sopenharmony_cistatic void __device_driver_lock(struct device *dev, struct device *parent) 109262306a36Sopenharmony_ci{ 109362306a36Sopenharmony_ci if (parent && dev->bus->need_parent_lock) 109462306a36Sopenharmony_ci device_lock(parent); 109562306a36Sopenharmony_ci device_lock(dev); 109662306a36Sopenharmony_ci} 109762306a36Sopenharmony_ci 109862306a36Sopenharmony_ci/* 109962306a36Sopenharmony_ci * __device_driver_unlock - release locks needed to manipulate dev->drv 110062306a36Sopenharmony_ci * @dev: Device we will update driver info for 110162306a36Sopenharmony_ci * @parent: Parent device. Needed if the bus requires parent lock 110262306a36Sopenharmony_ci * 110362306a36Sopenharmony_ci * This function will release the required locks for manipulating dev->drv. 110462306a36Sopenharmony_ci * Normally this will just be the @dev lock, but when called for a 110562306a36Sopenharmony_ci * USB interface, @parent lock will be released as well. 110662306a36Sopenharmony_ci */ 110762306a36Sopenharmony_cistatic void __device_driver_unlock(struct device *dev, struct device *parent) 110862306a36Sopenharmony_ci{ 110962306a36Sopenharmony_ci device_unlock(dev); 111062306a36Sopenharmony_ci if (parent && dev->bus->need_parent_lock) 111162306a36Sopenharmony_ci device_unlock(parent); 111262306a36Sopenharmony_ci} 111362306a36Sopenharmony_ci 111462306a36Sopenharmony_ci/** 111562306a36Sopenharmony_ci * device_driver_attach - attach a specific driver to a specific device 111662306a36Sopenharmony_ci * @drv: Driver to attach 111762306a36Sopenharmony_ci * @dev: Device to attach it to 111862306a36Sopenharmony_ci * 111962306a36Sopenharmony_ci * Manually attach driver to a device. Will acquire both @dev lock and 112062306a36Sopenharmony_ci * @dev->parent lock if needed. Returns 0 on success, -ERR on failure. 112162306a36Sopenharmony_ci */ 112262306a36Sopenharmony_ciint device_driver_attach(struct device_driver *drv, struct device *dev) 112362306a36Sopenharmony_ci{ 112462306a36Sopenharmony_ci int ret; 112562306a36Sopenharmony_ci 112662306a36Sopenharmony_ci __device_driver_lock(dev, dev->parent); 112762306a36Sopenharmony_ci ret = __driver_probe_device(drv, dev); 112862306a36Sopenharmony_ci __device_driver_unlock(dev, dev->parent); 112962306a36Sopenharmony_ci 113062306a36Sopenharmony_ci /* also return probe errors as normal negative errnos */ 113162306a36Sopenharmony_ci if (ret > 0) 113262306a36Sopenharmony_ci ret = -ret; 113362306a36Sopenharmony_ci if (ret == -EPROBE_DEFER) 113462306a36Sopenharmony_ci return -EAGAIN; 113562306a36Sopenharmony_ci return ret; 113662306a36Sopenharmony_ci} 113762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(device_driver_attach); 113862306a36Sopenharmony_ci 113962306a36Sopenharmony_cistatic void __driver_attach_async_helper(void *_dev, async_cookie_t cookie) 114062306a36Sopenharmony_ci{ 114162306a36Sopenharmony_ci struct device *dev = _dev; 114262306a36Sopenharmony_ci struct device_driver *drv; 114362306a36Sopenharmony_ci int ret; 114462306a36Sopenharmony_ci 114562306a36Sopenharmony_ci __device_driver_lock(dev, dev->parent); 114662306a36Sopenharmony_ci drv = dev->p->async_driver; 114762306a36Sopenharmony_ci dev->p->async_driver = NULL; 114862306a36Sopenharmony_ci ret = driver_probe_device(drv, dev); 114962306a36Sopenharmony_ci __device_driver_unlock(dev, dev->parent); 115062306a36Sopenharmony_ci 115162306a36Sopenharmony_ci dev_dbg(dev, "driver %s async attach completed: %d\n", drv->name, ret); 115262306a36Sopenharmony_ci 115362306a36Sopenharmony_ci put_device(dev); 115462306a36Sopenharmony_ci} 115562306a36Sopenharmony_ci 115662306a36Sopenharmony_cistatic int __driver_attach(struct device *dev, void *data) 115762306a36Sopenharmony_ci{ 115862306a36Sopenharmony_ci struct device_driver *drv = data; 115962306a36Sopenharmony_ci bool async = false; 116062306a36Sopenharmony_ci int ret; 116162306a36Sopenharmony_ci 116262306a36Sopenharmony_ci /* 116362306a36Sopenharmony_ci * Lock device and try to bind to it. We drop the error 116462306a36Sopenharmony_ci * here and always return 0, because we need to keep trying 116562306a36Sopenharmony_ci * to bind to devices and some drivers will return an error 116662306a36Sopenharmony_ci * simply if it didn't support the device. 116762306a36Sopenharmony_ci * 116862306a36Sopenharmony_ci * driver_probe_device() will spit a warning if there 116962306a36Sopenharmony_ci * is an error. 117062306a36Sopenharmony_ci */ 117162306a36Sopenharmony_ci 117262306a36Sopenharmony_ci ret = driver_match_device(drv, dev); 117362306a36Sopenharmony_ci if (ret == 0) { 117462306a36Sopenharmony_ci /* no match */ 117562306a36Sopenharmony_ci return 0; 117662306a36Sopenharmony_ci } else if (ret == -EPROBE_DEFER) { 117762306a36Sopenharmony_ci dev_dbg(dev, "Device match requests probe deferral\n"); 117862306a36Sopenharmony_ci dev->can_match = true; 117962306a36Sopenharmony_ci driver_deferred_probe_add(dev); 118062306a36Sopenharmony_ci /* 118162306a36Sopenharmony_ci * Driver could not match with device, but may match with 118262306a36Sopenharmony_ci * another device on the bus. 118362306a36Sopenharmony_ci */ 118462306a36Sopenharmony_ci return 0; 118562306a36Sopenharmony_ci } else if (ret < 0) { 118662306a36Sopenharmony_ci dev_dbg(dev, "Bus failed to match device: %d\n", ret); 118762306a36Sopenharmony_ci /* 118862306a36Sopenharmony_ci * Driver could not match with device, but may match with 118962306a36Sopenharmony_ci * another device on the bus. 119062306a36Sopenharmony_ci */ 119162306a36Sopenharmony_ci return 0; 119262306a36Sopenharmony_ci } /* ret > 0 means positive match */ 119362306a36Sopenharmony_ci 119462306a36Sopenharmony_ci if (driver_allows_async_probing(drv)) { 119562306a36Sopenharmony_ci /* 119662306a36Sopenharmony_ci * Instead of probing the device synchronously we will 119762306a36Sopenharmony_ci * probe it asynchronously to allow for more parallelism. 119862306a36Sopenharmony_ci * 119962306a36Sopenharmony_ci * We only take the device lock here in order to guarantee 120062306a36Sopenharmony_ci * that the dev->driver and async_driver fields are protected 120162306a36Sopenharmony_ci */ 120262306a36Sopenharmony_ci dev_dbg(dev, "probing driver %s asynchronously\n", drv->name); 120362306a36Sopenharmony_ci device_lock(dev); 120462306a36Sopenharmony_ci if (!dev->driver && !dev->p->async_driver) { 120562306a36Sopenharmony_ci get_device(dev); 120662306a36Sopenharmony_ci dev->p->async_driver = drv; 120762306a36Sopenharmony_ci async = true; 120862306a36Sopenharmony_ci } 120962306a36Sopenharmony_ci device_unlock(dev); 121062306a36Sopenharmony_ci if (async) 121162306a36Sopenharmony_ci async_schedule_dev(__driver_attach_async_helper, dev); 121262306a36Sopenharmony_ci return 0; 121362306a36Sopenharmony_ci } 121462306a36Sopenharmony_ci 121562306a36Sopenharmony_ci __device_driver_lock(dev, dev->parent); 121662306a36Sopenharmony_ci driver_probe_device(drv, dev); 121762306a36Sopenharmony_ci __device_driver_unlock(dev, dev->parent); 121862306a36Sopenharmony_ci 121962306a36Sopenharmony_ci return 0; 122062306a36Sopenharmony_ci} 122162306a36Sopenharmony_ci 122262306a36Sopenharmony_ci/** 122362306a36Sopenharmony_ci * driver_attach - try to bind driver to devices. 122462306a36Sopenharmony_ci * @drv: driver. 122562306a36Sopenharmony_ci * 122662306a36Sopenharmony_ci * Walk the list of devices that the bus has on it and try to 122762306a36Sopenharmony_ci * match the driver with each one. If driver_probe_device() 122862306a36Sopenharmony_ci * returns 0 and the @dev->driver is set, we've found a 122962306a36Sopenharmony_ci * compatible pair. 123062306a36Sopenharmony_ci */ 123162306a36Sopenharmony_ciint driver_attach(struct device_driver *drv) 123262306a36Sopenharmony_ci{ 123362306a36Sopenharmony_ci return bus_for_each_dev(drv->bus, NULL, drv, __driver_attach); 123462306a36Sopenharmony_ci} 123562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(driver_attach); 123662306a36Sopenharmony_ci 123762306a36Sopenharmony_ci/* 123862306a36Sopenharmony_ci * __device_release_driver() must be called with @dev lock held. 123962306a36Sopenharmony_ci * When called for a USB interface, @dev->parent lock must be held as well. 124062306a36Sopenharmony_ci */ 124162306a36Sopenharmony_cistatic void __device_release_driver(struct device *dev, struct device *parent) 124262306a36Sopenharmony_ci{ 124362306a36Sopenharmony_ci struct device_driver *drv; 124462306a36Sopenharmony_ci 124562306a36Sopenharmony_ci drv = dev->driver; 124662306a36Sopenharmony_ci if (drv) { 124762306a36Sopenharmony_ci pm_runtime_get_sync(dev); 124862306a36Sopenharmony_ci 124962306a36Sopenharmony_ci while (device_links_busy(dev)) { 125062306a36Sopenharmony_ci __device_driver_unlock(dev, parent); 125162306a36Sopenharmony_ci 125262306a36Sopenharmony_ci device_links_unbind_consumers(dev); 125362306a36Sopenharmony_ci 125462306a36Sopenharmony_ci __device_driver_lock(dev, parent); 125562306a36Sopenharmony_ci /* 125662306a36Sopenharmony_ci * A concurrent invocation of the same function might 125762306a36Sopenharmony_ci * have released the driver successfully while this one 125862306a36Sopenharmony_ci * was waiting, so check for that. 125962306a36Sopenharmony_ci */ 126062306a36Sopenharmony_ci if (dev->driver != drv) { 126162306a36Sopenharmony_ci pm_runtime_put(dev); 126262306a36Sopenharmony_ci return; 126362306a36Sopenharmony_ci } 126462306a36Sopenharmony_ci } 126562306a36Sopenharmony_ci 126662306a36Sopenharmony_ci driver_sysfs_remove(dev); 126762306a36Sopenharmony_ci 126862306a36Sopenharmony_ci bus_notify(dev, BUS_NOTIFY_UNBIND_DRIVER); 126962306a36Sopenharmony_ci 127062306a36Sopenharmony_ci pm_runtime_put_sync(dev); 127162306a36Sopenharmony_ci 127262306a36Sopenharmony_ci device_remove(dev); 127362306a36Sopenharmony_ci 127462306a36Sopenharmony_ci if (dev->bus && dev->bus->dma_cleanup) 127562306a36Sopenharmony_ci dev->bus->dma_cleanup(dev); 127662306a36Sopenharmony_ci 127762306a36Sopenharmony_ci device_unbind_cleanup(dev); 127862306a36Sopenharmony_ci device_links_driver_cleanup(dev); 127962306a36Sopenharmony_ci 128062306a36Sopenharmony_ci klist_remove(&dev->p->knode_driver); 128162306a36Sopenharmony_ci device_pm_check_callbacks(dev); 128262306a36Sopenharmony_ci 128362306a36Sopenharmony_ci bus_notify(dev, BUS_NOTIFY_UNBOUND_DRIVER); 128462306a36Sopenharmony_ci kobject_uevent(&dev->kobj, KOBJ_UNBIND); 128562306a36Sopenharmony_ci } 128662306a36Sopenharmony_ci} 128762306a36Sopenharmony_ci 128862306a36Sopenharmony_civoid device_release_driver_internal(struct device *dev, 128962306a36Sopenharmony_ci struct device_driver *drv, 129062306a36Sopenharmony_ci struct device *parent) 129162306a36Sopenharmony_ci{ 129262306a36Sopenharmony_ci __device_driver_lock(dev, parent); 129362306a36Sopenharmony_ci 129462306a36Sopenharmony_ci if (!drv || drv == dev->driver) 129562306a36Sopenharmony_ci __device_release_driver(dev, parent); 129662306a36Sopenharmony_ci 129762306a36Sopenharmony_ci __device_driver_unlock(dev, parent); 129862306a36Sopenharmony_ci} 129962306a36Sopenharmony_ci 130062306a36Sopenharmony_ci/** 130162306a36Sopenharmony_ci * device_release_driver - manually detach device from driver. 130262306a36Sopenharmony_ci * @dev: device. 130362306a36Sopenharmony_ci * 130462306a36Sopenharmony_ci * Manually detach device from driver. 130562306a36Sopenharmony_ci * When called for a USB interface, @dev->parent lock must be held. 130662306a36Sopenharmony_ci * 130762306a36Sopenharmony_ci * If this function is to be called with @dev->parent lock held, ensure that 130862306a36Sopenharmony_ci * the device's consumers are unbound in advance or that their locks can be 130962306a36Sopenharmony_ci * acquired under the @dev->parent lock. 131062306a36Sopenharmony_ci */ 131162306a36Sopenharmony_civoid device_release_driver(struct device *dev) 131262306a36Sopenharmony_ci{ 131362306a36Sopenharmony_ci /* 131462306a36Sopenharmony_ci * If anyone calls device_release_driver() recursively from 131562306a36Sopenharmony_ci * within their ->remove callback for the same device, they 131662306a36Sopenharmony_ci * will deadlock right here. 131762306a36Sopenharmony_ci */ 131862306a36Sopenharmony_ci device_release_driver_internal(dev, NULL, NULL); 131962306a36Sopenharmony_ci} 132062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(device_release_driver); 132162306a36Sopenharmony_ci 132262306a36Sopenharmony_ci/** 132362306a36Sopenharmony_ci * device_driver_detach - detach driver from a specific device 132462306a36Sopenharmony_ci * @dev: device to detach driver from 132562306a36Sopenharmony_ci * 132662306a36Sopenharmony_ci * Detach driver from device. Will acquire both @dev lock and @dev->parent 132762306a36Sopenharmony_ci * lock if needed. 132862306a36Sopenharmony_ci */ 132962306a36Sopenharmony_civoid device_driver_detach(struct device *dev) 133062306a36Sopenharmony_ci{ 133162306a36Sopenharmony_ci device_release_driver_internal(dev, NULL, dev->parent); 133262306a36Sopenharmony_ci} 133362306a36Sopenharmony_ci 133462306a36Sopenharmony_ci/** 133562306a36Sopenharmony_ci * driver_detach - detach driver from all devices it controls. 133662306a36Sopenharmony_ci * @drv: driver. 133762306a36Sopenharmony_ci */ 133862306a36Sopenharmony_civoid driver_detach(struct device_driver *drv) 133962306a36Sopenharmony_ci{ 134062306a36Sopenharmony_ci struct device_private *dev_prv; 134162306a36Sopenharmony_ci struct device *dev; 134262306a36Sopenharmony_ci 134362306a36Sopenharmony_ci if (driver_allows_async_probing(drv)) 134462306a36Sopenharmony_ci async_synchronize_full(); 134562306a36Sopenharmony_ci 134662306a36Sopenharmony_ci for (;;) { 134762306a36Sopenharmony_ci spin_lock(&drv->p->klist_devices.k_lock); 134862306a36Sopenharmony_ci if (list_empty(&drv->p->klist_devices.k_list)) { 134962306a36Sopenharmony_ci spin_unlock(&drv->p->klist_devices.k_lock); 135062306a36Sopenharmony_ci break; 135162306a36Sopenharmony_ci } 135262306a36Sopenharmony_ci dev_prv = list_last_entry(&drv->p->klist_devices.k_list, 135362306a36Sopenharmony_ci struct device_private, 135462306a36Sopenharmony_ci knode_driver.n_node); 135562306a36Sopenharmony_ci dev = dev_prv->device; 135662306a36Sopenharmony_ci get_device(dev); 135762306a36Sopenharmony_ci spin_unlock(&drv->p->klist_devices.k_lock); 135862306a36Sopenharmony_ci device_release_driver_internal(dev, drv, dev->parent); 135962306a36Sopenharmony_ci put_device(dev); 136062306a36Sopenharmony_ci } 136162306a36Sopenharmony_ci} 1362