This also removes 2 usbmon callbacks.
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
        up (&usb_bus_list_lock);
 
        usb_notify_add_bus(bus);
-       usbmon_notify_bus_add (bus);
 
        dev_info (bus->controller, "new USB bus registered, assigned bus number %d\n", bus->busnum);
        return 0;
        up (&usb_bus_list_lock);
 
        usb_notify_remove_bus(bus);
-       usbmon_notify_bus_remove (bus);
 
        clear_bit (bus->busnum, busmap.busmap);
 
 
        void (*urb_submit_error)(struct usb_bus *bus, struct urb *urb, int err);
        void (*urb_complete)(struct usb_bus *bus, struct urb *urb);
        /* void (*urb_unlink)(struct usb_bus *bus, struct urb *urb); */
-       void (*bus_add)(struct usb_bus *bus);
-       void (*bus_remove)(struct usb_bus *bus);
 };
 
 extern struct usb_mon_operations *mon_ops;
        if (bus->monitored)
                (*mon_ops->urb_complete)(bus, urb);
 }
- 
-static inline void usbmon_notify_bus_add(struct usb_bus *bus)
-{
-       if (mon_ops)
-               (*mon_ops->bus_add)(bus);
-}
-
-static inline void usbmon_notify_bus_remove(struct usb_bus *bus)
-{
-       if (mon_ops)
-               (*mon_ops->bus_remove)(bus);
-}
 
 int usb_mon_register(struct usb_mon_operations *ops);
 void usb_mon_deregister(void);
 static inline void usbmon_urb_submit_error(struct usb_bus *bus, struct urb *urb,
     int error) {}
 static inline void usbmon_urb_complete(struct usb_bus *bus, struct urb *urb) {}
-static inline void usbmon_notify_bus_add(struct usb_bus *bus) {}
-static inline void usbmon_notify_bus_remove(struct usb_bus *bus) {}
 
 #endif /* CONFIG_USB_MON */
 
 
 #include <linux/usb.h>
 #include <linux/debugfs.h>
 #include <linux/smp_lock.h>
+#include <linux/notifier.h>
 
 #include "usb_mon.h"
 #include "../core/hcd.h"
        up(&mon_lock);
 }
 
+static int mon_notify(struct notifier_block *self, unsigned long action,
+                     void *dev)
+{
+       switch (action) {
+       case USB_BUS_ADD:
+               mon_bus_add(dev);
+               break;
+       case USB_BUS_REMOVE:
+               mon_bus_remove(dev);
+       }
+       return NOTIFY_OK;
+}
+
+static struct notifier_block mon_nb = {
+       .notifier_call =        mon_notify,
+};
+
 /*
  * Ops
  */
        .urb_submit =   mon_submit,
        .urb_submit_error = mon_submit_error,
        .urb_complete = mon_complete,
-       .bus_add =      mon_bus_add,
-       .bus_remove =   mon_bus_remove,
 };
 
 /*
        }
        // MOD_INC_USE_COUNT(which_module?);
 
+       usb_register_notify(&mon_nb);
+
        down(&usb_bus_list_lock);
        list_for_each_entry (ubus, &usb_bus_list, bus_list) {
                mon_bus_init(mondir, ubus);
        struct mon_bus *mbus;
        struct list_head *p;
 
+       usb_unregister_notify(&mon_nb);
        usb_mon_deregister();
 
        down(&mon_lock);