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 --- |