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 | 12 | #include <linux/kernel.h> |
f940fcd8 | 13 | #include <linux/export.h> |
3099e75a | 14 | #include <linux/notifier.h> |
3099e75a | 15 | #include <linux/usb.h> |
4186ecf8 | 16 | #include <linux/mutex.h> |
3099e75a GKH |
17 | #include "usb.h" |
18 | ||
e041c683 | 19 | static BLOCKING_NOTIFIER_HEAD(usb_notifier_list); |
3099e75a GKH |
20 | |
21 | /** | |
22 | * usb_register_notify - register a notifier callback whenever a usb change happens | |
23 | * @nb: pointer to the notifier block for the callback events. | |
24 | * | |
25 | * These changes are either USB devices or busses being added or removed. | |
26 | */ | |
27 | void usb_register_notify(struct notifier_block *nb) | |
28 | { | |
e041c683 | 29 | blocking_notifier_chain_register(&usb_notifier_list, nb); |
3099e75a GKH |
30 | } |
31 | EXPORT_SYMBOL_GPL(usb_register_notify); | |
32 | ||
33 | /** | |
34 | * usb_unregister_notify - unregister a notifier callback | |
35 | * @nb: pointer to the notifier block for the callback events. | |
36 | * | |
da287623 | 37 | * usb_register_notify() must have been previously called for this function |
3099e75a GKH |
38 | * to work properly. |
39 | */ | |
40 | void usb_unregister_notify(struct notifier_block *nb) | |
41 | { | |
e041c683 | 42 | blocking_notifier_chain_unregister(&usb_notifier_list, nb); |
3099e75a GKH |
43 | } |
44 | EXPORT_SYMBOL_GPL(usb_unregister_notify); | |
45 | ||
46 | ||
47 | void usb_notify_add_device(struct usb_device *udev) | |
48 | { | |
e041c683 | 49 | blocking_notifier_call_chain(&usb_notifier_list, USB_DEVICE_ADD, udev); |
3099e75a GKH |
50 | } |
51 | ||
52 | void usb_notify_remove_device(struct usb_device *udev) | |
53 | { | |
4a2a8a2c AS |
54 | /* Protect against simultaneous usbfs open */ |
55 | mutex_lock(&usbfs_mutex); | |
e041c683 AS |
56 | blocking_notifier_call_chain(&usb_notifier_list, |
57 | USB_DEVICE_REMOVE, udev); | |
4a2a8a2c | 58 | mutex_unlock(&usbfs_mutex); |
3099e75a GKH |
59 | } |
60 | ||
61 | void usb_notify_add_bus(struct usb_bus *ubus) | |
62 | { | |
e041c683 | 63 | blocking_notifier_call_chain(&usb_notifier_list, USB_BUS_ADD, ubus); |
3099e75a GKH |
64 | } |
65 | ||
66 | void usb_notify_remove_bus(struct usb_bus *ubus) | |
67 | { | |
e041c683 | 68 | blocking_notifier_call_chain(&usb_notifier_list, USB_BUS_REMOVE, ubus); |
3099e75a | 69 | } |