| 1 | |
| 2 | |
| 3 | * All the USB notify logic
|
| 4 | *
|
| 5 | * (C) Copyright 2005 Greg Kroah-Hartman <[email protected]>
|
| 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 | blocking_notifier_call_chain(&usb_notifier_list,
|
| 57 | USB_DEVICE_REMOVE, udev);
|
| 58 | }
|
| 59 |
|
| 60 | void usb_notify_add_bus(struct usb_bus *ubus)
|
| 61 | {
|
| 62 | blocking_notifier_call_chain(&usb_notifier_list, USB_BUS_ADD, ubus);
|
| 63 | }
|
| 64 |
|
| 65 | void usb_notify_remove_bus(struct usb_bus *ubus)
|
| 66 | {
|
| 67 | blocking_notifier_call_chain(&usb_notifier_list, USB_BUS_REMOVE, ubus);
|
| 68 | }
|