home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / linux / sysdev.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  2.6 KB  |  96 lines

  1. /**
  2.  * System devices follow a slightly different driver model. 
  3.  * They don't need to do dynammic driver binding, can't be probed, 
  4.  * and don't reside on any type of peripheral bus. 
  5.  * So, we represent and treat them a little differently.
  6.  * 
  7.  * We still have a notion of a driver for a system device, because we still
  8.  * want to perform basic operations on these devices. 
  9.  *
  10.  * We also support auxillary drivers binding to devices of a certain class.
  11.  * 
  12.  * This allows configurable drivers to register themselves for devices of
  13.  * a certain type. And, it allows class definitions to reside in generic
  14.  * code while arch-specific code can register specific drivers.
  15.  *
  16.  * Auxillary drivers registered with a NULL cls are registered as drivers
  17.  * for all system devices, and get notification calls for each device. 
  18.  */
  19.  
  20.  
  21. #ifndef _SYSDEV_H_
  22. #define _SYSDEV_H_
  23.  
  24. #include <linux/kobject.h>
  25. #include <linux/pm.h>
  26.  
  27.  
  28. struct sys_device;
  29.  
  30. struct sysdev_class {
  31.     struct list_head    drivers;
  32.  
  33.     /* Default operations for these types of devices */
  34.     int    (*shutdown)(struct sys_device *);
  35.     int    (*suspend)(struct sys_device *, pm_message_t state);
  36.     int    (*resume)(struct sys_device *);
  37.     struct kset        kset;
  38. };
  39.  
  40.  
  41. extern int sysdev_class_register(struct sysdev_class *);
  42. extern void sysdev_class_unregister(struct sysdev_class *);
  43.  
  44.  
  45. /**
  46.  * Auxillary system device drivers.
  47.  */
  48.  
  49. struct sysdev_driver {
  50.     struct list_head    entry;
  51.     int    (*add)(struct sys_device *);
  52.     int    (*remove)(struct sys_device *);
  53.     int    (*shutdown)(struct sys_device *);
  54.     int    (*suspend)(struct sys_device *, pm_message_t state);
  55.     int    (*resume)(struct sys_device *);
  56. };
  57.  
  58.  
  59. extern int sysdev_driver_register(struct sysdev_class *, struct sysdev_driver *);
  60. extern void sysdev_driver_unregister(struct sysdev_class *, struct sysdev_driver *);
  61.  
  62.  
  63. /**
  64.  * sys_devices can be simplified a lot from regular devices, because they're
  65.  * simply not as versatile. 
  66.  */
  67.  
  68. struct sys_device {
  69.     u32        id;
  70.     struct sysdev_class    * cls;
  71.     struct kobject        kobj;
  72. };
  73.  
  74. extern int sysdev_register(struct sys_device *);
  75. extern void sysdev_unregister(struct sys_device *);
  76.  
  77.  
  78. struct sysdev_attribute { 
  79.     struct attribute    attr;
  80.     ssize_t (*show)(struct sys_device *, char *);
  81.     ssize_t (*store)(struct sys_device *, const char *, size_t);
  82. };
  83.  
  84.  
  85. #define SYSDEV_ATTR(_name,_mode,_show,_store)         \
  86. struct sysdev_attribute attr_##_name = {             \
  87.     .attr = {.name = __stringify(_name), .mode = _mode },    \
  88.     .show    = _show,                    \
  89.     .store    = _store,                    \
  90. };
  91.  
  92. extern int sysdev_create_file(struct sys_device *, struct sysdev_attribute *);
  93. extern void sysdev_remove_file(struct sys_device *, struct sysdev_attribute *);
  94.  
  95. #endif /* _SYSDEV_H_ */
  96.