[PATCH] USB: convert usbfs/devio.c to use usb notifiers

Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Greg Kroah-Hartman 2005-06-20 21:15:16 -07:00
parent 3099e75a7c
commit a7b986b3e1
3 changed files with 34 additions and 11 deletions

View File

@ -46,6 +46,7 @@
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/usbdevice_fs.h> #include <linux/usbdevice_fs.h>
#include <linux/cdev.h> #include <linux/cdev.h>
#include <linux/notifier.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
@ -1550,7 +1551,7 @@ struct file_operations usbfs_device_file_operations = {
.release = usbdev_release, .release = usbdev_release,
}; };
void usbdev_add(struct usb_device *dev) static void usbdev_add(struct usb_device *dev)
{ {
int minor = ((dev->bus->busnum-1) * 128) + (dev->devnum-1); int minor = ((dev->bus->busnum-1) * 128) + (dev->devnum-1);
@ -1561,11 +1562,29 @@ void usbdev_add(struct usb_device *dev)
dev->class_dev->class_data = dev; dev->class_dev->class_data = dev;
} }
void usbdev_remove(struct usb_device *dev) static void usbdev_remove(struct usb_device *dev)
{ {
class_device_unregister(dev->class_dev); class_device_unregister(dev->class_dev);
} }
static int usbdev_notify(struct notifier_block *self, unsigned long action,
void *dev)
{
switch (action) {
case USB_DEVICE_ADD:
usbdev_add(dev);
break;
case USB_DEVICE_REMOVE:
usbdev_remove(dev);
break;
}
return NOTIFY_OK;
}
static struct notifier_block usbdev_nb = {
.notifier_call = usbdev_notify,
};
static struct cdev usb_device_cdev = { static struct cdev usb_device_cdev = {
.kobj = {.name = "usb_device", }, .kobj = {.name = "usb_device", },
.owner = THIS_MODULE, .owner = THIS_MODULE,
@ -1585,24 +1604,32 @@ int __init usbdev_init(void)
retval = cdev_add(&usb_device_cdev, USB_DEVICE_DEV, USB_DEVICE_MAX); retval = cdev_add(&usb_device_cdev, USB_DEVICE_DEV, USB_DEVICE_MAX);
if (retval) { if (retval) {
err("unable to get usb_device major %d", USB_DEVICE_MAJOR); err("unable to get usb_device major %d", USB_DEVICE_MAJOR);
unregister_chrdev_region(USB_DEVICE_DEV, USB_DEVICE_MAX); goto error_cdev;
goto out;
} }
usb_device_class = class_create(THIS_MODULE, "usb_device"); usb_device_class = class_create(THIS_MODULE, "usb_device");
if (IS_ERR(usb_device_class)) { if (IS_ERR(usb_device_class)) {
err("unable to register usb_device class"); err("unable to register usb_device class");
retval = PTR_ERR(usb_device_class); retval = PTR_ERR(usb_device_class);
usb_device_class = NULL; goto error_class;
cdev_del(&usb_device_cdev);
unregister_chrdev_region(USB_DEVICE_DEV, USB_DEVICE_MAX);
} }
usb_register_notify(&usbdev_nb);
out: out:
return retval; return retval;
error_class:
usb_device_class = NULL;
cdev_del(&usb_device_cdev);
error_cdev:
unregister_chrdev_region(USB_DEVICE_DEV, USB_DEVICE_MAX);
goto out;
} }
void usbdev_cleanup(void) void usbdev_cleanup(void)
{ {
usb_unregister_notify(&usbdev_nb);
class_destroy(usb_device_class); class_destroy(usb_device_class);
cdev_del(&usb_device_cdev); cdev_del(&usb_device_cdev);
unregister_chrdev_region(USB_DEVICE_DEV, USB_DEVICE_MAX); unregister_chrdev_region(USB_DEVICE_DEV, USB_DEVICE_MAX);

View File

@ -1137,7 +1137,6 @@ void usb_disconnect(struct usb_device **pdev)
dev_dbg (&udev->dev, "unregistering device\n"); dev_dbg (&udev->dev, "unregistering device\n");
release_address(udev); release_address(udev);
usbfs_remove_device(udev); usbfs_remove_device(udev);
usbdev_remove(udev);
usb_remove_sysfs_dev_files(udev); usb_remove_sysfs_dev_files(udev);
/* Avoid races with recursively_mark_NOTATTACHED() */ /* Avoid races with recursively_mark_NOTATTACHED() */
@ -1376,7 +1375,6 @@ int usb_new_device(struct usb_device *udev)
usb_notify_add_device(udev); usb_notify_add_device(udev);
/* add a /proc/bus/usb entry */ /* add a /proc/bus/usb entry */
usbdev_add(udev);
usbfs_add_device(udev); usbfs_add_device(udev);
return 0; return 0;

View File

@ -62,8 +62,6 @@ extern void usbfs_conn_disc_event(void);
extern int usbdev_init(void); extern int usbdev_init(void);
extern void usbdev_cleanup(void); extern void usbdev_cleanup(void);
extern void usbdev_add(struct usb_device *dev);
extern void usbdev_remove(struct usb_device *dev);
struct dev_state { struct dev_state {
struct list_head list; /* state list */ struct list_head list; /* state list */