driver.c (9cba26e66d09bf394ae5a739627a1dc8b7cae6f4) driver.c (e6bbcef0211ed75db1ca3017551a584aed4e00be)
1/*
2 * drivers/usb/driver.c - most of the driver model stuff for usb
3 *
4 * (C) Copyright 2005 Greg Kroah-Hartman <gregkh@suse.de>
5 *
6 * based on drivers/usb/usb.c which had the following copyrights:
7 * (C) Copyright Linus Torvalds 1999
8 * (C) Copyright Johannes Erdfelt 1999-2001

--- 65 unchanged lines hidden (view full) ---

74 retval = driver_attach(driver);
75
76 if (retval)
77 return retval;
78 return count;
79}
80EXPORT_SYMBOL_GPL(usb_store_new_id);
81
1/*
2 * drivers/usb/driver.c - most of the driver model stuff for usb
3 *
4 * (C) Copyright 2005 Greg Kroah-Hartman <gregkh@suse.de>
5 *
6 * based on drivers/usb/usb.c which had the following copyrights:
7 * (C) Copyright Linus Torvalds 1999
8 * (C) Copyright Johannes Erdfelt 1999-2001

--- 65 unchanged lines hidden (view full) ---

74 retval = driver_attach(driver);
75
76 if (retval)
77 return retval;
78 return count;
79}
80EXPORT_SYMBOL_GPL(usb_store_new_id);
81
82static ssize_t show_dynids(struct device_driver *driver, char *buf)
83{
84 struct usb_dynid *dynid;
85 struct usb_driver *usb_drv = to_usb_driver(driver);
86 size_t count = 0;
87
88 list_for_each_entry(dynid, &usb_drv->dynids.list, node)
89 if (dynid->id.bInterfaceClass != 0)
90 count += scnprintf(&buf[count], PAGE_SIZE - count, "%04x %04x %02x\n",
91 dynid->id.idVendor, dynid->id.idProduct,
92 dynid->id.bInterfaceClass);
93 else
94 count += scnprintf(&buf[count], PAGE_SIZE - count, "%04x %04x\n",
95 dynid->id.idVendor, dynid->id.idProduct);
96 return count;
97}
98
82static ssize_t store_new_id(struct device_driver *driver,
83 const char *buf, size_t count)
84{
85 struct usb_driver *usb_drv = to_usb_driver(driver);
86
87 return usb_store_new_id(&usb_drv->dynids, driver, buf, count);
88}
99static ssize_t store_new_id(struct device_driver *driver,
100 const char *buf, size_t count)
101{
102 struct usb_driver *usb_drv = to_usb_driver(driver);
103
104 return usb_store_new_id(&usb_drv->dynids, driver, buf, count);
105}
89static DRIVER_ATTR(new_id, S_IWUSR, NULL, store_new_id);
106static DRIVER_ATTR(new_id, S_IRUGO | S_IWUSR, show_dynids, store_new_id);
90
91/**
92 * store_remove_id - remove a USB device ID from this driver
93 * @driver: target device driver
94 * @buf: buffer for scanning device ID data
95 * @count: input size
96 *
97 * Removes a dynamic usb device ID from this driver.

--- 24 unchanged lines hidden (view full) ---

122 }
123 }
124 spin_unlock(&usb_driver->dynids.lock);
125
126 if (retval)
127 return retval;
128 return count;
129}
107
108/**
109 * store_remove_id - remove a USB device ID from this driver
110 * @driver: target device driver
111 * @buf: buffer for scanning device ID data
112 * @count: input size
113 *
114 * Removes a dynamic usb device ID from this driver.

--- 24 unchanged lines hidden (view full) ---

139 }
140 }
141 spin_unlock(&usb_driver->dynids.lock);
142
143 if (retval)
144 return retval;
145 return count;
146}
130static DRIVER_ATTR(remove_id, S_IWUSR, NULL, store_remove_id);
147static DRIVER_ATTR(remove_id, S_IRUGO | S_IWUSR, show_dynids, store_remove_id);
131
132static int usb_create_newid_files(struct usb_driver *usb_drv)
133{
134 int error = 0;
135
136 if (usb_drv->no_dynamic_id)
137 goto exit;
138

--- 582 unchanged lines hidden (view full) ---

721 pr_debug("usb %s: already deleted?\n", dev_name(dev));
722 return -ENODEV;
723 }
724 if (!usb_dev->bus) {
725 pr_debug("usb %s: bus removed?\n", dev_name(dev));
726 return -ENODEV;
727 }
728
148
149static int usb_create_newid_files(struct usb_driver *usb_drv)
150{
151 int error = 0;
152
153 if (usb_drv->no_dynamic_id)
154 goto exit;
155

--- 582 unchanged lines hidden (view full) ---

738 pr_debug("usb %s: already deleted?\n", dev_name(dev));
739 return -ENODEV;
740 }
741 if (!usb_dev->bus) {
742 pr_debug("usb %s: bus removed?\n", dev_name(dev));
743 return -ENODEV;
744 }
745
729#ifdef CONFIG_USB_DEVICEFS
730 /* If this is available, userspace programs can directly read
731 * all the device descriptors we don't tell them about. Or
732 * act as usermode drivers.
733 */
734 if (add_uevent_var(env, "DEVICE=/proc/bus/usb/%03d/%03d",
735 usb_dev->bus->busnum, usb_dev->devnum))
736 return -ENOMEM;
737#endif
738
739 /* per-device configurations are common */
740 if (add_uevent_var(env, "PRODUCT=%x/%x/%x",
741 le16_to_cpu(usb_dev->descriptor.idVendor),
742 le16_to_cpu(usb_dev->descriptor.idProduct),
743 le16_to_cpu(usb_dev->descriptor.bcdDevice)))
744 return -ENOMEM;
745
746 /* class-based driver binding models */

