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(nh: &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(nh: &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(nh: &usb_notifier_list, USB_DEVICE_ADD, v: udev); |
52 | } |
53 | |
54 | void usb_notify_remove_device(struct usb_device *udev) |
55 | { |
56 | blocking_notifier_call_chain(nh: &usb_notifier_list, |
57 | USB_DEVICE_REMOVE, v: udev); |
58 | } |
59 | |
60 | void usb_notify_add_bus(struct usb_bus *ubus) |
61 | { |
62 | blocking_notifier_call_chain(nh: &usb_notifier_list, USB_BUS_ADD, v: ubus); |
63 | } |
64 | |
65 | void usb_notify_remove_bus(struct usb_bus *ubus) |
66 | { |
67 | blocking_notifier_call_chain(nh: &usb_notifier_list, USB_BUS_REMOVE, v: ubus); |
68 | } |
69 | |