Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  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/module.h>
 26 #include <linux/pm.h>
 27 
 28 
 29 struct sys_device;
 30 
 31 struct sysdev_class {
 32         const char *name;
 33         struct list_head        drivers;
 34 
 35         /* Default operations for these types of devices */
 36         int     (*shutdown)(struct sys_device *);
 37         int     (*suspend)(struct sys_device *, pm_message_t state);
 38         int     (*resume)(struct sys_device *);
 39         struct kset             kset;
 40 };
 41 
 42 struct sysdev_class_attribute {
 43         struct attribute attr;
 44         ssize_t (*show)(struct sysdev_class *, char *);
 45         ssize_t (*store)(struct sysdev_class *, const char *, size_t);
 46 };
 47 
 48 #define SYSDEV_CLASS_ATTR(_name,_mode,_show,_store)             \
 49 struct sysdev_class_attribute attr_##_name = {                  \
 50         .attr = {.name = __stringify(_name), .mode = _mode },   \
 51         .show   = _show,                                        \
 52         .store  = _store,                                       \
 53 };
 54 
 55 
 56 extern int sysdev_class_register(struct sysdev_class *);
 57 extern void sysdev_class_unregister(struct sysdev_class *);
 58 
 59 extern int sysdev_class_create_file(struct sysdev_class *,
 60         struct sysdev_class_attribute *);
 61 extern void sysdev_class_remove_file(struct sysdev_class *,
 62         struct sysdev_class_attribute *);
 63 /**
 64  * Auxillary system device drivers.
 65  */
 66 
 67 struct sysdev_driver {
 68         struct list_head        entry;
 69         int     (*add)(struct sys_device *);
 70         int     (*remove)(struct sys_device *);
 71         int     (*shutdown)(struct sys_device *);
 72         int     (*suspend)(struct sys_device *, pm_message_t state);
 73         int     (*resume)(struct sys_device *);
 74 };
 75 
 76 
 77 extern int sysdev_driver_register(struct sysdev_class *, struct sysdev_driver *);
 78 extern void sysdev_driver_unregister(struct sysdev_class *, struct sysdev_driver *);
 79 
 80 
 81 /**
 82  * sys_devices can be simplified a lot from regular devices, because they're
 83  * simply not as versatile. 
 84  */
 85 
 86 struct sys_device {
 87         u32             id;
 88         struct sysdev_class     * cls;
 89         struct kobject          kobj;
 90 };
 91 
 92 extern int sysdev_register(struct sys_device *);
 93 extern void sysdev_unregister(struct sys_device *);
 94 
 95 
 96 struct sysdev_attribute { 
 97         struct attribute        attr;
 98         ssize_t (*show)(struct sys_device *, char *);
 99         ssize_t (*store)(struct sys_device *, const char *, size_t);
100 };
101 
102 
103 #define _SYSDEV_ATTR(_name,_mode,_show,_store)                  \
104 {                                                               \
105         .attr = { .name = __stringify(_name), .mode = _mode },  \
106         .show   = _show,                                        \
107         .store  = _store,                                       \
108 }
109 
110 #define SYSDEV_ATTR(_name,_mode,_show,_store)           \
111 struct sysdev_attribute attr_##_name = _SYSDEV_ATTR(_name,_mode,_show,_store);
112 
113 extern int sysdev_create_file(struct sys_device *, struct sysdev_attribute *);
114 extern void sysdev_remove_file(struct sys_device *, struct sysdev_attribute *);
115 
116 #endif /* _SYSDEV_H_ */
117 
  This page was automatically generated by the LXR engine.