18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * drivers/base/dd.c - The core device/driver interactions. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * This file contains the (sometimes tricky) code that controls the 68c2ecf20Sopenharmony_ci * interactions between devices and drivers, which primarily includes 78c2ecf20Sopenharmony_ci * driver binding and unbinding. 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * All of this code used to exist in drivers/base/bus.c, but was 108c2ecf20Sopenharmony_ci * relocated to here in the name of compartmentalization (since it wasn't 118c2ecf20Sopenharmony_ci * strictly code just for the 'struct bus_type'. 128c2ecf20Sopenharmony_ci * 138c2ecf20Sopenharmony_ci * Copyright (c) 2002-5 Patrick Mochel 148c2ecf20Sopenharmony_ci * Copyright (c) 2002-3 Open Source Development Labs 158c2ecf20Sopenharmony_ci * Copyright (c) 2007-2009 Greg Kroah-Hartman <gregkh@suse.de> 168c2ecf20Sopenharmony_ci * Copyright (c) 2007-2009 Novell Inc. 178c2ecf20Sopenharmony_ci */ 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#include <linux/debugfs.h> 208c2ecf20Sopenharmony_ci#include <linux/device.h> 218c2ecf20Sopenharmony_ci#include <linux/delay.h> 228c2ecf20Sopenharmony_ci#include <linux/dma-map-ops.h> 238c2ecf20Sopenharmony_ci#include <linux/init.h> 248c2ecf20Sopenharmony_ci#include <linux/module.h> 258c2ecf20Sopenharmony_ci#include <linux/kthread.h> 268c2ecf20Sopenharmony_ci#include <linux/wait.h> 278c2ecf20Sopenharmony_ci#include <linux/async.h> 288c2ecf20Sopenharmony_ci#include <linux/pm_runtime.h> 298c2ecf20Sopenharmony_ci#include <linux/pinctrl/devinfo.h> 308c2ecf20Sopenharmony_ci#include <linux/slab.h> 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci#include "base.h" 338c2ecf20Sopenharmony_ci#include "power/power.h" 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci/* 368c2ecf20Sopenharmony_ci * Deferred Probe infrastructure. 378c2ecf20Sopenharmony_ci * 388c2ecf20Sopenharmony_ci * Sometimes driver probe order matters, but the kernel doesn't always have 398c2ecf20Sopenharmony_ci * dependency information which means some drivers will get probed before a 408c2ecf20Sopenharmony_ci * resource it depends on is available. For example, an SDHCI driver may 418c2ecf20Sopenharmony_ci * first need a GPIO line from an i2c GPIO controller before it can be 428c2ecf20Sopenharmony_ci * initialized. If a required resource is not available yet, a driver can 438c2ecf20Sopenharmony_ci * request probing to be deferred by returning -EPROBE_DEFER from its probe hook 448c2ecf20Sopenharmony_ci * 458c2ecf20Sopenharmony_ci * Deferred probe maintains two lists of devices, a pending list and an active 468c2ecf20Sopenharmony_ci * list. A driver returning -EPROBE_DEFER causes the device to be added to the 478c2ecf20Sopenharmony_ci * pending list. A successful driver probe will trigger moving all devices 488c2ecf20Sopenharmony_ci * from the pending to the active list so that the workqueue will eventually 498c2ecf20Sopenharmony_ci * retry them. 508c2ecf20Sopenharmony_ci * 518c2ecf20Sopenharmony_ci * The deferred_probe_mutex must be held any time the deferred_probe_*_list 528c2ecf20Sopenharmony_ci * of the (struct device*)->p->deferred_probe pointers are manipulated 538c2ecf20Sopenharmony_ci */ 548c2ecf20Sopenharmony_cistatic DEFINE_MUTEX(deferred_probe_mutex); 558c2ecf20Sopenharmony_cistatic LIST_HEAD(deferred_probe_pending_list); 568c2ecf20Sopenharmony_cistatic LIST_HEAD(deferred_probe_active_list); 578c2ecf20Sopenharmony_cistatic atomic_t deferred_trigger_count = ATOMIC_INIT(0); 588c2ecf20Sopenharmony_cistatic struct dentry *deferred_devices; 598c2ecf20Sopenharmony_cistatic bool initcalls_done; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci/* Save the async probe drivers' name from kernel cmdline */ 628c2ecf20Sopenharmony_ci#define ASYNC_DRV_NAMES_MAX_LEN 256 638c2ecf20Sopenharmony_cistatic char async_probe_drv_names[ASYNC_DRV_NAMES_MAX_LEN]; 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci/* 668c2ecf20Sopenharmony_ci * In some cases, like suspend to RAM or hibernation, It might be reasonable 678c2ecf20Sopenharmony_ci * to prohibit probing of devices as it could be unsafe. 688c2ecf20Sopenharmony_ci * Once defer_all_probes is true all drivers probes will be forcibly deferred. 698c2ecf20Sopenharmony_ci */ 708c2ecf20Sopenharmony_cistatic bool defer_all_probes; 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci/* 738c2ecf20Sopenharmony_ci * deferred_probe_work_func() - Retry probing devices in the active list. 748c2ecf20Sopenharmony_ci */ 758c2ecf20Sopenharmony_cistatic void deferred_probe_work_func(struct work_struct *work) 768c2ecf20Sopenharmony_ci{ 778c2ecf20Sopenharmony_ci struct device *dev; 788c2ecf20Sopenharmony_ci struct device_private *private; 798c2ecf20Sopenharmony_ci /* 808c2ecf20Sopenharmony_ci * This block processes every device in the deferred 'active' list. 818c2ecf20Sopenharmony_ci * Each device is removed from the active list and passed to 828c2ecf20Sopenharmony_ci * bus_probe_device() to re-attempt the probe. The loop continues 838c2ecf20Sopenharmony_ci * until every device in the active list is removed and retried. 848c2ecf20Sopenharmony_ci * 858c2ecf20Sopenharmony_ci * Note: Once the device is removed from the list and the mutex is 868c2ecf20Sopenharmony_ci * released, it is possible for the device get freed by another thread 878c2ecf20Sopenharmony_ci * and cause a illegal pointer dereference. This code uses 888c2ecf20Sopenharmony_ci * get/put_device() to ensure the device structure cannot disappear 898c2ecf20Sopenharmony_ci * from under our feet. 908c2ecf20Sopenharmony_ci */ 918c2ecf20Sopenharmony_ci mutex_lock(&deferred_probe_mutex); 928c2ecf20Sopenharmony_ci while (!list_empty(&deferred_probe_active_list)) { 938c2ecf20Sopenharmony_ci private = list_first_entry(&deferred_probe_active_list, 948c2ecf20Sopenharmony_ci typeof(*dev->p), deferred_probe); 958c2ecf20Sopenharmony_ci dev = private->device; 968c2ecf20Sopenharmony_ci list_del_init(&private->deferred_probe); 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci get_device(dev); 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci kfree(dev->p->deferred_probe_reason); 1018c2ecf20Sopenharmony_ci dev->p->deferred_probe_reason = NULL; 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci /* 1048c2ecf20Sopenharmony_ci * Drop the mutex while probing each device; the probe path may 1058c2ecf20Sopenharmony_ci * manipulate the deferred list 1068c2ecf20Sopenharmony_ci */ 1078c2ecf20Sopenharmony_ci mutex_unlock(&deferred_probe_mutex); 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci /* 1108c2ecf20Sopenharmony_ci * Force the device to the end of the dpm_list since 1118c2ecf20Sopenharmony_ci * the PM code assumes that the order we add things to 1128c2ecf20Sopenharmony_ci * the list is a good order for suspend but deferred 1138c2ecf20Sopenharmony_ci * probe makes that very unsafe. 1148c2ecf20Sopenharmony_ci */ 1158c2ecf20Sopenharmony_ci device_pm_move_to_tail(dev); 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_ci dev_dbg(dev, "Retrying from deferred list\n"); 1188c2ecf20Sopenharmony_ci bus_probe_device(dev); 1198c2ecf20Sopenharmony_ci mutex_lock(&deferred_probe_mutex); 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci put_device(dev); 1228c2ecf20Sopenharmony_ci } 1238c2ecf20Sopenharmony_ci mutex_unlock(&deferred_probe_mutex); 1248c2ecf20Sopenharmony_ci} 1258c2ecf20Sopenharmony_cistatic DECLARE_WORK(deferred_probe_work, deferred_probe_work_func); 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_civoid driver_deferred_probe_add(struct device *dev) 1288c2ecf20Sopenharmony_ci{ 1298c2ecf20Sopenharmony_ci mutex_lock(&deferred_probe_mutex); 1308c2ecf20Sopenharmony_ci if (list_empty(&dev->p->deferred_probe)) { 1318c2ecf20Sopenharmony_ci dev_dbg(dev, "Added to deferred list\n"); 1328c2ecf20Sopenharmony_ci list_add_tail(&dev->p->deferred_probe, &deferred_probe_pending_list); 1338c2ecf20Sopenharmony_ci } 1348c2ecf20Sopenharmony_ci mutex_unlock(&deferred_probe_mutex); 1358c2ecf20Sopenharmony_ci} 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_civoid driver_deferred_probe_del(struct device *dev) 1388c2ecf20Sopenharmony_ci{ 1398c2ecf20Sopenharmony_ci mutex_lock(&deferred_probe_mutex); 1408c2ecf20Sopenharmony_ci if (!list_empty(&dev->p->deferred_probe)) { 1418c2ecf20Sopenharmony_ci dev_dbg(dev, "Removed from deferred list\n"); 1428c2ecf20Sopenharmony_ci list_del_init(&dev->p->deferred_probe); 1438c2ecf20Sopenharmony_ci kfree(dev->p->deferred_probe_reason); 1448c2ecf20Sopenharmony_ci dev->p->deferred_probe_reason = NULL; 1458c2ecf20Sopenharmony_ci } 1468c2ecf20Sopenharmony_ci mutex_unlock(&deferred_probe_mutex); 1478c2ecf20Sopenharmony_ci} 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_cistatic bool driver_deferred_probe_enable = false; 1508c2ecf20Sopenharmony_ci/** 1518c2ecf20Sopenharmony_ci * driver_deferred_probe_trigger() - Kick off re-probing deferred devices 1528c2ecf20Sopenharmony_ci * 1538c2ecf20Sopenharmony_ci * This functions moves all devices from the pending list to the active 1548c2ecf20Sopenharmony_ci * list and schedules the deferred probe workqueue to process them. It 1558c2ecf20Sopenharmony_ci * should be called anytime a driver is successfully bound to a device. 1568c2ecf20Sopenharmony_ci * 1578c2ecf20Sopenharmony_ci * Note, there is a race condition in multi-threaded probe. In the case where 1588c2ecf20Sopenharmony_ci * more than one device is probing at the same time, it is possible for one 1598c2ecf20Sopenharmony_ci * probe to complete successfully while another is about to defer. If the second 1608c2ecf20Sopenharmony_ci * depends on the first, then it will get put on the pending list after the 1618c2ecf20Sopenharmony_ci * trigger event has already occurred and will be stuck there. 1628c2ecf20Sopenharmony_ci * 1638c2ecf20Sopenharmony_ci * The atomic 'deferred_trigger_count' is used to determine if a successful 1648c2ecf20Sopenharmony_ci * trigger has occurred in the midst of probing a driver. If the trigger count 1658c2ecf20Sopenharmony_ci * changes in the midst of a probe, then deferred processing should be triggered 1668c2ecf20Sopenharmony_ci * again. 1678c2ecf20Sopenharmony_ci */ 1688c2ecf20Sopenharmony_cistatic void driver_deferred_probe_trigger(void) 1698c2ecf20Sopenharmony_ci{ 1708c2ecf20Sopenharmony_ci if (!driver_deferred_probe_enable) 1718c2ecf20Sopenharmony_ci return; 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_ci /* 1748c2ecf20Sopenharmony_ci * A successful probe means that all the devices in the pending list 1758c2ecf20Sopenharmony_ci * should be triggered to be reprobed. Move all the deferred devices 1768c2ecf20Sopenharmony_ci * into the active list so they can be retried by the workqueue 1778c2ecf20Sopenharmony_ci */ 1788c2ecf20Sopenharmony_ci mutex_lock(&deferred_probe_mutex); 1798c2ecf20Sopenharmony_ci atomic_inc(&deferred_trigger_count); 1808c2ecf20Sopenharmony_ci list_splice_tail_init(&deferred_probe_pending_list, 1818c2ecf20Sopenharmony_ci &deferred_probe_active_list); 1828c2ecf20Sopenharmony_ci mutex_unlock(&deferred_probe_mutex); 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_ci /* 1858c2ecf20Sopenharmony_ci * Kick the re-probe thread. It may already be scheduled, but it is 1868c2ecf20Sopenharmony_ci * safe to kick it again. 1878c2ecf20Sopenharmony_ci */ 1888c2ecf20Sopenharmony_ci schedule_work(&deferred_probe_work); 1898c2ecf20Sopenharmony_ci} 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ci/** 1928c2ecf20Sopenharmony_ci * device_block_probing() - Block/defer device's probes 1938c2ecf20Sopenharmony_ci * 1948c2ecf20Sopenharmony_ci * It will disable probing of devices and defer their probes instead. 1958c2ecf20Sopenharmony_ci */ 1968c2ecf20Sopenharmony_civoid device_block_probing(void) 1978c2ecf20Sopenharmony_ci{ 1988c2ecf20Sopenharmony_ci defer_all_probes = true; 1998c2ecf20Sopenharmony_ci /* sync with probes to avoid races. */ 2008c2ecf20Sopenharmony_ci wait_for_device_probe(); 2018c2ecf20Sopenharmony_ci} 2028c2ecf20Sopenharmony_ci 2038c2ecf20Sopenharmony_ci/** 2048c2ecf20Sopenharmony_ci * device_unblock_probing() - Unblock/enable device's probes 2058c2ecf20Sopenharmony_ci * 2068c2ecf20Sopenharmony_ci * It will restore normal behavior and trigger re-probing of deferred 2078c2ecf20Sopenharmony_ci * devices. 2088c2ecf20Sopenharmony_ci */ 2098c2ecf20Sopenharmony_civoid device_unblock_probing(void) 2108c2ecf20Sopenharmony_ci{ 2118c2ecf20Sopenharmony_ci defer_all_probes = false; 2128c2ecf20Sopenharmony_ci driver_deferred_probe_trigger(); 2138c2ecf20Sopenharmony_ci} 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci/** 2168c2ecf20Sopenharmony_ci * device_set_deferred_probe_reason() - Set defer probe reason message for device 2178c2ecf20Sopenharmony_ci * @dev: the pointer to the struct device 2188c2ecf20Sopenharmony_ci * @vaf: the pointer to va_format structure with message 2198c2ecf20Sopenharmony_ci */ 2208c2ecf20Sopenharmony_civoid device_set_deferred_probe_reason(const struct device *dev, struct va_format *vaf) 2218c2ecf20Sopenharmony_ci{ 2228c2ecf20Sopenharmony_ci const char *drv = dev_driver_string(dev); 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci mutex_lock(&deferred_probe_mutex); 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ci kfree(dev->p->deferred_probe_reason); 2278c2ecf20Sopenharmony_ci dev->p->deferred_probe_reason = kasprintf(GFP_KERNEL, "%s: %pV", drv, vaf); 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_ci mutex_unlock(&deferred_probe_mutex); 2308c2ecf20Sopenharmony_ci} 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_ci/* 2338c2ecf20Sopenharmony_ci * deferred_devs_show() - Show the devices in the deferred probe pending list. 2348c2ecf20Sopenharmony_ci */ 2358c2ecf20Sopenharmony_cistatic int deferred_devs_show(struct seq_file *s, void *data) 2368c2ecf20Sopenharmony_ci{ 2378c2ecf20Sopenharmony_ci struct device_private *curr; 2388c2ecf20Sopenharmony_ci 2398c2ecf20Sopenharmony_ci mutex_lock(&deferred_probe_mutex); 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_ci list_for_each_entry(curr, &deferred_probe_pending_list, deferred_probe) 2428c2ecf20Sopenharmony_ci seq_printf(s, "%s\t%s", dev_name(curr->device), 2438c2ecf20Sopenharmony_ci curr->device->p->deferred_probe_reason ?: "\n"); 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci mutex_unlock(&deferred_probe_mutex); 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ci return 0; 2488c2ecf20Sopenharmony_ci} 2498c2ecf20Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(deferred_devs); 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_ciint driver_deferred_probe_timeout; 2528c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(driver_deferred_probe_timeout); 2538c2ecf20Sopenharmony_ci 2548c2ecf20Sopenharmony_cistatic int __init deferred_probe_timeout_setup(char *str) 2558c2ecf20Sopenharmony_ci{ 2568c2ecf20Sopenharmony_ci int timeout; 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci if (!kstrtoint(str, 10, &timeout)) 2598c2ecf20Sopenharmony_ci driver_deferred_probe_timeout = timeout; 2608c2ecf20Sopenharmony_ci return 1; 2618c2ecf20Sopenharmony_ci} 2628c2ecf20Sopenharmony_ci__setup("deferred_probe_timeout=", deferred_probe_timeout_setup); 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_ci/** 2658c2ecf20Sopenharmony_ci * driver_deferred_probe_check_state() - Check deferred probe state 2668c2ecf20Sopenharmony_ci * @dev: device to check 2678c2ecf20Sopenharmony_ci * 2688c2ecf20Sopenharmony_ci * Return: 2698c2ecf20Sopenharmony_ci * -ENODEV if initcalls have completed and modules are disabled. 2708c2ecf20Sopenharmony_ci * -ETIMEDOUT if the deferred probe timeout was set and has expired 2718c2ecf20Sopenharmony_ci * and modules are enabled. 2728c2ecf20Sopenharmony_ci * -EPROBE_DEFER in other cases. 2738c2ecf20Sopenharmony_ci * 2748c2ecf20Sopenharmony_ci * Drivers or subsystems can opt-in to calling this function instead of directly 2758c2ecf20Sopenharmony_ci * returning -EPROBE_DEFER. 2768c2ecf20Sopenharmony_ci */ 2778c2ecf20Sopenharmony_ciint driver_deferred_probe_check_state(struct device *dev) 2788c2ecf20Sopenharmony_ci{ 2798c2ecf20Sopenharmony_ci if (!IS_ENABLED(CONFIG_MODULES) && initcalls_done) { 2808c2ecf20Sopenharmony_ci dev_warn(dev, "ignoring dependency for device, assuming no driver\n"); 2818c2ecf20Sopenharmony_ci return -ENODEV; 2828c2ecf20Sopenharmony_ci } 2838c2ecf20Sopenharmony_ci 2848c2ecf20Sopenharmony_ci if (!driver_deferred_probe_timeout && initcalls_done) { 2858c2ecf20Sopenharmony_ci dev_warn(dev, "deferred probe timeout, ignoring dependency\n"); 2868c2ecf20Sopenharmony_ci return -ETIMEDOUT; 2878c2ecf20Sopenharmony_ci } 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_ci return -EPROBE_DEFER; 2908c2ecf20Sopenharmony_ci} 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_cistatic void deferred_probe_timeout_work_func(struct work_struct *work) 2938c2ecf20Sopenharmony_ci{ 2948c2ecf20Sopenharmony_ci struct device_private *p; 2958c2ecf20Sopenharmony_ci 2968c2ecf20Sopenharmony_ci driver_deferred_probe_timeout = 0; 2978c2ecf20Sopenharmony_ci driver_deferred_probe_trigger(); 2988c2ecf20Sopenharmony_ci flush_work(&deferred_probe_work); 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_ci mutex_lock(&deferred_probe_mutex); 3018c2ecf20Sopenharmony_ci list_for_each_entry(p, &deferred_probe_pending_list, deferred_probe) 3028c2ecf20Sopenharmony_ci dev_info(p->device, "deferred probe pending\n"); 3038c2ecf20Sopenharmony_ci mutex_unlock(&deferred_probe_mutex); 3048c2ecf20Sopenharmony_ci} 3058c2ecf20Sopenharmony_cistatic DECLARE_DELAYED_WORK(deferred_probe_timeout_work, deferred_probe_timeout_work_func); 3068c2ecf20Sopenharmony_ci 3078c2ecf20Sopenharmony_ci/** 3088c2ecf20Sopenharmony_ci * deferred_probe_initcall() - Enable probing of deferred devices 3098c2ecf20Sopenharmony_ci * 3108c2ecf20Sopenharmony_ci * We don't want to get in the way when the bulk of drivers are getting probed. 3118c2ecf20Sopenharmony_ci * Instead, this initcall makes sure that deferred probing is delayed until 3128c2ecf20Sopenharmony_ci * late_initcall time. 3138c2ecf20Sopenharmony_ci */ 3148c2ecf20Sopenharmony_cistatic int deferred_probe_initcall(void) 3158c2ecf20Sopenharmony_ci{ 3168c2ecf20Sopenharmony_ci deferred_devices = debugfs_create_file("devices_deferred", 0444, NULL, 3178c2ecf20Sopenharmony_ci NULL, &deferred_devs_fops); 3188c2ecf20Sopenharmony_ci 3198c2ecf20Sopenharmony_ci driver_deferred_probe_enable = true; 3208c2ecf20Sopenharmony_ci driver_deferred_probe_trigger(); 3218c2ecf20Sopenharmony_ci /* Sort as many dependencies as possible before exiting initcalls */ 3228c2ecf20Sopenharmony_ci flush_work(&deferred_probe_work); 3238c2ecf20Sopenharmony_ci initcalls_done = true; 3248c2ecf20Sopenharmony_ci 3258c2ecf20Sopenharmony_ci /* 3268c2ecf20Sopenharmony_ci * Trigger deferred probe again, this time we won't defer anything 3278c2ecf20Sopenharmony_ci * that is optional 3288c2ecf20Sopenharmony_ci */ 3298c2ecf20Sopenharmony_ci driver_deferred_probe_trigger(); 3308c2ecf20Sopenharmony_ci flush_work(&deferred_probe_work); 3318c2ecf20Sopenharmony_ci 3328c2ecf20Sopenharmony_ci if (driver_deferred_probe_timeout > 0) { 3338c2ecf20Sopenharmony_ci schedule_delayed_work(&deferred_probe_timeout_work, 3348c2ecf20Sopenharmony_ci driver_deferred_probe_timeout * HZ); 3358c2ecf20Sopenharmony_ci } 3368c2ecf20Sopenharmony_ci return 0; 3378c2ecf20Sopenharmony_ci} 3388c2ecf20Sopenharmony_cilate_initcall(deferred_probe_initcall); 3398c2ecf20Sopenharmony_ci 3408c2ecf20Sopenharmony_cistatic void __exit deferred_probe_exit(void) 3418c2ecf20Sopenharmony_ci{ 3428c2ecf20Sopenharmony_ci debugfs_remove_recursive(deferred_devices); 3438c2ecf20Sopenharmony_ci} 3448c2ecf20Sopenharmony_ci__exitcall(deferred_probe_exit); 3458c2ecf20Sopenharmony_ci 3468c2ecf20Sopenharmony_ci/** 3478c2ecf20Sopenharmony_ci * device_is_bound() - Check if device is bound to a driver 3488c2ecf20Sopenharmony_ci * @dev: device to check 3498c2ecf20Sopenharmony_ci * 3508c2ecf20Sopenharmony_ci * Returns true if passed device has already finished probing successfully 3518c2ecf20Sopenharmony_ci * against a driver. 3528c2ecf20Sopenharmony_ci * 3538c2ecf20Sopenharmony_ci * This function must be called with the device lock held. 3548c2ecf20Sopenharmony_ci */ 3558c2ecf20Sopenharmony_cibool device_is_bound(struct device *dev) 3568c2ecf20Sopenharmony_ci{ 3578c2ecf20Sopenharmony_ci return dev->p && klist_node_attached(&dev->p->knode_driver); 3588c2ecf20Sopenharmony_ci} 3598c2ecf20Sopenharmony_ci 3608c2ecf20Sopenharmony_cistatic void driver_bound(struct device *dev) 3618c2ecf20Sopenharmony_ci{ 3628c2ecf20Sopenharmony_ci if (device_is_bound(dev)) { 3638c2ecf20Sopenharmony_ci pr_warn("%s: device %s already bound\n", 3648c2ecf20Sopenharmony_ci __func__, kobject_name(&dev->kobj)); 3658c2ecf20Sopenharmony_ci return; 3668c2ecf20Sopenharmony_ci } 3678c2ecf20Sopenharmony_ci 3688c2ecf20Sopenharmony_ci pr_debug("driver: '%s': %s: bound to device '%s'\n", dev->driver->name, 3698c2ecf20Sopenharmony_ci __func__, dev_name(dev)); 3708c2ecf20Sopenharmony_ci 3718c2ecf20Sopenharmony_ci klist_add_tail(&dev->p->knode_driver, &dev->driver->p->klist_devices); 3728c2ecf20Sopenharmony_ci device_links_driver_bound(dev); 3738c2ecf20Sopenharmony_ci 3748c2ecf20Sopenharmony_ci device_pm_check_callbacks(dev); 3758c2ecf20Sopenharmony_ci 3768c2ecf20Sopenharmony_ci /* 3778c2ecf20Sopenharmony_ci * Make sure the device is no longer in one of the deferred lists and 3788c2ecf20Sopenharmony_ci * kick off retrying all pending devices 3798c2ecf20Sopenharmony_ci */ 3808c2ecf20Sopenharmony_ci driver_deferred_probe_del(dev); 3818c2ecf20Sopenharmony_ci driver_deferred_probe_trigger(); 3828c2ecf20Sopenharmony_ci 3838c2ecf20Sopenharmony_ci if (dev->bus) 3848c2ecf20Sopenharmony_ci blocking_notifier_call_chain(&dev->bus->p->bus_notifier, 3858c2ecf20Sopenharmony_ci BUS_NOTIFY_BOUND_DRIVER, dev); 3868c2ecf20Sopenharmony_ci 3878c2ecf20Sopenharmony_ci kobject_uevent(&dev->kobj, KOBJ_BIND); 3888c2ecf20Sopenharmony_ci} 3898c2ecf20Sopenharmony_ci 3908c2ecf20Sopenharmony_cistatic ssize_t coredump_store(struct device *dev, struct device_attribute *attr, 3918c2ecf20Sopenharmony_ci const char *buf, size_t count) 3928c2ecf20Sopenharmony_ci{ 3938c2ecf20Sopenharmony_ci device_lock(dev); 3948c2ecf20Sopenharmony_ci dev->driver->coredump(dev); 3958c2ecf20Sopenharmony_ci device_unlock(dev); 3968c2ecf20Sopenharmony_ci 3978c2ecf20Sopenharmony_ci return count; 3988c2ecf20Sopenharmony_ci} 3998c2ecf20Sopenharmony_cistatic DEVICE_ATTR_WO(coredump); 4008c2ecf20Sopenharmony_ci 4018c2ecf20Sopenharmony_cistatic int driver_sysfs_add(struct device *dev) 4028c2ecf20Sopenharmony_ci{ 4038c2ecf20Sopenharmony_ci int ret; 4048c2ecf20Sopenharmony_ci 4058c2ecf20Sopenharmony_ci if (dev->bus) 4068c2ecf20Sopenharmony_ci blocking_notifier_call_chain(&dev->bus->p->bus_notifier, 4078c2ecf20Sopenharmony_ci BUS_NOTIFY_BIND_DRIVER, dev); 4088c2ecf20Sopenharmony_ci 4098c2ecf20Sopenharmony_ci ret = sysfs_create_link(&dev->driver->p->kobj, &dev->kobj, 4108c2ecf20Sopenharmony_ci kobject_name(&dev->kobj)); 4118c2ecf20Sopenharmony_ci if (ret) 4128c2ecf20Sopenharmony_ci goto fail; 4138c2ecf20Sopenharmony_ci 4148c2ecf20Sopenharmony_ci ret = sysfs_create_link(&dev->kobj, &dev->driver->p->kobj, 4158c2ecf20Sopenharmony_ci "driver"); 4168c2ecf20Sopenharmony_ci if (ret) 4178c2ecf20Sopenharmony_ci goto rm_dev; 4188c2ecf20Sopenharmony_ci 4198c2ecf20Sopenharmony_ci if (!IS_ENABLED(CONFIG_DEV_COREDUMP) || !dev->driver->coredump || 4208c2ecf20Sopenharmony_ci !device_create_file(dev, &dev_attr_coredump)) 4218c2ecf20Sopenharmony_ci return 0; 4228c2ecf20Sopenharmony_ci 4238c2ecf20Sopenharmony_ci sysfs_remove_link(&dev->kobj, "driver"); 4248c2ecf20Sopenharmony_ci 4258c2ecf20Sopenharmony_cirm_dev: 4268c2ecf20Sopenharmony_ci sysfs_remove_link(&dev->driver->p->kobj, 4278c2ecf20Sopenharmony_ci kobject_name(&dev->kobj)); 4288c2ecf20Sopenharmony_ci 4298c2ecf20Sopenharmony_cifail: 4308c2ecf20Sopenharmony_ci return ret; 4318c2ecf20Sopenharmony_ci} 4328c2ecf20Sopenharmony_ci 4338c2ecf20Sopenharmony_cistatic void driver_sysfs_remove(struct device *dev) 4348c2ecf20Sopenharmony_ci{ 4358c2ecf20Sopenharmony_ci struct device_driver *drv = dev->driver; 4368c2ecf20Sopenharmony_ci 4378c2ecf20Sopenharmony_ci if (drv) { 4388c2ecf20Sopenharmony_ci if (drv->coredump) 4398c2ecf20Sopenharmony_ci device_remove_file(dev, &dev_attr_coredump); 4408c2ecf20Sopenharmony_ci sysfs_remove_link(&drv->p->kobj, kobject_name(&dev->kobj)); 4418c2ecf20Sopenharmony_ci sysfs_remove_link(&dev->kobj, "driver"); 4428c2ecf20Sopenharmony_ci } 4438c2ecf20Sopenharmony_ci} 4448c2ecf20Sopenharmony_ci 4458c2ecf20Sopenharmony_ci/** 4468c2ecf20Sopenharmony_ci * device_bind_driver - bind a driver to one device. 4478c2ecf20Sopenharmony_ci * @dev: device. 4488c2ecf20Sopenharmony_ci * 4498c2ecf20Sopenharmony_ci * Allow manual attachment of a driver to a device. 4508c2ecf20Sopenharmony_ci * Caller must have already set @dev->driver. 4518c2ecf20Sopenharmony_ci * 4528c2ecf20Sopenharmony_ci * Note that this does not modify the bus reference count. 4538c2ecf20Sopenharmony_ci * Please verify that is accounted for before calling this. 4548c2ecf20Sopenharmony_ci * (It is ok to call with no other effort from a driver's probe() method.) 4558c2ecf20Sopenharmony_ci * 4568c2ecf20Sopenharmony_ci * This function must be called with the device lock held. 4578c2ecf20Sopenharmony_ci */ 4588c2ecf20Sopenharmony_ciint device_bind_driver(struct device *dev) 4598c2ecf20Sopenharmony_ci{ 4608c2ecf20Sopenharmony_ci int ret; 4618c2ecf20Sopenharmony_ci 4628c2ecf20Sopenharmony_ci ret = driver_sysfs_add(dev); 4638c2ecf20Sopenharmony_ci if (!ret) 4648c2ecf20Sopenharmony_ci driver_bound(dev); 4658c2ecf20Sopenharmony_ci else if (dev->bus) 4668c2ecf20Sopenharmony_ci blocking_notifier_call_chain(&dev->bus->p->bus_notifier, 4678c2ecf20Sopenharmony_ci BUS_NOTIFY_DRIVER_NOT_BOUND, dev); 4688c2ecf20Sopenharmony_ci return ret; 4698c2ecf20Sopenharmony_ci} 4708c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(device_bind_driver); 4718c2ecf20Sopenharmony_ci 4728c2ecf20Sopenharmony_cistatic atomic_t probe_count = ATOMIC_INIT(0); 4738c2ecf20Sopenharmony_cistatic DECLARE_WAIT_QUEUE_HEAD(probe_waitqueue); 4748c2ecf20Sopenharmony_ci 4758c2ecf20Sopenharmony_cistatic void driver_deferred_probe_add_trigger(struct device *dev, 4768c2ecf20Sopenharmony_ci int local_trigger_count) 4778c2ecf20Sopenharmony_ci{ 4788c2ecf20Sopenharmony_ci driver_deferred_probe_add(dev); 4798c2ecf20Sopenharmony_ci /* Did a trigger occur while probing? Need to re-trigger if yes */ 4808c2ecf20Sopenharmony_ci if (local_trigger_count != atomic_read(&deferred_trigger_count)) 4818c2ecf20Sopenharmony_ci driver_deferred_probe_trigger(); 4828c2ecf20Sopenharmony_ci} 4838c2ecf20Sopenharmony_ci 4848c2ecf20Sopenharmony_cistatic ssize_t state_synced_show(struct device *dev, 4858c2ecf20Sopenharmony_ci struct device_attribute *attr, char *buf) 4868c2ecf20Sopenharmony_ci{ 4878c2ecf20Sopenharmony_ci bool val; 4888c2ecf20Sopenharmony_ci 4898c2ecf20Sopenharmony_ci device_lock(dev); 4908c2ecf20Sopenharmony_ci val = dev->state_synced; 4918c2ecf20Sopenharmony_ci device_unlock(dev); 4928c2ecf20Sopenharmony_ci 4938c2ecf20Sopenharmony_ci return sysfs_emit(buf, "%u\n", val); 4948c2ecf20Sopenharmony_ci} 4958c2ecf20Sopenharmony_cistatic DEVICE_ATTR_RO(state_synced); 4968c2ecf20Sopenharmony_ci 4978c2ecf20Sopenharmony_cistatic int really_probe(struct device *dev, struct device_driver *drv) 4988c2ecf20Sopenharmony_ci{ 4998c2ecf20Sopenharmony_ci int ret = -EPROBE_DEFER; 5008c2ecf20Sopenharmony_ci int local_trigger_count = atomic_read(&deferred_trigger_count); 5018c2ecf20Sopenharmony_ci bool test_remove = IS_ENABLED(CONFIG_DEBUG_TEST_DRIVER_REMOVE) && 5028c2ecf20Sopenharmony_ci !drv->suppress_bind_attrs; 5038c2ecf20Sopenharmony_ci 5048c2ecf20Sopenharmony_ci if (defer_all_probes) { 5058c2ecf20Sopenharmony_ci /* 5068c2ecf20Sopenharmony_ci * Value of defer_all_probes can be set only by 5078c2ecf20Sopenharmony_ci * device_block_probing() which, in turn, will call 5088c2ecf20Sopenharmony_ci * wait_for_device_probe() right after that to avoid any races. 5098c2ecf20Sopenharmony_ci */ 5108c2ecf20Sopenharmony_ci dev_dbg(dev, "Driver %s force probe deferral\n", drv->name); 5118c2ecf20Sopenharmony_ci driver_deferred_probe_add(dev); 5128c2ecf20Sopenharmony_ci return ret; 5138c2ecf20Sopenharmony_ci } 5148c2ecf20Sopenharmony_ci 5158c2ecf20Sopenharmony_ci ret = device_links_check_suppliers(dev); 5168c2ecf20Sopenharmony_ci if (ret == -EPROBE_DEFER) 5178c2ecf20Sopenharmony_ci driver_deferred_probe_add_trigger(dev, local_trigger_count); 5188c2ecf20Sopenharmony_ci if (ret) 5198c2ecf20Sopenharmony_ci return ret; 5208c2ecf20Sopenharmony_ci 5218c2ecf20Sopenharmony_ci atomic_inc(&probe_count); 5228c2ecf20Sopenharmony_ci pr_debug("bus: '%s': %s: probing driver %s with device %s\n", 5238c2ecf20Sopenharmony_ci drv->bus->name, __func__, drv->name, dev_name(dev)); 5248c2ecf20Sopenharmony_ci if (!list_empty(&dev->devres_head)) { 5258c2ecf20Sopenharmony_ci dev_crit(dev, "Resources present before probing\n"); 5268c2ecf20Sopenharmony_ci ret = -EBUSY; 5278c2ecf20Sopenharmony_ci goto done; 5288c2ecf20Sopenharmony_ci } 5298c2ecf20Sopenharmony_ci 5308c2ecf20Sopenharmony_cire_probe: 5318c2ecf20Sopenharmony_ci dev->driver = drv; 5328c2ecf20Sopenharmony_ci 5338c2ecf20Sopenharmony_ci /* If using pinctrl, bind pins now before probing */ 5348c2ecf20Sopenharmony_ci ret = pinctrl_bind_pins(dev); 5358c2ecf20Sopenharmony_ci if (ret) 5368c2ecf20Sopenharmony_ci goto pinctrl_bind_failed; 5378c2ecf20Sopenharmony_ci 5388c2ecf20Sopenharmony_ci if (dev->bus->dma_configure) { 5398c2ecf20Sopenharmony_ci ret = dev->bus->dma_configure(dev); 5408c2ecf20Sopenharmony_ci if (ret) 5418c2ecf20Sopenharmony_ci goto probe_failed; 5428c2ecf20Sopenharmony_ci } 5438c2ecf20Sopenharmony_ci 5448c2ecf20Sopenharmony_ci ret = driver_sysfs_add(dev); 5458c2ecf20Sopenharmony_ci if (ret) { 5468c2ecf20Sopenharmony_ci pr_err("%s: driver_sysfs_add(%s) failed\n", 5478c2ecf20Sopenharmony_ci __func__, dev_name(dev)); 5488c2ecf20Sopenharmony_ci goto probe_failed; 5498c2ecf20Sopenharmony_ci } 5508c2ecf20Sopenharmony_ci 5518c2ecf20Sopenharmony_ci if (dev->pm_domain && dev->pm_domain->activate) { 5528c2ecf20Sopenharmony_ci ret = dev->pm_domain->activate(dev); 5538c2ecf20Sopenharmony_ci if (ret) 5548c2ecf20Sopenharmony_ci goto probe_failed; 5558c2ecf20Sopenharmony_ci } 5568c2ecf20Sopenharmony_ci 5578c2ecf20Sopenharmony_ci if (dev->bus->probe) { 5588c2ecf20Sopenharmony_ci ret = dev->bus->probe(dev); 5598c2ecf20Sopenharmony_ci if (ret) 5608c2ecf20Sopenharmony_ci goto probe_failed; 5618c2ecf20Sopenharmony_ci } else if (drv->probe) { 5628c2ecf20Sopenharmony_ci ret = drv->probe(dev); 5638c2ecf20Sopenharmony_ci if (ret) 5648c2ecf20Sopenharmony_ci goto probe_failed; 5658c2ecf20Sopenharmony_ci } 5668c2ecf20Sopenharmony_ci 5678c2ecf20Sopenharmony_ci ret = device_add_groups(dev, drv->dev_groups); 5688c2ecf20Sopenharmony_ci if (ret) { 5698c2ecf20Sopenharmony_ci dev_err(dev, "device_add_groups() failed\n"); 5708c2ecf20Sopenharmony_ci goto dev_groups_failed; 5718c2ecf20Sopenharmony_ci } 5728c2ecf20Sopenharmony_ci 5738c2ecf20Sopenharmony_ci if (dev_has_sync_state(dev)) { 5748c2ecf20Sopenharmony_ci ret = device_create_file(dev, &dev_attr_state_synced); 5758c2ecf20Sopenharmony_ci if (ret) { 5768c2ecf20Sopenharmony_ci dev_err(dev, "state_synced sysfs add failed\n"); 5778c2ecf20Sopenharmony_ci goto dev_sysfs_state_synced_failed; 5788c2ecf20Sopenharmony_ci } 5798c2ecf20Sopenharmony_ci } 5808c2ecf20Sopenharmony_ci 5818c2ecf20Sopenharmony_ci if (test_remove) { 5828c2ecf20Sopenharmony_ci test_remove = false; 5838c2ecf20Sopenharmony_ci 5848c2ecf20Sopenharmony_ci device_remove_file(dev, &dev_attr_state_synced); 5858c2ecf20Sopenharmony_ci device_remove_groups(dev, drv->dev_groups); 5868c2ecf20Sopenharmony_ci 5878c2ecf20Sopenharmony_ci if (dev->bus->remove) 5888c2ecf20Sopenharmony_ci dev->bus->remove(dev); 5898c2ecf20Sopenharmony_ci else if (drv->remove) 5908c2ecf20Sopenharmony_ci drv->remove(dev); 5918c2ecf20Sopenharmony_ci 5928c2ecf20Sopenharmony_ci devres_release_all(dev); 5938c2ecf20Sopenharmony_ci arch_teardown_dma_ops(dev); 5948c2ecf20Sopenharmony_ci kfree(dev->dma_range_map); 5958c2ecf20Sopenharmony_ci dev->dma_range_map = NULL; 5968c2ecf20Sopenharmony_ci driver_sysfs_remove(dev); 5978c2ecf20Sopenharmony_ci dev->driver = NULL; 5988c2ecf20Sopenharmony_ci dev_set_drvdata(dev, NULL); 5998c2ecf20Sopenharmony_ci if (dev->pm_domain && dev->pm_domain->dismiss) 6008c2ecf20Sopenharmony_ci dev->pm_domain->dismiss(dev); 6018c2ecf20Sopenharmony_ci pm_runtime_reinit(dev); 6028c2ecf20Sopenharmony_ci 6038c2ecf20Sopenharmony_ci goto re_probe; 6048c2ecf20Sopenharmony_ci } 6058c2ecf20Sopenharmony_ci 6068c2ecf20Sopenharmony_ci pinctrl_init_done(dev); 6078c2ecf20Sopenharmony_ci 6088c2ecf20Sopenharmony_ci if (dev->pm_domain && dev->pm_domain->sync) 6098c2ecf20Sopenharmony_ci dev->pm_domain->sync(dev); 6108c2ecf20Sopenharmony_ci 6118c2ecf20Sopenharmony_ci driver_bound(dev); 6128c2ecf20Sopenharmony_ci ret = 1; 6138c2ecf20Sopenharmony_ci pr_debug("bus: '%s': %s: bound device %s to driver %s\n", 6148c2ecf20Sopenharmony_ci drv->bus->name, __func__, dev_name(dev), drv->name); 6158c2ecf20Sopenharmony_ci goto done; 6168c2ecf20Sopenharmony_ci 6178c2ecf20Sopenharmony_cidev_sysfs_state_synced_failed: 6188c2ecf20Sopenharmony_ci device_remove_groups(dev, drv->dev_groups); 6198c2ecf20Sopenharmony_cidev_groups_failed: 6208c2ecf20Sopenharmony_ci if (dev->bus->remove) 6218c2ecf20Sopenharmony_ci dev->bus->remove(dev); 6228c2ecf20Sopenharmony_ci else if (drv->remove) 6238c2ecf20Sopenharmony_ci drv->remove(dev); 6248c2ecf20Sopenharmony_ciprobe_failed: 6258c2ecf20Sopenharmony_ci if (dev->bus) 6268c2ecf20Sopenharmony_ci blocking_notifier_call_chain(&dev->bus->p->bus_notifier, 6278c2ecf20Sopenharmony_ci BUS_NOTIFY_DRIVER_NOT_BOUND, dev); 6288c2ecf20Sopenharmony_cipinctrl_bind_failed: 6298c2ecf20Sopenharmony_ci device_links_no_driver(dev); 6308c2ecf20Sopenharmony_ci devres_release_all(dev); 6318c2ecf20Sopenharmony_ci arch_teardown_dma_ops(dev); 6328c2ecf20Sopenharmony_ci kfree(dev->dma_range_map); 6338c2ecf20Sopenharmony_ci dev->dma_range_map = NULL; 6348c2ecf20Sopenharmony_ci driver_sysfs_remove(dev); 6358c2ecf20Sopenharmony_ci dev->driver = NULL; 6368c2ecf20Sopenharmony_ci dev_set_drvdata(dev, NULL); 6378c2ecf20Sopenharmony_ci if (dev->pm_domain && dev->pm_domain->dismiss) 6388c2ecf20Sopenharmony_ci dev->pm_domain->dismiss(dev); 6398c2ecf20Sopenharmony_ci pm_runtime_reinit(dev); 6408c2ecf20Sopenharmony_ci dev_pm_set_driver_flags(dev, 0); 6418c2ecf20Sopenharmony_ci 6428c2ecf20Sopenharmony_ci switch (ret) { 6438c2ecf20Sopenharmony_ci case -EPROBE_DEFER: 6448c2ecf20Sopenharmony_ci /* Driver requested deferred probing */ 6458c2ecf20Sopenharmony_ci dev_dbg(dev, "Driver %s requests probe deferral\n", drv->name); 6468c2ecf20Sopenharmony_ci driver_deferred_probe_add_trigger(dev, local_trigger_count); 6478c2ecf20Sopenharmony_ci break; 6488c2ecf20Sopenharmony_ci case -ENODEV: 6498c2ecf20Sopenharmony_ci case -ENXIO: 6508c2ecf20Sopenharmony_ci pr_debug("%s: probe of %s rejects match %d\n", 6518c2ecf20Sopenharmony_ci drv->name, dev_name(dev), ret); 6528c2ecf20Sopenharmony_ci break; 6538c2ecf20Sopenharmony_ci default: 6548c2ecf20Sopenharmony_ci /* driver matched but the probe failed */ 6558c2ecf20Sopenharmony_ci pr_warn("%s: probe of %s failed with error %d\n", 6568c2ecf20Sopenharmony_ci drv->name, dev_name(dev), ret); 6578c2ecf20Sopenharmony_ci } 6588c2ecf20Sopenharmony_ci /* 6598c2ecf20Sopenharmony_ci * Ignore errors returned by ->probe so that the next driver can try 6608c2ecf20Sopenharmony_ci * its luck. 6618c2ecf20Sopenharmony_ci */ 6628c2ecf20Sopenharmony_ci ret = 0; 6638c2ecf20Sopenharmony_cidone: 6648c2ecf20Sopenharmony_ci atomic_dec(&probe_count); 6658c2ecf20Sopenharmony_ci wake_up_all(&probe_waitqueue); 6668c2ecf20Sopenharmony_ci return ret; 6678c2ecf20Sopenharmony_ci} 6688c2ecf20Sopenharmony_ci 6698c2ecf20Sopenharmony_ci/* 6708c2ecf20Sopenharmony_ci * For initcall_debug, show the driver probe time. 6718c2ecf20Sopenharmony_ci */ 6728c2ecf20Sopenharmony_cistatic int really_probe_debug(struct device *dev, struct device_driver *drv) 6738c2ecf20Sopenharmony_ci{ 6748c2ecf20Sopenharmony_ci ktime_t calltime, rettime; 6758c2ecf20Sopenharmony_ci int ret; 6768c2ecf20Sopenharmony_ci 6778c2ecf20Sopenharmony_ci calltime = ktime_get(); 6788c2ecf20Sopenharmony_ci ret = really_probe(dev, drv); 6798c2ecf20Sopenharmony_ci rettime = ktime_get(); 6808c2ecf20Sopenharmony_ci /* 6818c2ecf20Sopenharmony_ci * Don't change this to pr_debug() because that requires 6828c2ecf20Sopenharmony_ci * CONFIG_DYNAMIC_DEBUG and we want a simple 'initcall_debug' on the 6838c2ecf20Sopenharmony_ci * kernel commandline to print this all the time at the debug level. 6848c2ecf20Sopenharmony_ci */ 6858c2ecf20Sopenharmony_ci printk(KERN_DEBUG "probe of %s returned %d after %lld usecs\n", 6868c2ecf20Sopenharmony_ci dev_name(dev), ret, ktime_us_delta(rettime, calltime)); 6878c2ecf20Sopenharmony_ci return ret; 6888c2ecf20Sopenharmony_ci} 6898c2ecf20Sopenharmony_ci 6908c2ecf20Sopenharmony_ci/** 6918c2ecf20Sopenharmony_ci * driver_probe_done 6928c2ecf20Sopenharmony_ci * Determine if the probe sequence is finished or not. 6938c2ecf20Sopenharmony_ci * 6948c2ecf20Sopenharmony_ci * Should somehow figure out how to use a semaphore, not an atomic variable... 6958c2ecf20Sopenharmony_ci */ 6968c2ecf20Sopenharmony_ciint driver_probe_done(void) 6978c2ecf20Sopenharmony_ci{ 6988c2ecf20Sopenharmony_ci int local_probe_count = atomic_read(&probe_count); 6998c2ecf20Sopenharmony_ci 7008c2ecf20Sopenharmony_ci pr_debug("%s: probe_count = %d\n", __func__, local_probe_count); 7018c2ecf20Sopenharmony_ci if (local_probe_count) 7028c2ecf20Sopenharmony_ci return -EBUSY; 7038c2ecf20Sopenharmony_ci return 0; 7048c2ecf20Sopenharmony_ci} 7058c2ecf20Sopenharmony_ci 7068c2ecf20Sopenharmony_ci/** 7078c2ecf20Sopenharmony_ci * wait_for_device_probe 7088c2ecf20Sopenharmony_ci * Wait for device probing to be completed. 7098c2ecf20Sopenharmony_ci */ 7108c2ecf20Sopenharmony_civoid wait_for_device_probe(void) 7118c2ecf20Sopenharmony_ci{ 7128c2ecf20Sopenharmony_ci /* wait for the deferred probe workqueue to finish */ 7138c2ecf20Sopenharmony_ci flush_work(&deferred_probe_work); 7148c2ecf20Sopenharmony_ci 7158c2ecf20Sopenharmony_ci /* wait for the known devices to complete their probing */ 7168c2ecf20Sopenharmony_ci wait_event(probe_waitqueue, atomic_read(&probe_count) == 0); 7178c2ecf20Sopenharmony_ci async_synchronize_full(); 7188c2ecf20Sopenharmony_ci} 7198c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(wait_for_device_probe); 7208c2ecf20Sopenharmony_ci 7218c2ecf20Sopenharmony_ci/** 7228c2ecf20Sopenharmony_ci * driver_probe_device - attempt to bind device & driver together 7238c2ecf20Sopenharmony_ci * @drv: driver to bind a device to 7248c2ecf20Sopenharmony_ci * @dev: device to try to bind to the driver 7258c2ecf20Sopenharmony_ci * 7268c2ecf20Sopenharmony_ci * This function returns -ENODEV if the device is not registered, 7278c2ecf20Sopenharmony_ci * 1 if the device is bound successfully and 0 otherwise. 7288c2ecf20Sopenharmony_ci * 7298c2ecf20Sopenharmony_ci * This function must be called with @dev lock held. When called for a 7308c2ecf20Sopenharmony_ci * USB interface, @dev->parent lock must be held as well. 7318c2ecf20Sopenharmony_ci * 7328c2ecf20Sopenharmony_ci * If the device has a parent, runtime-resume the parent before driver probing. 7338c2ecf20Sopenharmony_ci */ 7348c2ecf20Sopenharmony_ciint driver_probe_device(struct device_driver *drv, struct device *dev) 7358c2ecf20Sopenharmony_ci{ 7368c2ecf20Sopenharmony_ci int ret = 0; 7378c2ecf20Sopenharmony_ci 7388c2ecf20Sopenharmony_ci if (!device_is_registered(dev)) 7398c2ecf20Sopenharmony_ci return -ENODEV; 7408c2ecf20Sopenharmony_ci 7418c2ecf20Sopenharmony_ci pr_debug("bus: '%s': %s: matched device %s with driver %s\n", 7428c2ecf20Sopenharmony_ci drv->bus->name, __func__, dev_name(dev), drv->name); 7438c2ecf20Sopenharmony_ci 7448c2ecf20Sopenharmony_ci pm_runtime_get_suppliers(dev); 7458c2ecf20Sopenharmony_ci if (dev->parent) 7468c2ecf20Sopenharmony_ci pm_runtime_get_sync(dev->parent); 7478c2ecf20Sopenharmony_ci 7488c2ecf20Sopenharmony_ci pm_runtime_barrier(dev); 7498c2ecf20Sopenharmony_ci if (initcall_debug) 7508c2ecf20Sopenharmony_ci ret = really_probe_debug(dev, drv); 7518c2ecf20Sopenharmony_ci else 7528c2ecf20Sopenharmony_ci ret = really_probe(dev, drv); 7538c2ecf20Sopenharmony_ci pm_request_idle(dev); 7548c2ecf20Sopenharmony_ci 7558c2ecf20Sopenharmony_ci if (dev->parent) 7568c2ecf20Sopenharmony_ci pm_runtime_put(dev->parent); 7578c2ecf20Sopenharmony_ci 7588c2ecf20Sopenharmony_ci pm_runtime_put_suppliers(dev); 7598c2ecf20Sopenharmony_ci return ret; 7608c2ecf20Sopenharmony_ci} 7618c2ecf20Sopenharmony_ci 7628c2ecf20Sopenharmony_cistatic inline bool cmdline_requested_async_probing(const char *drv_name) 7638c2ecf20Sopenharmony_ci{ 7648c2ecf20Sopenharmony_ci return parse_option_str(async_probe_drv_names, drv_name); 7658c2ecf20Sopenharmony_ci} 7668c2ecf20Sopenharmony_ci 7678c2ecf20Sopenharmony_ci/* The option format is "driver_async_probe=drv_name1,drv_name2,..." */ 7688c2ecf20Sopenharmony_cistatic int __init save_async_options(char *buf) 7698c2ecf20Sopenharmony_ci{ 7708c2ecf20Sopenharmony_ci if (strlen(buf) >= ASYNC_DRV_NAMES_MAX_LEN) 7718c2ecf20Sopenharmony_ci pr_warn("Too long list of driver names for 'driver_async_probe'!\n"); 7728c2ecf20Sopenharmony_ci 7738c2ecf20Sopenharmony_ci strlcpy(async_probe_drv_names, buf, ASYNC_DRV_NAMES_MAX_LEN); 7748c2ecf20Sopenharmony_ci return 1; 7758c2ecf20Sopenharmony_ci} 7768c2ecf20Sopenharmony_ci__setup("driver_async_probe=", save_async_options); 7778c2ecf20Sopenharmony_ci 7788c2ecf20Sopenharmony_cibool driver_allows_async_probing(struct device_driver *drv) 7798c2ecf20Sopenharmony_ci{ 7808c2ecf20Sopenharmony_ci switch (drv->probe_type) { 7818c2ecf20Sopenharmony_ci case PROBE_PREFER_ASYNCHRONOUS: 7828c2ecf20Sopenharmony_ci return true; 7838c2ecf20Sopenharmony_ci 7848c2ecf20Sopenharmony_ci case PROBE_FORCE_SYNCHRONOUS: 7858c2ecf20Sopenharmony_ci return false; 7868c2ecf20Sopenharmony_ci 7878c2ecf20Sopenharmony_ci default: 7888c2ecf20Sopenharmony_ci if (cmdline_requested_async_probing(drv->name)) 7898c2ecf20Sopenharmony_ci return true; 7908c2ecf20Sopenharmony_ci 7918c2ecf20Sopenharmony_ci if (module_requested_async_probing(drv->owner)) 7928c2ecf20Sopenharmony_ci return true; 7938c2ecf20Sopenharmony_ci 7948c2ecf20Sopenharmony_ci return false; 7958c2ecf20Sopenharmony_ci } 7968c2ecf20Sopenharmony_ci} 7978c2ecf20Sopenharmony_ci 7988c2ecf20Sopenharmony_cistruct device_attach_data { 7998c2ecf20Sopenharmony_ci struct device *dev; 8008c2ecf20Sopenharmony_ci 8018c2ecf20Sopenharmony_ci /* 8028c2ecf20Sopenharmony_ci * Indicates whether we are are considering asynchronous probing or 8038c2ecf20Sopenharmony_ci * not. Only initial binding after device or driver registration 8048c2ecf20Sopenharmony_ci * (including deferral processing) may be done asynchronously, the 8058c2ecf20Sopenharmony_ci * rest is always synchronous, as we expect it is being done by 8068c2ecf20Sopenharmony_ci * request from userspace. 8078c2ecf20Sopenharmony_ci */ 8088c2ecf20Sopenharmony_ci bool check_async; 8098c2ecf20Sopenharmony_ci 8108c2ecf20Sopenharmony_ci /* 8118c2ecf20Sopenharmony_ci * Indicates if we are binding synchronous or asynchronous drivers. 8128c2ecf20Sopenharmony_ci * When asynchronous probing is enabled we'll execute 2 passes 8138c2ecf20Sopenharmony_ci * over drivers: first pass doing synchronous probing and second 8148c2ecf20Sopenharmony_ci * doing asynchronous probing (if synchronous did not succeed - 8158c2ecf20Sopenharmony_ci * most likely because there was no driver requiring synchronous 8168c2ecf20Sopenharmony_ci * probing - and we found asynchronous driver during first pass). 8178c2ecf20Sopenharmony_ci * The 2 passes are done because we can't shoot asynchronous 8188c2ecf20Sopenharmony_ci * probe for given device and driver from bus_for_each_drv() since 8198c2ecf20Sopenharmony_ci * driver pointer is not guaranteed to stay valid once 8208c2ecf20Sopenharmony_ci * bus_for_each_drv() iterates to the next driver on the bus. 8218c2ecf20Sopenharmony_ci */ 8228c2ecf20Sopenharmony_ci bool want_async; 8238c2ecf20Sopenharmony_ci 8248c2ecf20Sopenharmony_ci /* 8258c2ecf20Sopenharmony_ci * We'll set have_async to 'true' if, while scanning for matching 8268c2ecf20Sopenharmony_ci * driver, we'll encounter one that requests asynchronous probing. 8278c2ecf20Sopenharmony_ci */ 8288c2ecf20Sopenharmony_ci bool have_async; 8298c2ecf20Sopenharmony_ci}; 8308c2ecf20Sopenharmony_ci 8318c2ecf20Sopenharmony_cistatic int __device_attach_driver(struct device_driver *drv, void *_data) 8328c2ecf20Sopenharmony_ci{ 8338c2ecf20Sopenharmony_ci struct device_attach_data *data = _data; 8348c2ecf20Sopenharmony_ci struct device *dev = data->dev; 8358c2ecf20Sopenharmony_ci bool async_allowed; 8368c2ecf20Sopenharmony_ci int ret; 8378c2ecf20Sopenharmony_ci 8388c2ecf20Sopenharmony_ci ret = driver_match_device(drv, dev); 8398c2ecf20Sopenharmony_ci if (ret == 0) { 8408c2ecf20Sopenharmony_ci /* no match */ 8418c2ecf20Sopenharmony_ci return 0; 8428c2ecf20Sopenharmony_ci } else if (ret == -EPROBE_DEFER) { 8438c2ecf20Sopenharmony_ci dev_dbg(dev, "Device match requests probe deferral\n"); 8448c2ecf20Sopenharmony_ci driver_deferred_probe_add(dev); 8458c2ecf20Sopenharmony_ci /* 8468c2ecf20Sopenharmony_ci * Device can't match with a driver right now, so don't attempt 8478c2ecf20Sopenharmony_ci * to match or bind with other drivers on the bus. 8488c2ecf20Sopenharmony_ci */ 8498c2ecf20Sopenharmony_ci return ret; 8508c2ecf20Sopenharmony_ci } else if (ret < 0) { 8518c2ecf20Sopenharmony_ci dev_dbg(dev, "Bus failed to match device: %d\n", ret); 8528c2ecf20Sopenharmony_ci return ret; 8538c2ecf20Sopenharmony_ci } /* ret > 0 means positive match */ 8548c2ecf20Sopenharmony_ci 8558c2ecf20Sopenharmony_ci async_allowed = driver_allows_async_probing(drv); 8568c2ecf20Sopenharmony_ci 8578c2ecf20Sopenharmony_ci if (async_allowed) 8588c2ecf20Sopenharmony_ci data->have_async = true; 8598c2ecf20Sopenharmony_ci 8608c2ecf20Sopenharmony_ci if (data->check_async && async_allowed != data->want_async) 8618c2ecf20Sopenharmony_ci return 0; 8628c2ecf20Sopenharmony_ci 8638c2ecf20Sopenharmony_ci return driver_probe_device(drv, dev); 8648c2ecf20Sopenharmony_ci} 8658c2ecf20Sopenharmony_ci 8668c2ecf20Sopenharmony_cistatic void __device_attach_async_helper(void *_dev, async_cookie_t cookie) 8678c2ecf20Sopenharmony_ci{ 8688c2ecf20Sopenharmony_ci struct device *dev = _dev; 8698c2ecf20Sopenharmony_ci struct device_attach_data data = { 8708c2ecf20Sopenharmony_ci .dev = dev, 8718c2ecf20Sopenharmony_ci .check_async = true, 8728c2ecf20Sopenharmony_ci .want_async = true, 8738c2ecf20Sopenharmony_ci }; 8748c2ecf20Sopenharmony_ci 8758c2ecf20Sopenharmony_ci device_lock(dev); 8768c2ecf20Sopenharmony_ci 8778c2ecf20Sopenharmony_ci /* 8788c2ecf20Sopenharmony_ci * Check if device has already been removed or claimed. This may 8798c2ecf20Sopenharmony_ci * happen with driver loading, device discovery/registration, 8808c2ecf20Sopenharmony_ci * and deferred probe processing happens all at once with 8818c2ecf20Sopenharmony_ci * multiple threads. 8828c2ecf20Sopenharmony_ci */ 8838c2ecf20Sopenharmony_ci if (dev->p->dead || dev->driver) 8848c2ecf20Sopenharmony_ci goto out_unlock; 8858c2ecf20Sopenharmony_ci 8868c2ecf20Sopenharmony_ci if (dev->parent) 8878c2ecf20Sopenharmony_ci pm_runtime_get_sync(dev->parent); 8888c2ecf20Sopenharmony_ci 8898c2ecf20Sopenharmony_ci bus_for_each_drv(dev->bus, NULL, &data, __device_attach_driver); 8908c2ecf20Sopenharmony_ci dev_dbg(dev, "async probe completed\n"); 8918c2ecf20Sopenharmony_ci 8928c2ecf20Sopenharmony_ci pm_request_idle(dev); 8938c2ecf20Sopenharmony_ci 8948c2ecf20Sopenharmony_ci if (dev->parent) 8958c2ecf20Sopenharmony_ci pm_runtime_put(dev->parent); 8968c2ecf20Sopenharmony_ciout_unlock: 8978c2ecf20Sopenharmony_ci device_unlock(dev); 8988c2ecf20Sopenharmony_ci 8998c2ecf20Sopenharmony_ci put_device(dev); 9008c2ecf20Sopenharmony_ci} 9018c2ecf20Sopenharmony_ci 9028c2ecf20Sopenharmony_cistatic int __device_attach(struct device *dev, bool allow_async) 9038c2ecf20Sopenharmony_ci{ 9048c2ecf20Sopenharmony_ci int ret = 0; 9058c2ecf20Sopenharmony_ci bool async = false; 9068c2ecf20Sopenharmony_ci 9078c2ecf20Sopenharmony_ci device_lock(dev); 9088c2ecf20Sopenharmony_ci if (dev->p->dead) { 9098c2ecf20Sopenharmony_ci goto out_unlock; 9108c2ecf20Sopenharmony_ci } else if (dev->driver) { 9118c2ecf20Sopenharmony_ci if (device_is_bound(dev)) { 9128c2ecf20Sopenharmony_ci ret = 1; 9138c2ecf20Sopenharmony_ci goto out_unlock; 9148c2ecf20Sopenharmony_ci } 9158c2ecf20Sopenharmony_ci ret = device_bind_driver(dev); 9168c2ecf20Sopenharmony_ci if (ret == 0) 9178c2ecf20Sopenharmony_ci ret = 1; 9188c2ecf20Sopenharmony_ci else { 9198c2ecf20Sopenharmony_ci dev->driver = NULL; 9208c2ecf20Sopenharmony_ci ret = 0; 9218c2ecf20Sopenharmony_ci } 9228c2ecf20Sopenharmony_ci } else { 9238c2ecf20Sopenharmony_ci struct device_attach_data data = { 9248c2ecf20Sopenharmony_ci .dev = dev, 9258c2ecf20Sopenharmony_ci .check_async = allow_async, 9268c2ecf20Sopenharmony_ci .want_async = false, 9278c2ecf20Sopenharmony_ci }; 9288c2ecf20Sopenharmony_ci 9298c2ecf20Sopenharmony_ci if (dev->parent) 9308c2ecf20Sopenharmony_ci pm_runtime_get_sync(dev->parent); 9318c2ecf20Sopenharmony_ci 9328c2ecf20Sopenharmony_ci ret = bus_for_each_drv(dev->bus, NULL, &data, 9338c2ecf20Sopenharmony_ci __device_attach_driver); 9348c2ecf20Sopenharmony_ci if (!ret && allow_async && data.have_async) { 9358c2ecf20Sopenharmony_ci /* 9368c2ecf20Sopenharmony_ci * If we could not find appropriate driver 9378c2ecf20Sopenharmony_ci * synchronously and we are allowed to do 9388c2ecf20Sopenharmony_ci * async probes and there are drivers that 9398c2ecf20Sopenharmony_ci * want to probe asynchronously, we'll 9408c2ecf20Sopenharmony_ci * try them. 9418c2ecf20Sopenharmony_ci */ 9428c2ecf20Sopenharmony_ci dev_dbg(dev, "scheduling asynchronous probe\n"); 9438c2ecf20Sopenharmony_ci get_device(dev); 9448c2ecf20Sopenharmony_ci async = true; 9458c2ecf20Sopenharmony_ci } else { 9468c2ecf20Sopenharmony_ci pm_request_idle(dev); 9478c2ecf20Sopenharmony_ci } 9488c2ecf20Sopenharmony_ci 9498c2ecf20Sopenharmony_ci if (dev->parent) 9508c2ecf20Sopenharmony_ci pm_runtime_put(dev->parent); 9518c2ecf20Sopenharmony_ci } 9528c2ecf20Sopenharmony_ciout_unlock: 9538c2ecf20Sopenharmony_ci device_unlock(dev); 9548c2ecf20Sopenharmony_ci if (async) 9558c2ecf20Sopenharmony_ci async_schedule_dev(__device_attach_async_helper, dev); 9568c2ecf20Sopenharmony_ci return ret; 9578c2ecf20Sopenharmony_ci} 9588c2ecf20Sopenharmony_ci 9598c2ecf20Sopenharmony_ci/** 9608c2ecf20Sopenharmony_ci * device_attach - try to attach device to a driver. 9618c2ecf20Sopenharmony_ci * @dev: device. 9628c2ecf20Sopenharmony_ci * 9638c2ecf20Sopenharmony_ci * Walk the list of drivers that the bus has and call 9648c2ecf20Sopenharmony_ci * driver_probe_device() for each pair. If a compatible 9658c2ecf20Sopenharmony_ci * pair is found, break out and return. 9668c2ecf20Sopenharmony_ci * 9678c2ecf20Sopenharmony_ci * Returns 1 if the device was bound to a driver; 9688c2ecf20Sopenharmony_ci * 0 if no matching driver was found; 9698c2ecf20Sopenharmony_ci * -ENODEV if the device is not registered. 9708c2ecf20Sopenharmony_ci * 9718c2ecf20Sopenharmony_ci * When called for a USB interface, @dev->parent lock must be held. 9728c2ecf20Sopenharmony_ci */ 9738c2ecf20Sopenharmony_ciint device_attach(struct device *dev) 9748c2ecf20Sopenharmony_ci{ 9758c2ecf20Sopenharmony_ci return __device_attach(dev, false); 9768c2ecf20Sopenharmony_ci} 9778c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(device_attach); 9788c2ecf20Sopenharmony_ci 9798c2ecf20Sopenharmony_civoid device_initial_probe(struct device *dev) 9808c2ecf20Sopenharmony_ci{ 9818c2ecf20Sopenharmony_ci __device_attach(dev, true); 9828c2ecf20Sopenharmony_ci} 9838c2ecf20Sopenharmony_ci 9848c2ecf20Sopenharmony_ci/* 9858c2ecf20Sopenharmony_ci * __device_driver_lock - acquire locks needed to manipulate dev->drv 9868c2ecf20Sopenharmony_ci * @dev: Device we will update driver info for 9878c2ecf20Sopenharmony_ci * @parent: Parent device. Needed if the bus requires parent lock 9888c2ecf20Sopenharmony_ci * 9898c2ecf20Sopenharmony_ci * This function will take the required locks for manipulating dev->drv. 9908c2ecf20Sopenharmony_ci * Normally this will just be the @dev lock, but when called for a USB 9918c2ecf20Sopenharmony_ci * interface, @parent lock will be held as well. 9928c2ecf20Sopenharmony_ci */ 9938c2ecf20Sopenharmony_cistatic void __device_driver_lock(struct device *dev, struct device *parent) 9948c2ecf20Sopenharmony_ci{ 9958c2ecf20Sopenharmony_ci if (parent && dev->bus->need_parent_lock) 9968c2ecf20Sopenharmony_ci device_lock(parent); 9978c2ecf20Sopenharmony_ci device_lock(dev); 9988c2ecf20Sopenharmony_ci} 9998c2ecf20Sopenharmony_ci 10008c2ecf20Sopenharmony_ci/* 10018c2ecf20Sopenharmony_ci * __device_driver_unlock - release locks needed to manipulate dev->drv 10028c2ecf20Sopenharmony_ci * @dev: Device we will update driver info for 10038c2ecf20Sopenharmony_ci * @parent: Parent device. Needed if the bus requires parent lock 10048c2ecf20Sopenharmony_ci * 10058c2ecf20Sopenharmony_ci * This function will release the required locks for manipulating dev->drv. 10068c2ecf20Sopenharmony_ci * Normally this will just be the the @dev lock, but when called for a 10078c2ecf20Sopenharmony_ci * USB interface, @parent lock will be released as well. 10088c2ecf20Sopenharmony_ci */ 10098c2ecf20Sopenharmony_cistatic void __device_driver_unlock(struct device *dev, struct device *parent) 10108c2ecf20Sopenharmony_ci{ 10118c2ecf20Sopenharmony_ci device_unlock(dev); 10128c2ecf20Sopenharmony_ci if (parent && dev->bus->need_parent_lock) 10138c2ecf20Sopenharmony_ci device_unlock(parent); 10148c2ecf20Sopenharmony_ci} 10158c2ecf20Sopenharmony_ci 10168c2ecf20Sopenharmony_ci/** 10178c2ecf20Sopenharmony_ci * device_driver_attach - attach a specific driver to a specific device 10188c2ecf20Sopenharmony_ci * @drv: Driver to attach 10198c2ecf20Sopenharmony_ci * @dev: Device to attach it to 10208c2ecf20Sopenharmony_ci * 10218c2ecf20Sopenharmony_ci * Manually attach driver to a device. Will acquire both @dev lock and 10228c2ecf20Sopenharmony_ci * @dev->parent lock if needed. 10238c2ecf20Sopenharmony_ci */ 10248c2ecf20Sopenharmony_ciint device_driver_attach(struct device_driver *drv, struct device *dev) 10258c2ecf20Sopenharmony_ci{ 10268c2ecf20Sopenharmony_ci int ret = 0; 10278c2ecf20Sopenharmony_ci 10288c2ecf20Sopenharmony_ci __device_driver_lock(dev, dev->parent); 10298c2ecf20Sopenharmony_ci 10308c2ecf20Sopenharmony_ci /* 10318c2ecf20Sopenharmony_ci * If device has been removed or someone has already successfully 10328c2ecf20Sopenharmony_ci * bound a driver before us just skip the driver probe call. 10338c2ecf20Sopenharmony_ci */ 10348c2ecf20Sopenharmony_ci if (!dev->p->dead && !dev->driver) 10358c2ecf20Sopenharmony_ci ret = driver_probe_device(drv, dev); 10368c2ecf20Sopenharmony_ci 10378c2ecf20Sopenharmony_ci __device_driver_unlock(dev, dev->parent); 10388c2ecf20Sopenharmony_ci 10398c2ecf20Sopenharmony_ci return ret; 10408c2ecf20Sopenharmony_ci} 10418c2ecf20Sopenharmony_ci 10428c2ecf20Sopenharmony_cistatic void __driver_attach_async_helper(void *_dev, async_cookie_t cookie) 10438c2ecf20Sopenharmony_ci{ 10448c2ecf20Sopenharmony_ci struct device *dev = _dev; 10458c2ecf20Sopenharmony_ci struct device_driver *drv; 10468c2ecf20Sopenharmony_ci int ret = 0; 10478c2ecf20Sopenharmony_ci 10488c2ecf20Sopenharmony_ci __device_driver_lock(dev, dev->parent); 10498c2ecf20Sopenharmony_ci 10508c2ecf20Sopenharmony_ci drv = dev->p->async_driver; 10518c2ecf20Sopenharmony_ci 10528c2ecf20Sopenharmony_ci /* 10538c2ecf20Sopenharmony_ci * If device has been removed or someone has already successfully 10548c2ecf20Sopenharmony_ci * bound a driver before us just skip the driver probe call. 10558c2ecf20Sopenharmony_ci */ 10568c2ecf20Sopenharmony_ci if (!dev->p->dead && !dev->driver) 10578c2ecf20Sopenharmony_ci ret = driver_probe_device(drv, dev); 10588c2ecf20Sopenharmony_ci 10598c2ecf20Sopenharmony_ci __device_driver_unlock(dev, dev->parent); 10608c2ecf20Sopenharmony_ci 10618c2ecf20Sopenharmony_ci dev_dbg(dev, "driver %s async attach completed: %d\n", drv->name, ret); 10628c2ecf20Sopenharmony_ci 10638c2ecf20Sopenharmony_ci put_device(dev); 10648c2ecf20Sopenharmony_ci} 10658c2ecf20Sopenharmony_ci 10668c2ecf20Sopenharmony_cistatic int __driver_attach(struct device *dev, void *data) 10678c2ecf20Sopenharmony_ci{ 10688c2ecf20Sopenharmony_ci struct device_driver *drv = data; 10698c2ecf20Sopenharmony_ci bool async = false; 10708c2ecf20Sopenharmony_ci int ret; 10718c2ecf20Sopenharmony_ci 10728c2ecf20Sopenharmony_ci /* 10738c2ecf20Sopenharmony_ci * Lock device and try to bind to it. We drop the error 10748c2ecf20Sopenharmony_ci * here and always return 0, because we need to keep trying 10758c2ecf20Sopenharmony_ci * to bind to devices and some drivers will return an error 10768c2ecf20Sopenharmony_ci * simply if it didn't support the device. 10778c2ecf20Sopenharmony_ci * 10788c2ecf20Sopenharmony_ci * driver_probe_device() will spit a warning if there 10798c2ecf20Sopenharmony_ci * is an error. 10808c2ecf20Sopenharmony_ci */ 10818c2ecf20Sopenharmony_ci 10828c2ecf20Sopenharmony_ci ret = driver_match_device(drv, dev); 10838c2ecf20Sopenharmony_ci if (ret == 0) { 10848c2ecf20Sopenharmony_ci /* no match */ 10858c2ecf20Sopenharmony_ci return 0; 10868c2ecf20Sopenharmony_ci } else if (ret == -EPROBE_DEFER) { 10878c2ecf20Sopenharmony_ci dev_dbg(dev, "Device match requests probe deferral\n"); 10888c2ecf20Sopenharmony_ci driver_deferred_probe_add(dev); 10898c2ecf20Sopenharmony_ci /* 10908c2ecf20Sopenharmony_ci * Driver could not match with device, but may match with 10918c2ecf20Sopenharmony_ci * another device on the bus. 10928c2ecf20Sopenharmony_ci */ 10938c2ecf20Sopenharmony_ci return 0; 10948c2ecf20Sopenharmony_ci } else if (ret < 0) { 10958c2ecf20Sopenharmony_ci dev_dbg(dev, "Bus failed to match device: %d\n", ret); 10968c2ecf20Sopenharmony_ci /* 10978c2ecf20Sopenharmony_ci * Driver could not match with device, but may match with 10988c2ecf20Sopenharmony_ci * another device on the bus. 10998c2ecf20Sopenharmony_ci */ 11008c2ecf20Sopenharmony_ci return 0; 11018c2ecf20Sopenharmony_ci } /* ret > 0 means positive match */ 11028c2ecf20Sopenharmony_ci 11038c2ecf20Sopenharmony_ci if (driver_allows_async_probing(drv)) { 11048c2ecf20Sopenharmony_ci /* 11058c2ecf20Sopenharmony_ci * Instead of probing the device synchronously we will 11068c2ecf20Sopenharmony_ci * probe it asynchronously to allow for more parallelism. 11078c2ecf20Sopenharmony_ci * 11088c2ecf20Sopenharmony_ci * We only take the device lock here in order to guarantee 11098c2ecf20Sopenharmony_ci * that the dev->driver and async_driver fields are protected 11108c2ecf20Sopenharmony_ci */ 11118c2ecf20Sopenharmony_ci dev_dbg(dev, "probing driver %s asynchronously\n", drv->name); 11128c2ecf20Sopenharmony_ci device_lock(dev); 11138c2ecf20Sopenharmony_ci if (!dev->driver) { 11148c2ecf20Sopenharmony_ci get_device(dev); 11158c2ecf20Sopenharmony_ci dev->p->async_driver = drv; 11168c2ecf20Sopenharmony_ci async = true; 11178c2ecf20Sopenharmony_ci } 11188c2ecf20Sopenharmony_ci device_unlock(dev); 11198c2ecf20Sopenharmony_ci if (async) 11208c2ecf20Sopenharmony_ci async_schedule_dev(__driver_attach_async_helper, dev); 11218c2ecf20Sopenharmony_ci return 0; 11228c2ecf20Sopenharmony_ci } 11238c2ecf20Sopenharmony_ci 11248c2ecf20Sopenharmony_ci device_driver_attach(drv, dev); 11258c2ecf20Sopenharmony_ci 11268c2ecf20Sopenharmony_ci return 0; 11278c2ecf20Sopenharmony_ci} 11288c2ecf20Sopenharmony_ci 11298c2ecf20Sopenharmony_ci/** 11308c2ecf20Sopenharmony_ci * driver_attach - try to bind driver to devices. 11318c2ecf20Sopenharmony_ci * @drv: driver. 11328c2ecf20Sopenharmony_ci * 11338c2ecf20Sopenharmony_ci * Walk the list of devices that the bus has on it and try to 11348c2ecf20Sopenharmony_ci * match the driver with each one. If driver_probe_device() 11358c2ecf20Sopenharmony_ci * returns 0 and the @dev->driver is set, we've found a 11368c2ecf20Sopenharmony_ci * compatible pair. 11378c2ecf20Sopenharmony_ci */ 11388c2ecf20Sopenharmony_ciint driver_attach(struct device_driver *drv) 11398c2ecf20Sopenharmony_ci{ 11408c2ecf20Sopenharmony_ci return bus_for_each_dev(drv->bus, NULL, drv, __driver_attach); 11418c2ecf20Sopenharmony_ci} 11428c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(driver_attach); 11438c2ecf20Sopenharmony_ci 11448c2ecf20Sopenharmony_ci/* 11458c2ecf20Sopenharmony_ci * __device_release_driver() must be called with @dev lock held. 11468c2ecf20Sopenharmony_ci * When called for a USB interface, @dev->parent lock must be held as well. 11478c2ecf20Sopenharmony_ci */ 11488c2ecf20Sopenharmony_cistatic void __device_release_driver(struct device *dev, struct device *parent) 11498c2ecf20Sopenharmony_ci{ 11508c2ecf20Sopenharmony_ci struct device_driver *drv; 11518c2ecf20Sopenharmony_ci 11528c2ecf20Sopenharmony_ci drv = dev->driver; 11538c2ecf20Sopenharmony_ci if (drv) { 11548c2ecf20Sopenharmony_ci pm_runtime_get_sync(dev); 11558c2ecf20Sopenharmony_ci 11568c2ecf20Sopenharmony_ci while (device_links_busy(dev)) { 11578c2ecf20Sopenharmony_ci __device_driver_unlock(dev, parent); 11588c2ecf20Sopenharmony_ci 11598c2ecf20Sopenharmony_ci device_links_unbind_consumers(dev); 11608c2ecf20Sopenharmony_ci 11618c2ecf20Sopenharmony_ci __device_driver_lock(dev, parent); 11628c2ecf20Sopenharmony_ci /* 11638c2ecf20Sopenharmony_ci * A concurrent invocation of the same function might 11648c2ecf20Sopenharmony_ci * have released the driver successfully while this one 11658c2ecf20Sopenharmony_ci * was waiting, so check for that. 11668c2ecf20Sopenharmony_ci */ 11678c2ecf20Sopenharmony_ci if (dev->driver != drv) { 11688c2ecf20Sopenharmony_ci pm_runtime_put(dev); 11698c2ecf20Sopenharmony_ci return; 11708c2ecf20Sopenharmony_ci } 11718c2ecf20Sopenharmony_ci } 11728c2ecf20Sopenharmony_ci 11738c2ecf20Sopenharmony_ci driver_sysfs_remove(dev); 11748c2ecf20Sopenharmony_ci 11758c2ecf20Sopenharmony_ci if (dev->bus) 11768c2ecf20Sopenharmony_ci blocking_notifier_call_chain(&dev->bus->p->bus_notifier, 11778c2ecf20Sopenharmony_ci BUS_NOTIFY_UNBIND_DRIVER, 11788c2ecf20Sopenharmony_ci dev); 11798c2ecf20Sopenharmony_ci 11808c2ecf20Sopenharmony_ci pm_runtime_put_sync(dev); 11818c2ecf20Sopenharmony_ci 11828c2ecf20Sopenharmony_ci device_remove_file(dev, &dev_attr_state_synced); 11838c2ecf20Sopenharmony_ci device_remove_groups(dev, drv->dev_groups); 11848c2ecf20Sopenharmony_ci 11858c2ecf20Sopenharmony_ci if (dev->bus && dev->bus->remove) 11868c2ecf20Sopenharmony_ci dev->bus->remove(dev); 11878c2ecf20Sopenharmony_ci else if (drv->remove) 11888c2ecf20Sopenharmony_ci drv->remove(dev); 11898c2ecf20Sopenharmony_ci 11908c2ecf20Sopenharmony_ci devres_release_all(dev); 11918c2ecf20Sopenharmony_ci arch_teardown_dma_ops(dev); 11928c2ecf20Sopenharmony_ci kfree(dev->dma_range_map); 11938c2ecf20Sopenharmony_ci dev->dma_range_map = NULL; 11948c2ecf20Sopenharmony_ci dev->driver = NULL; 11958c2ecf20Sopenharmony_ci dev_set_drvdata(dev, NULL); 11968c2ecf20Sopenharmony_ci if (dev->pm_domain && dev->pm_domain->dismiss) 11978c2ecf20Sopenharmony_ci dev->pm_domain->dismiss(dev); 11988c2ecf20Sopenharmony_ci pm_runtime_reinit(dev); 11998c2ecf20Sopenharmony_ci dev_pm_set_driver_flags(dev, 0); 12008c2ecf20Sopenharmony_ci 12018c2ecf20Sopenharmony_ci device_links_driver_cleanup(dev); 12028c2ecf20Sopenharmony_ci 12038c2ecf20Sopenharmony_ci klist_remove(&dev->p->knode_driver); 12048c2ecf20Sopenharmony_ci device_pm_check_callbacks(dev); 12058c2ecf20Sopenharmony_ci if (dev->bus) 12068c2ecf20Sopenharmony_ci blocking_notifier_call_chain(&dev->bus->p->bus_notifier, 12078c2ecf20Sopenharmony_ci BUS_NOTIFY_UNBOUND_DRIVER, 12088c2ecf20Sopenharmony_ci dev); 12098c2ecf20Sopenharmony_ci 12108c2ecf20Sopenharmony_ci kobject_uevent(&dev->kobj, KOBJ_UNBIND); 12118c2ecf20Sopenharmony_ci } 12128c2ecf20Sopenharmony_ci} 12138c2ecf20Sopenharmony_ci 12148c2ecf20Sopenharmony_civoid device_release_driver_internal(struct device *dev, 12158c2ecf20Sopenharmony_ci struct device_driver *drv, 12168c2ecf20Sopenharmony_ci struct device *parent) 12178c2ecf20Sopenharmony_ci{ 12188c2ecf20Sopenharmony_ci __device_driver_lock(dev, parent); 12198c2ecf20Sopenharmony_ci 12208c2ecf20Sopenharmony_ci if (!drv || drv == dev->driver) 12218c2ecf20Sopenharmony_ci __device_release_driver(dev, parent); 12228c2ecf20Sopenharmony_ci 12238c2ecf20Sopenharmony_ci __device_driver_unlock(dev, parent); 12248c2ecf20Sopenharmony_ci} 12258c2ecf20Sopenharmony_ci 12268c2ecf20Sopenharmony_ci/** 12278c2ecf20Sopenharmony_ci * device_release_driver - manually detach device from driver. 12288c2ecf20Sopenharmony_ci * @dev: device. 12298c2ecf20Sopenharmony_ci * 12308c2ecf20Sopenharmony_ci * Manually detach device from driver. 12318c2ecf20Sopenharmony_ci * When called for a USB interface, @dev->parent lock must be held. 12328c2ecf20Sopenharmony_ci * 12338c2ecf20Sopenharmony_ci * If this function is to be called with @dev->parent lock held, ensure that 12348c2ecf20Sopenharmony_ci * the device's consumers are unbound in advance or that their locks can be 12358c2ecf20Sopenharmony_ci * acquired under the @dev->parent lock. 12368c2ecf20Sopenharmony_ci */ 12378c2ecf20Sopenharmony_civoid device_release_driver(struct device *dev) 12388c2ecf20Sopenharmony_ci{ 12398c2ecf20Sopenharmony_ci /* 12408c2ecf20Sopenharmony_ci * If anyone calls device_release_driver() recursively from 12418c2ecf20Sopenharmony_ci * within their ->remove callback for the same device, they 12428c2ecf20Sopenharmony_ci * will deadlock right here. 12438c2ecf20Sopenharmony_ci */ 12448c2ecf20Sopenharmony_ci device_release_driver_internal(dev, NULL, NULL); 12458c2ecf20Sopenharmony_ci} 12468c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(device_release_driver); 12478c2ecf20Sopenharmony_ci 12488c2ecf20Sopenharmony_ci/** 12498c2ecf20Sopenharmony_ci * device_driver_detach - detach driver from a specific device 12508c2ecf20Sopenharmony_ci * @dev: device to detach driver from 12518c2ecf20Sopenharmony_ci * 12528c2ecf20Sopenharmony_ci * Detach driver from device. Will acquire both @dev lock and @dev->parent 12538c2ecf20Sopenharmony_ci * lock if needed. 12548c2ecf20Sopenharmony_ci */ 12558c2ecf20Sopenharmony_civoid device_driver_detach(struct device *dev) 12568c2ecf20Sopenharmony_ci{ 12578c2ecf20Sopenharmony_ci device_release_driver_internal(dev, NULL, dev->parent); 12588c2ecf20Sopenharmony_ci} 12598c2ecf20Sopenharmony_ci 12608c2ecf20Sopenharmony_ci/** 12618c2ecf20Sopenharmony_ci * driver_detach - detach driver from all devices it controls. 12628c2ecf20Sopenharmony_ci * @drv: driver. 12638c2ecf20Sopenharmony_ci */ 12648c2ecf20Sopenharmony_civoid driver_detach(struct device_driver *drv) 12658c2ecf20Sopenharmony_ci{ 12668c2ecf20Sopenharmony_ci struct device_private *dev_prv; 12678c2ecf20Sopenharmony_ci struct device *dev; 12688c2ecf20Sopenharmony_ci 12698c2ecf20Sopenharmony_ci if (driver_allows_async_probing(drv)) 12708c2ecf20Sopenharmony_ci async_synchronize_full(); 12718c2ecf20Sopenharmony_ci 12728c2ecf20Sopenharmony_ci for (;;) { 12738c2ecf20Sopenharmony_ci spin_lock(&drv->p->klist_devices.k_lock); 12748c2ecf20Sopenharmony_ci if (list_empty(&drv->p->klist_devices.k_list)) { 12758c2ecf20Sopenharmony_ci spin_unlock(&drv->p->klist_devices.k_lock); 12768c2ecf20Sopenharmony_ci break; 12778c2ecf20Sopenharmony_ci } 12788c2ecf20Sopenharmony_ci dev_prv = list_last_entry(&drv->p->klist_devices.k_list, 12798c2ecf20Sopenharmony_ci struct device_private, 12808c2ecf20Sopenharmony_ci knode_driver.n_node); 12818c2ecf20Sopenharmony_ci dev = dev_prv->device; 12828c2ecf20Sopenharmony_ci get_device(dev); 12838c2ecf20Sopenharmony_ci spin_unlock(&drv->p->klist_devices.k_lock); 12848c2ecf20Sopenharmony_ci device_release_driver_internal(dev, drv, dev->parent); 12858c2ecf20Sopenharmony_ci put_device(dev); 12868c2ecf20Sopenharmony_ci } 12878c2ecf20Sopenharmony_ci} 1288