linux/drivers/usb/core/notify.c
<<
>>
Prefs
   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
  12#include <linux/kernel.h>
  13#include <linux/notifier.h>
  14#include <linux/usb.h>
  15#include <linux/mutex.h>
  16#include "usb.h"
  17
  18static BLOCKING_NOTIFIER_HEAD(usb_notifier_list);
  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 */
  26void usb_register_notify(struct notifier_block *nb)
  27{
  28        blocking_notifier_chain_register(&usb_notifier_list, nb);
  29}
  30EXPORT_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 *
  36 * usb_register_notify() must have been previously called for this function
  37 * to work properly.
  38 */
  39void usb_unregister_notify(struct notifier_block *nb)
  40{
  41        blocking_notifier_chain_unregister(&usb_notifier_list, nb);
  42}
  43EXPORT_SYMBOL_GPL(usb_unregister_notify);
  44
  45
  46void usb_notify_add_device(struct usb_device *udev)
  47{
  48        blocking_notifier_call_chain(&usb_notifier_list, USB_DEVICE_ADD, udev);
  49}
  50
  51void usb_notify_remove_device(struct usb_device *udev)
  52{
  53        /* Protect against simultaneous usbfs open */
  54        mutex_lock(&usbfs_mutex);
  55        blocking_notifier_call_chain(&usb_notifier_list,
  56                        USB_DEVICE_REMOVE, udev);
  57        mutex_unlock(&usbfs_mutex);
  58}
  59
  60void usb_notify_add_bus(struct usb_bus *ubus)
  61{
  62        blocking_notifier_call_chain(&usb_notifier_list, USB_BUS_ADD, ubus);
  63}
  64
  65void usb_notify_remove_bus(struct usb_bus *ubus)
  66{
  67        blocking_notifier_call_chain(&usb_notifier_list, USB_BUS_REMOVE, ubus);
  68}
  69