Home | History | Annotate | Download | only in linux
      1 /*
      2  * device.h - generic, centralized driver model
      3  *
      4  * Copyright (c) 2001-2003 Patrick Mochel <mochel (at) osdl.org>
      5  *
      6  * This file is released under the GPLv2
      7  *
      8  * See Documentation/driver-model/ for more information.
      9  */
     10 
     11 #ifndef _DEVICE_H_
     12 #define _DEVICE_H_
     13 
     14 #include <linux/ioport.h>
     15 #include <linux/kobject.h>
     16 #include <linux/klist.h>
     17 #include <linux/list.h>
     18 #include <linux/types.h>
     19 #include <linux/module.h>
     20 #include <linux/pm.h>
     21 #include <asm/semaphore.h>
     22 #include <asm/atomic.h>
     23 
     24 #define DEVICE_NAME_SIZE	50
     25 #define DEVICE_NAME_HALF	__stringify(20)	/* Less than half to accommodate slop */
     26 #define DEVICE_ID_SIZE		32
     27 #define BUS_ID_SIZE		KOBJ_NAME_LEN
     28 
     29 
     30 struct device;
     31 struct device_driver;
     32 struct class;
     33 struct class_device;
     34 
     35 struct bus_type {
     36 	const char		* name;
     37 
     38 	struct subsystem	subsys;
     39 	struct kset		drivers;
     40 	struct kset		devices;
     41 	struct klist		klist_devices;
     42 	struct klist		klist_drivers;
     43 
     44 	struct bus_attribute	* bus_attrs;
     45 	struct device_attribute	* dev_attrs;
     46 	struct driver_attribute	* drv_attrs;
     47 
     48 	int		(*match)(struct device * dev, struct device_driver * drv);
     49 	int		(*uevent)(struct device *dev, char **envp,
     50 				  int num_envp, char *buffer, int buffer_size);
     51 	int		(*probe)(struct device * dev);
     52 	int		(*remove)(struct device * dev);
     53 	void		(*shutdown)(struct device * dev);
     54 	int		(*suspend)(struct device * dev, pm_message_t state);
     55 	int		(*resume)(struct device * dev);
     56 };
     57 
     58 extern int bus_register(struct bus_type * bus);
     59 extern void bus_unregister(struct bus_type * bus);
     60 
     61 extern void bus_rescan_devices(struct bus_type * bus);
     62 
     63 /* iterator helpers for buses */
     64 
     65 int bus_for_each_dev(struct bus_type * bus, struct device * start, void * data,
     66 		     int (*fn)(struct device *, void *));
     67 struct device * bus_find_device(struct bus_type *bus, struct device *start,
     68 				void *data, int (*match)(struct device *, void *));
     69 
     70 int bus_for_each_drv(struct bus_type * bus, struct device_driver * start,
     71 		     void * data, int (*fn)(struct device_driver *, void *));
     72 
     73 
     74 /* driverfs interface for exporting bus attributes */
     75 
     76 struct bus_attribute {
     77 	struct attribute	attr;
     78 	ssize_t (*show)(struct bus_type *, char * buf);
     79 	ssize_t (*store)(struct bus_type *, const char * buf, size_t count);
     80 };
     81 
     82 #define BUS_ATTR(_name,_mode,_show,_store)	\
     83 struct bus_attribute bus_attr_##_name = __ATTR(_name,_mode,_show,_store)
     84 
     85 extern int bus_create_file(struct bus_type *, struct bus_attribute *);
     86 extern void bus_remove_file(struct bus_type *, struct bus_attribute *);
     87 
     88 struct device_driver {
     89 	const char		* name;
     90 	struct bus_type		* bus;
     91 
     92 	struct completion	unloaded;
     93 	struct kobject		kobj;
     94 	struct klist		klist_devices;
     95 	struct klist_node	knode_bus;
     96 
     97 	struct module		* owner;
     98 
     99 	int	(*probe)	(struct device * dev);
    100 	int	(*remove)	(struct device * dev);
    101 	void	(*shutdown)	(struct device * dev);
    102 	int	(*suspend)	(struct device * dev, pm_message_t state);
    103 	int	(*resume)	(struct device * dev);
    104 };
    105 
    106 
    107 extern int driver_register(struct device_driver * drv);
    108 extern void driver_unregister(struct device_driver * drv);
    109 
    110 extern struct device_driver * get_driver(struct device_driver * drv);
    111 extern void put_driver(struct device_driver * drv);
    112 extern struct device_driver *driver_find(const char *name, struct bus_type *bus);
    113 
    114 
    115 /* driverfs interface for exporting driver attributes */
    116 
    117 struct driver_attribute {
    118 	struct attribute	attr;
    119 	ssize_t (*show)(struct device_driver *, char * buf);
    120 	ssize_t (*store)(struct device_driver *, const char * buf, size_t count);
    121 };
    122 
    123 #define DRIVER_ATTR(_name,_mode,_show,_store)	\
    124 struct driver_attribute driver_attr_##_name = __ATTR(_name,_mode,_show,_store)
    125 
    126 extern int driver_create_file(struct device_driver *, struct driver_attribute *);
    127 extern void driver_remove_file(struct device_driver *, struct driver_attribute *);
    128 
    129 extern int driver_for_each_device(struct device_driver * drv, struct device * start,
    130 				  void * data, int (*fn)(struct device *, void *));
    131 struct device * driver_find_device(struct device_driver *drv,
    132 				   struct device *start, void *data,
    133 				   int (*match)(struct device *, void *));
    134 
    135 
    136 /*
    137  * device classes
    138  */
    139 struct class {
    140 	const char		* name;
    141 	struct module		* owner;
    142 
    143 	struct subsystem	subsys;
    144 	struct list_head	children;
    145 	struct list_head	devices;
    146 	struct list_head	interfaces;
    147 	struct semaphore	sem;	/* locks both the children and interfaces lists */
    148 
    149 	struct class_attribute		* class_attrs;
    150 	struct class_device_attribute	* class_dev_attrs;
    151 
    152 	int	(*uevent)(struct class_device *dev, char **envp,
    153 			   int num_envp, char *buffer, int buffer_size);
    154 
    155 	void	(*release)(struct class_device *dev);
    156 	void	(*class_release)(struct class *class);
    157 };
    158 
    159 extern int class_register(struct class *);
    160 extern void class_unregister(struct class *);
    161 
    162 
    163 struct class_attribute {
    164 	struct attribute	attr;
    165 	ssize_t (*show)(struct class *, char * buf);
    166 	ssize_t (*store)(struct class *, const char * buf, size_t count);
    167 };
    168 
    169 #define CLASS_ATTR(_name,_mode,_show,_store)			\
    170 struct class_attribute class_attr_##_name = __ATTR(_name,_mode,_show,_store)
    171 
    172 extern int class_create_file(struct class *, const struct class_attribute *);
    173 extern void class_remove_file(struct class *, const struct class_attribute *);
    174 
    175 struct class_device_attribute {
    176 	struct attribute	attr;
    177 	ssize_t (*show)(struct class_device *, char * buf);
    178 	ssize_t (*store)(struct class_device *, const char * buf, size_t count);
    179 };
    180 
    181 #define CLASS_DEVICE_ATTR(_name,_mode,_show,_store)		\
    182 struct class_device_attribute class_device_attr_##_name = 	\
    183 	__ATTR(_name,_mode,_show,_store)
    184 
    185 extern int class_device_create_file(struct class_device *,
    186 				    const struct class_device_attribute *);
    187 
    188 /**
    189  * struct class_device - class devices
    190  * @class: pointer to the parent class for this class device.  This is required.
    191  * @devt: for internal use by the driver core only.
    192  * @node: for internal use by the driver core only.
    193  * @kobj: for internal use by the driver core only.
    194  * @devt_attr: for internal use by the driver core only.
    195  * @groups: optional additional groups to be created
    196  * @dev: if set, a symlink to the struct device is created in the sysfs
    197  * directory for this struct class device.
    198  * @class_data: pointer to whatever you want to store here for this struct
    199  * class_device.  Use class_get_devdata() and class_set_devdata() to get and
    200  * set this pointer.
    201  * @parent: pointer to a struct class_device that is the parent of this struct
    202  * class_device.  If NULL, this class_device will show up at the root of the
    203  * struct class in sysfs (which is probably what you want to have happen.)
    204  * @release: pointer to a release function for this struct class_device.  If
    205  * set, this will be called instead of the class specific release function.
    206  * Only use this if you want to override the default release function, like
    207  * when you are nesting class_device structures.
    208  * @uevent: pointer to a uevent function for this struct class_device.  If
    209  * set, this will be called instead of the class specific uevent function.
    210  * Only use this if you want to override the default uevent function, like
    211  * when you are nesting class_device structures.
    212  */
    213 struct class_device {
    214 	struct list_head	node;
    215 
    216 	struct kobject		kobj;
    217 	struct class		* class;	/* required */
    218 	dev_t			devt;		/* dev_t, creates the sysfs "dev" */
    219 	struct class_device_attribute *devt_attr;
    220 	struct class_device_attribute uevent_attr;
    221 	struct device		* dev;		/* not necessary, but nice to have */
    222 	void			* class_data;	/* class-specific data */
    223 	struct class_device	*parent;	/* parent of this child device, if there is one */
    224 	struct attribute_group  ** groups;	/* optional groups */
    225 
    226 	void	(*release)(struct class_device *dev);
    227 	int	(*uevent)(struct class_device *dev, char **envp,
    228 			   int num_envp, char *buffer, int buffer_size);
    229 	char	class_id[BUS_ID_SIZE];	/* unique to this class */
    230 };
    231 
    232 static inline void *
    233 class_get_devdata (struct class_device *dev)
    234 {
    235 	return dev->class_data;
    236 }
    237 
    238 static inline void
    239 class_set_devdata (struct class_device *dev, void *data)
    240 {
    241 	dev->class_data = data;
    242 }
    243 
    244 
    245 extern int class_device_register(struct class_device *);
    246 extern void class_device_unregister(struct class_device *);
    247 extern void class_device_initialize(struct class_device *);
    248 extern int class_device_add(struct class_device *);
    249 extern void class_device_del(struct class_device *);
    250 
    251 extern int class_device_rename(struct class_device *, char *);
    252 
    253 extern struct class_device * class_device_get(struct class_device *);
    254 extern void class_device_put(struct class_device *);
    255 
    256 extern void class_device_remove_file(struct class_device *,
    257 				     const struct class_device_attribute *);
    258 extern int class_device_create_bin_file(struct class_device *,
    259 					struct bin_attribute *);
    260 extern void class_device_remove_bin_file(struct class_device *,
    261 					 struct bin_attribute *);
    262 
    263 struct class_interface {
    264 	struct list_head	node;
    265 	struct class		*class;
    266 
    267 	int (*add)	(struct class_device *, struct class_interface *);
    268 	void (*remove)	(struct class_device *, struct class_interface *);
    269 };
    270 
    271 extern int class_interface_register(struct class_interface *);
    272 extern void class_interface_unregister(struct class_interface *);
    273 
    274 extern struct class *class_create(struct module *owner, char *name);
    275 extern void class_destroy(struct class *cls);
    276 extern struct class_device *class_device_create(struct class *cls,
    277 						struct class_device *parent,
    278 						dev_t devt,
    279 						struct device *device,
    280 						char *fmt, ...)
    281 					__attribute__((format(printf,5,6)));
    282 extern void class_device_destroy(struct class *cls, dev_t devt);
    283 
    284 
    285 /* interface for exporting device attributes */
    286 struct device_attribute {
    287 	struct attribute	attr;
    288 	ssize_t (*show)(struct device *dev, struct device_attribute *attr,
    289 			char *buf);
    290 	ssize_t (*store)(struct device *dev, struct device_attribute *attr,
    291 			 const char *buf, size_t count);
    292 };
    293 
    294 #define DEVICE_ATTR(_name,_mode,_show,_store) \
    295 struct device_attribute dev_attr_##_name = __ATTR(_name,_mode,_show,_store)
    296 
    297 extern int device_create_file(struct device *device, struct device_attribute * entry);
    298 extern void device_remove_file(struct device * dev, struct device_attribute * attr);
    299 struct device {
    300 	struct klist		klist_children;
    301 	struct klist_node	knode_parent;		/* node in sibling list */
    302 	struct klist_node	knode_driver;
    303 	struct klist_node	knode_bus;
    304 	struct device 	* parent;
    305 
    306 	struct kobject kobj;
    307 	char	bus_id[BUS_ID_SIZE];	/* position on parent bus */
    308 	struct device_attribute uevent_attr;
    309 	struct device_attribute *devt_attr;
    310 
    311 	struct semaphore	sem;	/* semaphore to synchronize calls to
    312 					 * its driver.
    313 					 */
    314 
    315 	struct bus_type	* bus;		/* type of bus device is on */
    316 	struct device_driver *driver;	/* which driver has allocated this
    317 					   device */
    318 	void		*driver_data;	/* data private to the driver */
    319 	void		*platform_data;	/* Platform specific data, device
    320 					   core doesn't touch it */
    321 	void		*firmware_data; /* Firmware specific data (e.g. ACPI,
    322 					   BIOS data),reserved for device core*/
    323 	struct dev_pm_info	power;
    324 
    325 	u64		*dma_mask;	/* dma mask (if dma'able device) */
    326 	u64		coherent_dma_mask;/* Like dma_mask, but for
    327 					     alloc_coherent mappings as
    328 					     not all hardware supports
    329 					     64 bit addresses for consistent
    330 					     allocations such descriptors. */
    331 
    332 	struct list_head	dma_pools;	/* dma pools (if dma'ble) */
    333 
    334 	struct dma_coherent_mem	*dma_mem; /* internal for coherent mem
    335 					     override */
    336 
    337 	/* class_device migration path */
    338 	struct list_head	node;
    339 	struct class		*class;		/* optional*/
    340 	dev_t			devt;		/* dev_t, creates the sysfs "dev" */
    341 
    342 	void	(*release)(struct device * dev);
    343 };
    344 
    345 static inline void *
    346 dev_get_drvdata (struct device *dev)
    347 {
    348 	return dev->driver_data;
    349 }
    350 
    351 static inline void
    352 dev_set_drvdata (struct device *dev, void *data)
    353 {
    354 	dev->driver_data = data;
    355 }
    356 
    357 static inline int device_is_registered(struct device *dev)
    358 {
    359 	return klist_node_attached(&dev->knode_bus);
    360 }
    361 
    362 /*
    363  * High level routines for use by the bus drivers
    364  */
    365 extern int device_register(struct device * dev);
    366 extern void device_unregister(struct device * dev);
    367 extern void device_initialize(struct device * dev);
    368 extern int device_add(struct device * dev);
    369 extern void device_del(struct device * dev);
    370 extern int device_for_each_child(struct device *, void *,
    371 		     int (*fn)(struct device *, void *));
    372 
    373 /*
    374  * Manual binding of a device to driver. See drivers/base/bus.c
    375  * for information on use.
    376  */
    377 extern void device_bind_driver(struct device * dev);
    378 extern void device_release_driver(struct device * dev);
    379 extern int  device_attach(struct device * dev);
    380 extern void driver_attach(struct device_driver * drv);
    381 extern void device_reprobe(struct device *dev);
    382 
    383 /*
    384  * Easy functions for dynamically creating devices on the fly
    385  */
    386 extern struct device *device_create(struct class *cls, struct device *parent,
    387 				    dev_t devt, char *fmt, ...)
    388 				    __attribute__((format(printf,4,5)));
    389 extern void device_destroy(struct class *cls, dev_t devt);
    390 
    391 /*
    392  * Platform "fixup" functions - allow the platform to have their say
    393  * about devices and actions that the general device layer doesn't
    394  * know about.
    395  */
    396 /* Notify platform of device discovery */
    397 extern int (*platform_notify)(struct device * dev);
    398 
    399 extern int (*platform_notify_remove)(struct device * dev);
    400 
    401 
    402 /**
    403  * get_device - atomically increment the reference count for the device.
    404  *
    405  */
    406 extern struct device * get_device(struct device * dev);
    407 extern void put_device(struct device * dev);
    408 
    409 
    410 /* drivers/base/power/shutdown.c */
    411 extern void device_shutdown(void);
    412 
    413 
    414 /* drivers/base/firmware.c */
    415 extern int firmware_register(struct subsystem *);
    416 extern void firmware_unregister(struct subsystem *);
    417 
    418 /* debugging and troubleshooting/diagnostic helpers. */
    419 extern const char *dev_driver_string(struct device *dev);
    420 #define dev_printk(level, dev, format, arg...)	\
    421 	printk(level "%s %s: " format , dev_driver_string(dev) , (dev)->bus_id , ## arg)
    422 
    423 #ifdef DEBUG
    424 #define dev_dbg(dev, format, arg...)		\
    425 	dev_printk(KERN_DEBUG , dev , format , ## arg)
    426 #else
    427 #define dev_dbg(dev, format, arg...) do { (void)(dev); } while (0)
    428 #endif
    429 
    430 #define dev_err(dev, format, arg...)		\
    431 	dev_printk(KERN_ERR , dev , format , ## arg)
    432 #define dev_info(dev, format, arg...)		\
    433 	dev_printk(KERN_INFO , dev , format , ## arg)
    434 #define dev_warn(dev, format, arg...)		\
    435 	dev_printk(KERN_WARNING , dev , format , ## arg)
    436 #define dev_notice(dev, format, arg...)		\
    437 	dev_printk(KERN_NOTICE , dev , format , ## arg)
    438 
    439 /* Create alias, so I can be autoloaded. */
    440 #define MODULE_ALIAS_CHARDEV(major,minor) \
    441 	MODULE_ALIAS("char-major-" __stringify(major) "-" __stringify(minor))
    442 #define MODULE_ALIAS_CHARDEV_MAJOR(major) \
    443 	MODULE_ALIAS("char-major-" __stringify(major) "-*")
    444 #endif /* _DEVICE_H_ */
    445