diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2006-07-01 22:08:49 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-09-27 14:58:50 -0400 |
commit | 8bb54ab573ecd1b4fe2ed66416a8d99a86e65316 (patch) | |
tree | 36df75387a62923e3bd152f3c2ce16147be1828c /include/linux/usb.h | |
parent | 36e56a34586783c7986ce09d39db80b27c95ce24 (diff) |
usbcore: add usb_device_driver definition
This patch (as732) adds a usb_device_driver structure, for representing
drivers that manage an entire USB device as opposed to just an
interface. Support routines like usb_register_device_driver,
usb_deregister_device_driver, usb_probe_device, and usb_unbind_device
are also added.
Unlike an earlier version of this patch, the new code is type-safe. To
accomplish this, the existing struct driver embedded in struct
usb_driver had to be wrapped in an intermediate wrapper. This enables
the core to tell at runtime whether a particular struct driver belongs
to a device driver or to an interface driver.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'include/linux/usb.h')
-rw-r--r-- | include/linux/usb.h | 58 |
1 files changed, 51 insertions, 7 deletions
diff --git a/include/linux/usb.h b/include/linux/usb.h index d2bd0c8e0154..b4ccce6d0982 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
@@ -540,7 +540,17 @@ struct usb_dynids { | |||
540 | }; | 540 | }; |
541 | 541 | ||
542 | /** | 542 | /** |
543 | * struct usb_driver - identifies USB driver to usbcore | 543 | * struct usbdrv_wrap - wrapper for driver-model structure |
544 | * @driver: The driver-model core driver structure. | ||
545 | * @for_devices: Non-zero for device drivers, 0 for interface drivers. | ||
546 | */ | ||
547 | struct usbdrv_wrap { | ||
548 | struct device_driver driver; | ||
549 | int for_devices; | ||
550 | }; | ||
551 | |||
552 | /** | ||
553 | * struct usb_driver - identifies USB interface driver to usbcore | ||
544 | * @name: The driver name should be unique among USB drivers, | 554 | * @name: The driver name should be unique among USB drivers, |
545 | * and should normally be the same as the module name. | 555 | * and should normally be the same as the module name. |
546 | * @probe: Called to see if the driver is willing to manage a particular | 556 | * @probe: Called to see if the driver is willing to manage a particular |
@@ -567,12 +577,12 @@ struct usb_dynids { | |||
567 | * or your driver's probe function will never get called. | 577 | * or your driver's probe function will never get called. |
568 | * @dynids: used internally to hold the list of dynamically added device | 578 | * @dynids: used internally to hold the list of dynamically added device |
569 | * ids for this driver. | 579 | * ids for this driver. |
570 | * @driver: the driver model core driver structure. | 580 | * @drvwrap: Driver-model core structure wrapper. |
571 | * @no_dynamic_id: if set to 1, the USB core will not allow dynamic ids to be | 581 | * @no_dynamic_id: if set to 1, the USB core will not allow dynamic ids to be |
572 | * added to this driver by preventing the sysfs file from being created. | 582 | * added to this driver by preventing the sysfs file from being created. |
573 | * | 583 | * |
574 | * USB drivers must provide a name, probe() and disconnect() methods, | 584 | * USB interface drivers must provide a name, probe() and disconnect() |
575 | * and an id_table. Other driver fields are optional. | 585 | * methods, and an id_table. Other driver fields are optional. |
576 | * | 586 | * |
577 | * The id_table is used in hotplugging. It holds a set of descriptors, | 587 | * The id_table is used in hotplugging. It holds a set of descriptors, |
578 | * and specialized data may be associated with each entry. That table | 588 | * and specialized data may be associated with each entry. That table |
@@ -606,10 +616,40 @@ struct usb_driver { | |||
606 | const struct usb_device_id *id_table; | 616 | const struct usb_device_id *id_table; |
607 | 617 | ||
608 | struct usb_dynids dynids; | 618 | struct usb_dynids dynids; |
609 | struct device_driver driver; | 619 | struct usbdrv_wrap drvwrap; |
610 | unsigned int no_dynamic_id:1; | 620 | unsigned int no_dynamic_id:1; |
611 | }; | 621 | }; |
612 | #define to_usb_driver(d) container_of(d, struct usb_driver, driver) | 622 | #define to_usb_driver(d) container_of(d, struct usb_driver, drvwrap.driver) |
623 | |||
624 | /** | ||
625 | * struct usb_device_driver - identifies USB device driver to usbcore | ||
626 | * @name: The driver name should be unique among USB drivers, | ||
627 | * and should normally be the same as the module name. | ||
628 | * @probe: Called to see if the driver is willing to manage a particular | ||
629 | * device. If it is, probe returns zero and uses dev_set_drvdata() | ||
630 | * to associate driver-specific data with the device. If unwilling | ||
631 | * to manage the device, return a negative errno value. | ||
632 | * @disconnect: Called when the device is no longer accessible, usually | ||
633 | * because it has been (or is being) disconnected or the driver's | ||
634 | * module is being unloaded. | ||
635 | * @suspend: Called when the device is going to be suspended by the system. | ||
636 | * @resume: Called when the device is being resumed by the system. | ||
637 | * @drvwrap: Driver-model core structure wrapper. | ||
638 | * | ||
639 | * USB drivers must provide all the fields listed above except drvwrap. | ||
640 | */ | ||
641 | struct usb_device_driver { | ||
642 | const char *name; | ||
643 | |||
644 | int (*probe) (struct usb_device *udev); | ||
645 | void (*disconnect) (struct usb_device *udev); | ||
646 | |||
647 | int (*suspend) (struct usb_device *udev, pm_message_t message); | ||
648 | int (*resume) (struct usb_device *udev); | ||
649 | struct usbdrv_wrap drvwrap; | ||
650 | }; | ||
651 | #define to_usb_device_driver(d) container_of(d, struct usb_device_driver, \ | ||
652 | drvwrap.driver) | ||
613 | 653 | ||
614 | extern struct bus_type usb_bus_type; | 654 | extern struct bus_type usb_bus_type; |
615 | 655 | ||
@@ -633,13 +673,17 @@ struct usb_class_driver { | |||
633 | * use these in module_init()/module_exit() | 673 | * use these in module_init()/module_exit() |
634 | * and don't forget MODULE_DEVICE_TABLE(usb, ...) | 674 | * and don't forget MODULE_DEVICE_TABLE(usb, ...) |
635 | */ | 675 | */ |
636 | int usb_register_driver(struct usb_driver *, struct module *); | 676 | extern int usb_register_driver(struct usb_driver *, struct module *); |
637 | static inline int usb_register(struct usb_driver *driver) | 677 | static inline int usb_register(struct usb_driver *driver) |
638 | { | 678 | { |
639 | return usb_register_driver(driver, THIS_MODULE); | 679 | return usb_register_driver(driver, THIS_MODULE); |
640 | } | 680 | } |
641 | extern void usb_deregister(struct usb_driver *); | 681 | extern void usb_deregister(struct usb_driver *); |
642 | 682 | ||
683 | extern int usb_register_device_driver(struct usb_device_driver *, | ||
684 | struct module *); | ||
685 | extern void usb_deregister_device_driver(struct usb_device_driver *); | ||
686 | |||
643 | extern int usb_register_dev(struct usb_interface *intf, | 687 | extern int usb_register_dev(struct usb_interface *intf, |
644 | struct usb_class_driver *class_driver); | 688 | struct usb_class_driver *class_driver); |
645 | extern void usb_deregister_dev(struct usb_interface *intf, | 689 | extern void usb_deregister_dev(struct usb_interface *intf, |