Branch data Line data Source code
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 : 42 : void usb_register_notify(struct notifier_block *nb) 30 : : { 31 : 42 : blocking_notifier_chain_register(&usb_notifier_list, nb); 32 : 42 : } 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 : 0 : void usb_unregister_notify(struct notifier_block *nb) 43 : : { 44 : 0 : blocking_notifier_chain_unregister(&usb_notifier_list, nb); 45 : 0 : } 46 : : EXPORT_SYMBOL_GPL(usb_unregister_notify); 47 : : 48 : : 49 : 0 : void usb_notify_add_device(struct usb_device *udev) 50 : : { 51 : 0 : blocking_notifier_call_chain(&usb_notifier_list, USB_DEVICE_ADD, udev); 52 : 0 : } 53 : : 54 : 0 : void usb_notify_remove_device(struct usb_device *udev) 55 : : { 56 : 0 : blocking_notifier_call_chain(&usb_notifier_list, 57 : : USB_DEVICE_REMOVE, udev); 58 : 0 : } 59 : : 60 : 0 : void usb_notify_add_bus(struct usb_bus *ubus) 61 : : { 62 : 0 : blocking_notifier_call_chain(&usb_notifier_list, USB_BUS_ADD, ubus); 63 : 0 : } 64 : : 65 : 0 : void usb_notify_remove_bus(struct usb_bus *ubus) 66 : : { 67 : 0 : blocking_notifier_call_chain(&usb_notifier_list, USB_BUS_REMOVE, ubus); 68 : 0 : }