1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * All the USB notify logic 4 * 5 * (C) Copyright 2005 Greg Kroah-Hartman <gregkh@suse.de> 6 * 7 * notifier functions originally based on those in kernel/sys.c 8 * but fixed up to not be so broken. 9 * 10 * Released under the GPLv2 only. 11 */ 12 13 14 #include <linux/kernel.h> 15 #include <linux/export.h> 16 #include <linux/notifier.h> 17 #include <linux/usb.h> 18 #include <linux/mutex.h> 19 #include "usb.h" 20 21 static BLOCKING_NOTIFIER_HEAD(usb_notifier_list); 22 23 /** 24 * usb_register_notify - register a notifier callback whenever a usb change happens 25 * @nb: pointer to the notifier block for the callback events. 26 * 27 * These changes are either USB devices or busses being added or removed. 28 */ 29 void usb_register_notify(struct notifier_block *nb) 30 { 31 blocking_notifier_chain_register(&usb_notifier_list, nb); 32 } 33 EXPORT_SYMBOL_GPL(usb_register_notify); 34 35 /** 36 * usb_unregister_notify - unregister a notifier callback 37 * @nb: pointer to the notifier block for the callback events. 38 * 39 * usb_register_notify() must have been previously called for this function 40 * to work properly. 41 */ 42 void usb_unregister_notify(struct notifier_block *nb) 43 { 44 blocking_notifier_chain_unregister(&usb_notifier_list, nb); 45 } 46 EXPORT_SYMBOL_GPL(usb_unregister_notify); 47 48 49 void usb_notify_add_device(struct usb_device *udev) 50 { 51 blocking_notifier_call_chain(&usb_notifier_list, USB_DEVICE_ADD, udev); 52 } 53 54 void usb_notify_remove_device(struct usb_device *udev) 55 { 56 /* Protect against simultaneous usbfs open */ 57 mutex_lock(&usbfs_mutex); 58 blocking_notifier_call_chain(&usb_notifier_list, 59 USB_DEVICE_REMOVE, udev); 60 mutex_unlock(&usbfs_mutex); 61 } 62 63 void usb_notify_add_bus(struct usb_bus *ubus) 64 { 65 blocking_notifier_call_chain(&usb_notifier_list, USB_BUS_ADD, ubus); 66 } 67 68 void usb_notify_remove_bus(struct usb_bus *ubus) 69 { 70 blocking_notifier_call_chain(&usb_notifier_list, USB_BUS_REMOVE, ubus); 71 } 72