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