--- 36 unchanged lines hidden (view full) ---

783 new_udriver->drvwrap.driver.name = (char *) new_udriver->name;
784 new_udriver->drvwrap.driver.bus = &usb_bus_type;
785 new_udriver->drvwrap.driver.probe = usb_probe_device;
786 new_udriver->drvwrap.driver.remove = usb_unbind_device;
787 new_udriver->drvwrap.driver.owner = owner;
788
789 retval = driver_register(&new_udriver->drvwrap.driver);
790
746 /* per-device configurations are common */
747 if (add_uevent_var(env, "PRODUCT=%x/%x/%x",
748 le16_to_cpu(usb_dev->descriptor.idVendor),
749 le16_to_cpu(usb_dev->descriptor.idProduct),
750 le16_to_cpu(usb_dev->descriptor.bcdDevice)))
751 return -ENOMEM;
752
753 /* class-based driver binding models */

--- 36 unchanged lines hidden (view full) ---

790 new_udriver->drvwrap.driver.name = (char *) new_udriver->name;
791 new_udriver->drvwrap.driver.bus = &usb_bus_type;
792 new_udriver->drvwrap.driver.probe = usb_probe_device;
793 new_udriver->drvwrap.driver.remove = usb_unbind_device;
794 new_udriver->drvwrap.driver.owner = owner;
795
796 retval = driver_register(&new_udriver->drvwrap.driver);
797
791 if (!retval) {
798 if (!retval)
792 pr_info("%s: registered new device driver %s\n",
793 usbcore_name, new_udriver->name);
799 pr_info("%s: registered new device driver %s\n",
800 usbcore_name, new_udriver->name);
794 usbfs_update_special();
795 } else {
801 else
796 printk(KERN_ERR "%s: error %d registering device "
797 " driver %s\n",
798 usbcore_name, retval, new_udriver->name);
802 printk(KERN_ERR "%s: error %d registering device "
803 " driver %s\n",
804 usbcore_name, retval, new_udriver->name);
799 }
800
801 return retval;
802}
803EXPORT_SYMBOL_GPL(usb_register_device_driver);
804
805/**
806 * usb_deregister_device_driver - unregister a USB device (not interface) driver
807 * @udriver: USB operations of the device driver to unregister
808 * Context: must be able to sleep
809 *
810 * Unlinks the specified driver from the internal USB driver list.
811 */
812void usb_deregister_device_driver(struct usb_device_driver *udriver)
813{
814 pr_info("%s: deregistering device driver %s\n",
815 usbcore_name, udriver->name);
816
817 driver_unregister(&udriver->drvwrap.driver);
805
806 return retval;
807}
808EXPORT_SYMBOL_GPL(usb_register_device_driver);
809
810/**
811 * usb_deregister_device_driver - unregister a USB device (not interface) driver
812 * @udriver: USB operations of the device driver to unregister
813 * Context: must be able to sleep
814 *
815 * Unlinks the specified driver from the internal USB driver list.
816 */
817void usb_deregister_device_driver(struct usb_device_driver *udriver)
818{
819 pr_info("%s: deregistering device driver %s\n",
820 usbcore_name, udriver->name);
821
822 driver_unregister(&udriver->drvwrap.driver);
818 usbfs_update_special();
819}
820EXPORT_SYMBOL_GPL(usb_deregister_device_driver);
821
822/**
823 * usb_register_driver - register a USB interface driver
824 * @new_driver: USB operations for the interface driver
825 * @owner: module owner of this driver.
826 * @mod_name: module name string

--- 24 unchanged lines hidden (view full) ---

851 new_driver->drvwrap.driver.mod_name = mod_name;
852 spin_lock_init(&new_driver->dynids.lock);
853 INIT_LIST_HEAD(&new_driver->dynids.list);
854
855 retval = driver_register(&new_driver->drvwrap.driver);
856 if (retval)
857 goto out;
858
823}
824EXPORT_SYMBOL_GPL(usb_deregister_device_driver);
825
826/**
827 * usb_register_driver - register a USB interface driver
828 * @new_driver: USB operations for the interface driver
829 * @owner: module owner of this driver.
830 * @mod_name: module name string

--- 24 unchanged lines hidden (view full) ---

855 new_driver->drvwrap.driver.mod_name = mod_name;
856 spin_lock_init(&new_driver->dynids.lock);
857 INIT_LIST_HEAD(&new_driver->dynids.list);
858
859 retval = driver_register(&new_driver->drvwrap.driver);
860 if (retval)
861 goto out;
862
859 usbfs_update_special();
860
861 retval = usb_create_newid_files(new_driver);
862 if (retval)
863 goto out_newid;
864
865 pr_info("%s: registered new interface driver %s\n",
866 usbcore_name, new_driver->name);
867
868out:

--- 23 unchanged lines hidden (view full) ---

892void usb_deregister(struct usb_driver *driver)
893{
894 pr_info("%s: deregistering interface driver %s\n",
895 usbcore_name, driver->name);
896
897 usb_remove_newid_files(driver);
898 driver_unregister(&driver->drvwrap.driver);
899 usb_free_dynids(driver);
863 retval = usb_create_newid_files(new_driver);
864 if (retval)
865 goto out_newid;
866
867 pr_info("%s: registered new interface driver %s\n",
868 usbcore_name, new_driver->name);
869
870out:

--- 23 unchanged lines hidden (view full) ---

894void usb_deregister(struct usb_driver *driver)
895{
896 pr_info("%s: deregistering interface driver %s\n",
897 usbcore_name, driver->name);
898
899 usb_remove_newid_files(driver);
900 driver_unregister(&driver->drvwrap.driver);
901 usb_free_dynids(driver);
900
901 usbfs_update_special();
902}
903EXPORT_SYMBOL_GPL(usb_deregister);
904
905/* Forced unbinding of a USB interface driver, either because
906 * it doesn't support pre_reset/post_reset/reset_resume or
907 * because it doesn't support suspend/resume.
908 *
909 * The caller must hold @intf's device's lock, but not its pm_mutex

--- 828 unchanged lines hidden ---
902}
903EXPORT_SYMBOL_GPL(usb_deregister);
904
905/* Forced unbinding of a USB interface driver, either because
906 * it doesn't support pre_reset/post_reset/reset_resume or
907 * because it doesn't support suspend/resume.
908 *
909 * The caller must hold @intf's device's lock, but not its pm_mutex

--- 828 unchanged lines hidden ---