at v2.6.21-rc5 573 lines 19 kB view raw
1/* 2 * device.h - generic, centralized driver model 3 * 4 * Copyright (c) 2001-2003 Patrick Mochel <mochel@osdl.org> 5 * Copyright (c) 2004-2007 Greg Kroah-Hartman <gregkh@suse.de> 6 * 7 * This file is released under the GPLv2 8 * 9 * See Documentation/driver-model/ for more information. 10 */ 11 12#ifndef _DEVICE_H_ 13#define _DEVICE_H_ 14 15#include <linux/ioport.h> 16#include <linux/kobject.h> 17#include <linux/klist.h> 18#include <linux/list.h> 19#include <linux/compiler.h> 20#include <linux/types.h> 21#include <linux/module.h> 22#include <linux/pm.h> 23#include <asm/semaphore.h> 24#include <asm/atomic.h> 25#include <asm/device.h> 26 27#define DEVICE_NAME_SIZE 50 28#define DEVICE_NAME_HALF __stringify(20) /* Less than half to accommodate slop */ 29#define DEVICE_ID_SIZE 32 30#define BUS_ID_SIZE KOBJ_NAME_LEN 31 32 33struct device; 34struct device_driver; 35struct class; 36struct class_device; 37 38struct bus_type { 39 const char * name; 40 41 struct subsystem subsys; 42 struct kset drivers; 43 struct kset devices; 44 struct klist klist_devices; 45 struct klist klist_drivers; 46 47 struct blocking_notifier_head bus_notifier; 48 49 struct bus_attribute * bus_attrs; 50 struct device_attribute * dev_attrs; 51 struct driver_attribute * drv_attrs; 52 53 int (*match)(struct device * dev, struct device_driver * drv); 54 int (*uevent)(struct device *dev, char **envp, 55 int num_envp, char *buffer, int buffer_size); 56 int (*probe)(struct device * dev); 57 int (*remove)(struct device * dev); 58 void (*shutdown)(struct device * dev); 59 60 int (*suspend)(struct device * dev, pm_message_t state); 61 int (*suspend_late)(struct device * dev, pm_message_t state); 62 int (*resume_early)(struct device * dev); 63 int (*resume)(struct device * dev); 64}; 65 66extern int __must_check bus_register(struct bus_type * bus); 67extern void bus_unregister(struct bus_type * bus); 68 69extern int __must_check bus_rescan_devices(struct bus_type * bus); 70 71/* iterator helpers for buses */ 72 73int bus_for_each_dev(struct bus_type * bus, struct device * start, void * data, 74 int (*fn)(struct device *, void *)); 75struct device * bus_find_device(struct bus_type *bus, struct device *start, 76 void *data, int (*match)(struct device *, void *)); 77 78int __must_check bus_for_each_drv(struct bus_type *bus, 79 struct device_driver *start, void *data, 80 int (*fn)(struct device_driver *, void *)); 81 82/* 83 * Bus notifiers: Get notified of addition/removal of devices 84 * and binding/unbinding of drivers to devices. 85 * In the long run, it should be a replacement for the platform 86 * notify hooks. 87 */ 88struct notifier_block; 89 90extern int bus_register_notifier(struct bus_type *bus, 91 struct notifier_block *nb); 92extern int bus_unregister_notifier(struct bus_type *bus, 93 struct notifier_block *nb); 94 95/* All 4 notifers below get called with the target struct device * 96 * as an argument. Note that those functions are likely to be called 97 * with the device semaphore held in the core, so be careful. 98 */ 99#define BUS_NOTIFY_ADD_DEVICE 0x00000001 /* device added */ 100#define BUS_NOTIFY_DEL_DEVICE 0x00000002 /* device removed */ 101#define BUS_NOTIFY_BOUND_DRIVER 0x00000003 /* driver bound to device */ 102#define BUS_NOTIFY_UNBIND_DRIVER 0x00000004 /* driver about to be 103 unbound */ 104 105/* sysfs interface for exporting bus attributes */ 106 107struct bus_attribute { 108 struct attribute attr; 109 ssize_t (*show)(struct bus_type *, char * buf); 110 ssize_t (*store)(struct bus_type *, const char * buf, size_t count); 111}; 112 113#define BUS_ATTR(_name,_mode,_show,_store) \ 114struct bus_attribute bus_attr_##_name = __ATTR(_name,_mode,_show,_store) 115 116extern int __must_check bus_create_file(struct bus_type *, 117 struct bus_attribute *); 118extern void bus_remove_file(struct bus_type *, struct bus_attribute *); 119 120struct device_driver { 121 const char * name; 122 struct bus_type * bus; 123 124 struct completion unloaded; 125 struct kobject kobj; 126 struct klist klist_devices; 127 struct klist_node knode_bus; 128 129 struct module * owner; 130 const char * mod_name; /* used for built-in modules */ 131 132 int (*probe) (struct device * dev); 133 int (*remove) (struct device * dev); 134 void (*shutdown) (struct device * dev); 135 int (*suspend) (struct device * dev, pm_message_t state); 136 int (*resume) (struct device * dev); 137 138 unsigned int multithread_probe:1; 139}; 140 141 142extern int __must_check driver_register(struct device_driver * drv); 143extern void driver_unregister(struct device_driver * drv); 144 145extern struct device_driver * get_driver(struct device_driver * drv); 146extern void put_driver(struct device_driver * drv); 147extern struct device_driver *driver_find(const char *name, struct bus_type *bus); 148extern int driver_probe_done(void); 149 150/* sysfs interface for exporting driver attributes */ 151 152struct driver_attribute { 153 struct attribute attr; 154 ssize_t (*show)(struct device_driver *, char * buf); 155 ssize_t (*store)(struct device_driver *, const char * buf, size_t count); 156}; 157 158#define DRIVER_ATTR(_name,_mode,_show,_store) \ 159struct driver_attribute driver_attr_##_name = __ATTR(_name,_mode,_show,_store) 160 161extern int __must_check driver_create_file(struct device_driver *, 162 struct driver_attribute *); 163extern void driver_remove_file(struct device_driver *, struct driver_attribute *); 164 165extern int __must_check driver_for_each_device(struct device_driver * drv, 166 struct device *start, void *data, 167 int (*fn)(struct device *, void *)); 168struct device * driver_find_device(struct device_driver *drv, 169 struct device *start, void *data, 170 int (*match)(struct device *, void *)); 171 172/* 173 * device classes 174 */ 175struct class { 176 const char * name; 177 struct module * owner; 178 179 struct subsystem subsys; 180 struct list_head children; 181 struct list_head devices; 182 struct list_head interfaces; 183 struct semaphore sem; /* locks both the children and interfaces lists */ 184 185 struct kobject *virtual_dir; 186 187 struct class_attribute * class_attrs; 188 struct class_device_attribute * class_dev_attrs; 189 struct device_attribute * dev_attrs; 190 191 int (*uevent)(struct class_device *dev, char **envp, 192 int num_envp, char *buffer, int buffer_size); 193 int (*dev_uevent)(struct device *dev, char **envp, int num_envp, 194 char *buffer, int buffer_size); 195 196 void (*release)(struct class_device *dev); 197 void (*class_release)(struct class *class); 198 void (*dev_release)(struct device *dev); 199 200 int (*suspend)(struct device *, pm_message_t state); 201 int (*resume)(struct device *); 202}; 203 204extern int __must_check class_register(struct class *); 205extern void class_unregister(struct class *); 206 207 208struct class_attribute { 209 struct attribute attr; 210 ssize_t (*show)(struct class *, char * buf); 211 ssize_t (*store)(struct class *, const char * buf, size_t count); 212}; 213 214#define CLASS_ATTR(_name,_mode,_show,_store) \ 215struct class_attribute class_attr_##_name = __ATTR(_name,_mode,_show,_store) 216 217extern int __must_check class_create_file(struct class *, 218 const struct class_attribute *); 219extern void class_remove_file(struct class *, const struct class_attribute *); 220 221struct class_device_attribute { 222 struct attribute attr; 223 ssize_t (*show)(struct class_device *, char * buf); 224 ssize_t (*store)(struct class_device *, const char * buf, size_t count); 225}; 226 227#define CLASS_DEVICE_ATTR(_name,_mode,_show,_store) \ 228struct class_device_attribute class_device_attr_##_name = \ 229 __ATTR(_name,_mode,_show,_store) 230 231extern int __must_check class_device_create_file(struct class_device *, 232 const struct class_device_attribute *); 233 234/** 235 * struct class_device - class devices 236 * @class: pointer to the parent class for this class device. This is required. 237 * @devt: for internal use by the driver core only. 238 * @node: for internal use by the driver core only. 239 * @kobj: for internal use by the driver core only. 240 * @devt_attr: for internal use by the driver core only. 241 * @groups: optional additional groups to be created 242 * @dev: if set, a symlink to the struct device is created in the sysfs 243 * directory for this struct class device. 244 * @class_data: pointer to whatever you want to store here for this struct 245 * class_device. Use class_get_devdata() and class_set_devdata() to get and 246 * set this pointer. 247 * @parent: pointer to a struct class_device that is the parent of this struct 248 * class_device. If NULL, this class_device will show up at the root of the 249 * struct class in sysfs (which is probably what you want to have happen.) 250 * @release: pointer to a release function for this struct class_device. If 251 * set, this will be called instead of the class specific release function. 252 * Only use this if you want to override the default release function, like 253 * when you are nesting class_device structures. 254 * @uevent: pointer to a uevent function for this struct class_device. If 255 * set, this will be called instead of the class specific uevent function. 256 * Only use this if you want to override the default uevent function, like 257 * when you are nesting class_device structures. 258 */ 259struct class_device { 260 struct list_head node; 261 262 struct kobject kobj; 263 struct class * class; /* required */ 264 dev_t devt; /* dev_t, creates the sysfs "dev" */ 265 struct class_device_attribute *devt_attr; 266 struct class_device_attribute uevent_attr; 267 struct device * dev; /* not necessary, but nice to have */ 268 void * class_data; /* class-specific data */ 269 struct class_device *parent; /* parent of this child device, if there is one */ 270 struct attribute_group ** groups; /* optional groups */ 271 272 void (*release)(struct class_device *dev); 273 int (*uevent)(struct class_device *dev, char **envp, 274 int num_envp, char *buffer, int buffer_size); 275 char class_id[BUS_ID_SIZE]; /* unique to this class */ 276}; 277 278static inline void * 279class_get_devdata (struct class_device *dev) 280{ 281 return dev->class_data; 282} 283 284static inline void 285class_set_devdata (struct class_device *dev, void *data) 286{ 287 dev->class_data = data; 288} 289 290 291extern int __must_check class_device_register(struct class_device *); 292extern void class_device_unregister(struct class_device *); 293extern void class_device_initialize(struct class_device *); 294extern int __must_check class_device_add(struct class_device *); 295extern void class_device_del(struct class_device *); 296 297extern struct class_device * class_device_get(struct class_device *); 298extern void class_device_put(struct class_device *); 299 300extern void class_device_remove_file(struct class_device *, 301 const struct class_device_attribute *); 302extern int __must_check class_device_create_bin_file(struct class_device *, 303 struct bin_attribute *); 304extern void class_device_remove_bin_file(struct class_device *, 305 struct bin_attribute *); 306 307struct class_interface { 308 struct list_head node; 309 struct class *class; 310 311 int (*add) (struct class_device *, struct class_interface *); 312 void (*remove) (struct class_device *, struct class_interface *); 313 int (*add_dev) (struct device *, struct class_interface *); 314 void (*remove_dev) (struct device *, struct class_interface *); 315}; 316 317extern int __must_check class_interface_register(struct class_interface *); 318extern void class_interface_unregister(struct class_interface *); 319 320extern struct class *class_create(struct module *owner, const char *name); 321extern void class_destroy(struct class *cls); 322extern struct class_device *class_device_create(struct class *cls, 323 struct class_device *parent, 324 dev_t devt, 325 struct device *device, 326 const char *fmt, ...) 327 __attribute__((format(printf,5,6))); 328extern void class_device_destroy(struct class *cls, dev_t devt); 329 330struct device_type { 331 struct device_attribute *attrs; 332 int (*uevent)(struct device *dev, char **envp, int num_envp, 333 char *buffer, int buffer_size); 334 void (*release)(struct device *dev); 335}; 336 337/* interface for exporting device attributes */ 338struct device_attribute { 339 struct attribute attr; 340 ssize_t (*show)(struct device *dev, struct device_attribute *attr, 341 char *buf); 342 ssize_t (*store)(struct device *dev, struct device_attribute *attr, 343 const char *buf, size_t count); 344}; 345 346#define DEVICE_ATTR(_name,_mode,_show,_store) \ 347struct device_attribute dev_attr_##_name = __ATTR(_name,_mode,_show,_store) 348 349extern int __must_check device_create_file(struct device *device, 350 struct device_attribute * entry); 351extern void device_remove_file(struct device * dev, struct device_attribute * attr); 352extern int __must_check device_create_bin_file(struct device *dev, 353 struct bin_attribute *attr); 354extern void device_remove_bin_file(struct device *dev, 355 struct bin_attribute *attr); 356extern int device_schedule_callback(struct device *dev, 357 void (*func)(struct device *)); 358 359/* device resource management */ 360typedef void (*dr_release_t)(struct device *dev, void *res); 361typedef int (*dr_match_t)(struct device *dev, void *res, void *match_data); 362 363#ifdef CONFIG_DEBUG_DEVRES 364extern void * __devres_alloc(dr_release_t release, size_t size, gfp_t gfp, 365 const char *name); 366#define devres_alloc(release, size, gfp) \ 367 __devres_alloc(release, size, gfp, #release) 368#else 369extern void * devres_alloc(dr_release_t release, size_t size, gfp_t gfp); 370#endif 371extern void devres_free(void *res); 372extern void devres_add(struct device *dev, void *res); 373extern void * devres_find(struct device *dev, dr_release_t release, 374 dr_match_t match, void *match_data); 375extern void * devres_get(struct device *dev, void *new_res, 376 dr_match_t match, void *match_data); 377extern void * devres_remove(struct device *dev, dr_release_t release, 378 dr_match_t match, void *match_data); 379extern int devres_destroy(struct device *dev, dr_release_t release, 380 dr_match_t match, void *match_data); 381 382/* devres group */ 383extern void * __must_check devres_open_group(struct device *dev, void *id, 384 gfp_t gfp); 385extern void devres_close_group(struct device *dev, void *id); 386extern void devres_remove_group(struct device *dev, void *id); 387extern int devres_release_group(struct device *dev, void *id); 388 389/* managed kzalloc/kfree for device drivers, no kmalloc, always use kzalloc */ 390extern void *devm_kzalloc(struct device *dev, size_t size, gfp_t gfp); 391extern void devm_kfree(struct device *dev, void *p); 392 393struct device { 394 struct klist klist_children; 395 struct klist_node knode_parent; /* node in sibling list */ 396 struct klist_node knode_driver; 397 struct klist_node knode_bus; 398 struct device * parent; 399 400 struct kobject kobj; 401 char bus_id[BUS_ID_SIZE]; /* position on parent bus */ 402 struct device_type *type; 403 unsigned is_registered:1; 404 struct device_attribute uevent_attr; 405 struct device_attribute *devt_attr; 406 407 struct semaphore sem; /* semaphore to synchronize calls to 408 * its driver. 409 */ 410 411 struct bus_type * bus; /* type of bus device is on */ 412 struct device_driver *driver; /* which driver has allocated this 413 device */ 414 void *driver_data; /* data private to the driver */ 415 void *platform_data; /* Platform specific data, device 416 core doesn't touch it */ 417 struct dev_pm_info power; 418 419#ifdef CONFIG_NUMA 420 int numa_node; /* NUMA node this device is close to */ 421#endif 422 u64 *dma_mask; /* dma mask (if dma'able device) */ 423 u64 coherent_dma_mask;/* Like dma_mask, but for 424 alloc_coherent mappings as 425 not all hardware supports 426 64 bit addresses for consistent 427 allocations such descriptors. */ 428 429 struct list_head dma_pools; /* dma pools (if dma'ble) */ 430 431 struct dma_coherent_mem *dma_mem; /* internal for coherent mem 432 override */ 433 /* arch specific additions */ 434 struct dev_archdata archdata; 435 436 spinlock_t devres_lock; 437 struct list_head devres_head; 438 439 /* class_device migration path */ 440 struct list_head node; 441 struct class *class; 442 dev_t devt; /* dev_t, creates the sysfs "dev" */ 443 struct attribute_group **groups; /* optional groups */ 444 int uevent_suppress; 445 446 void (*release)(struct device * dev); 447}; 448 449#ifdef CONFIG_NUMA 450static inline int dev_to_node(struct device *dev) 451{ 452 return dev->numa_node; 453} 454static inline void set_dev_node(struct device *dev, int node) 455{ 456 dev->numa_node = node; 457} 458#else 459static inline int dev_to_node(struct device *dev) 460{ 461 return -1; 462} 463static inline void set_dev_node(struct device *dev, int node) 464{ 465} 466#endif 467 468static inline void * 469dev_get_drvdata (struct device *dev) 470{ 471 return dev->driver_data; 472} 473 474static inline void 475dev_set_drvdata (struct device *dev, void *data) 476{ 477 dev->driver_data = data; 478} 479 480static inline int device_is_registered(struct device *dev) 481{ 482 return dev->is_registered; 483} 484 485void driver_init(void); 486 487/* 488 * High level routines for use by the bus drivers 489 */ 490extern int __must_check device_register(struct device * dev); 491extern void device_unregister(struct device * dev); 492extern void device_initialize(struct device * dev); 493extern int __must_check device_add(struct device * dev); 494extern void device_del(struct device * dev); 495extern int device_for_each_child(struct device *, void *, 496 int (*fn)(struct device *, void *)); 497extern struct device *device_find_child(struct device *, void *data, 498 int (*match)(struct device *, void *)); 499extern int device_rename(struct device *dev, char *new_name); 500extern int device_move(struct device *dev, struct device *new_parent); 501 502/* 503 * Manual binding of a device to driver. See drivers/base/bus.c 504 * for information on use. 505 */ 506extern int __must_check device_bind_driver(struct device *dev); 507extern void device_release_driver(struct device * dev); 508extern int __must_check device_attach(struct device * dev); 509extern int __must_check driver_attach(struct device_driver *drv); 510extern int __must_check device_reprobe(struct device *dev); 511 512/* 513 * Easy functions for dynamically creating devices on the fly 514 */ 515extern struct device *device_create(struct class *cls, struct device *parent, 516 dev_t devt, const char *fmt, ...) 517 __attribute__((format(printf,4,5))); 518extern void device_destroy(struct class *cls, dev_t devt); 519 520/* 521 * Platform "fixup" functions - allow the platform to have their say 522 * about devices and actions that the general device layer doesn't 523 * know about. 524 */ 525/* Notify platform of device discovery */ 526extern int (*platform_notify)(struct device * dev); 527 528extern int (*platform_notify_remove)(struct device * dev); 529 530 531/** 532 * get_device - atomically increment the reference count for the device. 533 * 534 */ 535extern struct device * get_device(struct device * dev); 536extern void put_device(struct device * dev); 537 538 539/* drivers/base/power/shutdown.c */ 540extern void device_shutdown(void); 541 542 543/* drivers/base/firmware.c */ 544extern int __must_check firmware_register(struct subsystem *); 545extern void firmware_unregister(struct subsystem *); 546 547/* debugging and troubleshooting/diagnostic helpers. */ 548extern const char *dev_driver_string(struct device *dev); 549#define dev_printk(level, dev, format, arg...) \ 550 printk(level "%s %s: " format , dev_driver_string(dev) , (dev)->bus_id , ## arg) 551 552#ifdef DEBUG 553#define dev_dbg(dev, format, arg...) \ 554 dev_printk(KERN_DEBUG , dev , format , ## arg) 555#else 556#define dev_dbg(dev, format, arg...) do { (void)(dev); } while (0) 557#endif 558 559#define dev_err(dev, format, arg...) \ 560 dev_printk(KERN_ERR , dev , format , ## arg) 561#define dev_info(dev, format, arg...) \ 562 dev_printk(KERN_INFO , dev , format , ## arg) 563#define dev_warn(dev, format, arg...) \ 564 dev_printk(KERN_WARNING , dev , format , ## arg) 565#define dev_notice(dev, format, arg...) \ 566 dev_printk(KERN_NOTICE , dev , format , ## arg) 567 568/* Create alias, so I can be autoloaded. */ 569#define MODULE_ALIAS_CHARDEV(major,minor) \ 570 MODULE_ALIAS("char-major-" __stringify(major) "-" __stringify(minor)) 571#define MODULE_ALIAS_CHARDEV_MAJOR(major) \ 572 MODULE_ALIAS("char-major-" __stringify(major) "-*") 573#endif /* _DEVICE_H_ */