Blame view
include/linux/device.h
40.8 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 |
/* * device.h - generic, centralized driver model * * Copyright (c) 2001-2003 Patrick Mochel <mochel@osdl.org> |
b40284378 Driver core: move... |
5 6 |
* Copyright (c) 2004-2009 Greg Kroah-Hartman <gregkh@suse.de> * Copyright (c) 2008-2009 Novell Inc. |
1da177e4c Linux-2.6.12-rc2 |
7 8 9 10 11 12 13 14 |
* * This file is released under the GPLv2 * * See Documentation/driver-model/ for more information. */ #ifndef _DEVICE_H_ #define _DEVICE_H_ |
1da177e4c Linux-2.6.12-rc2 |
15 16 |
#include <linux/ioport.h> #include <linux/kobject.h> |
465c7a3a3 [PATCH] Add a kli... |
17 |
#include <linux/klist.h> |
1da177e4c Linux-2.6.12-rc2 |
18 |
#include <linux/list.h> |
d2a3b9146 class: add lockde... |
19 |
#include <linux/lockdep.h> |
4a7fb6363 add __must_check ... |
20 |
#include <linux/compiler.h> |
1da177e4c Linux-2.6.12-rc2 |
21 |
#include <linux/types.h> |
de4772542 include: replace ... |
22 |
#include <linux/mutex.h> |
ab78029ec drivers/pinctrl: ... |
23 |
#include <linux/pinctrl/devinfo.h> |
1da177e4c Linux-2.6.12-rc2 |
24 |
#include <linux/pm.h> |
60063497a atomic: use <linu... |
25 |
#include <linux/atomic.h> |
6ca045930 driver core: Add ... |
26 |
#include <linux/ratelimit.h> |
3c2670e65 driver core: add ... |
27 |
#include <linux/uidgid.h> |
c6dbaef22 Driver core: add ... |
28 |
#include <asm/device.h> |
1da177e4c Linux-2.6.12-rc2 |
29 |
|
1da177e4c Linux-2.6.12-rc2 |
30 |
struct device; |
fb069a5d1 driver core: crea... |
31 |
struct device_private; |
1da177e4c Linux-2.6.12-rc2 |
32 |
struct device_driver; |
e5dd12784 Driver core: move... |
33 |
struct driver_private; |
de4772542 include: replace ... |
34 |
struct module; |
1da177e4c Linux-2.6.12-rc2 |
35 |
struct class; |
6b6e39a6a driver-core: merg... |
36 |
struct subsys_private; |
b8c5cec23 Driver core: udev... |
37 |
struct bus_type; |
d706c1b05 driver-core: Add ... |
38 |
struct device_node; |
ff21776d1 Driver core: Add ... |
39 |
struct iommu_ops; |
74416e1e0 driver core: Add ... |
40 |
struct iommu_group; |
b8c5cec23 Driver core: udev... |
41 42 43 |
struct bus_attribute { struct attribute attr; |
d462943af Driver core: fix ... |
44 45 |
ssize_t (*show)(struct bus_type *bus, char *buf); ssize_t (*store)(struct bus_type *bus, const char *buf, size_t count); |
b8c5cec23 Driver core: udev... |
46 |
}; |
d462943af Driver core: fix ... |
47 |
#define BUS_ATTR(_name, _mode, _show, _store) \ |
ced321bf9 driver core: devi... |
48 49 50 51 52 |
struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store) #define BUS_ATTR_RW(_name) \ struct bus_attribute bus_attr_##_name = __ATTR_RW(_name) #define BUS_ATTR_RO(_name) \ struct bus_attribute bus_attr_##_name = __ATTR_RO(_name) |
b8c5cec23 Driver core: udev... |
53 54 55 56 |
extern int __must_check bus_create_file(struct bus_type *, struct bus_attribute *); extern void bus_remove_file(struct bus_type *, struct bus_attribute *); |
1da177e4c Linux-2.6.12-rc2 |
57 |
|
880ffb5c6 driver core: Add ... |
58 59 60 61 |
/** * struct bus_type - The bus type of the device * * @name: The name of the bus. |
ca22e56de driver-core: impl... |
62 63 |
* @dev_name: Used for subsystems to enumerate devices like ("foo%u", dev->id). * @dev_root: Default device to use as the parent. |
880ffb5c6 driver core: Add ... |
64 65 66 67 68 69 70 71 72 73 74 75 |
* @bus_attrs: Default attributes of the bus. * @dev_attrs: Default attributes of the devices on the bus. * @drv_attrs: Default attributes of the device drivers on the bus. * @match: Called, perhaps multiple times, whenever a new device or driver * is added for this bus. It should return a nonzero value if the * given device can be handled by the given driver. * @uevent: Called when a device is added, removed, or a few other things * that generate uevents to add the environment variables. * @probe: Called when a new device or driver add to this bus, and callback * the specific driver's probe to initial the matched device. * @remove: Called when a device removed from this bus. * @shutdown: Called at shut-down time to quiesce the device. |
4f3549d72 Driver core: Add ... |
76 77 78 79 |
* * @online: Called to put the device back online (after offlining it). * @offline: Called to put the device offline for hot-removal. May fail. * |
880ffb5c6 driver core: Add ... |
80 81 82 83 |
* @suspend: Called when a device on this bus wants to go to sleep mode. * @resume: Called to bring a device on this bus out of sleep mode. * @pm: Power management operations of this bus, callback the specific * device driver's pm-ops. |
7b08fae8f device.h: Fix str... |
84 |
* @iommu_ops: IOMMU specific operations for this bus, used to attach IOMMU |
ff21776d1 Driver core: Add ... |
85 86 |
* driver implementations to a bus and allow the driver to do * bus-specific setup |
880ffb5c6 driver core: Add ... |
87 88 |
* @p: The private data of the driver core, only the driver core can * touch this. |
bfd63cd24 driver core: devi... |
89 |
* @lock_key: Lock class key for use by the lock validator |
880ffb5c6 driver core: Add ... |
90 91 92 93 94 95 96 97 98 99 |
* * A bus is a channel between the processor and one or more devices. For the * purposes of the device model, all devices are connected via a bus, even if * it is an internal, virtual, "platform" bus. Buses can plug into each other. * A USB controller is usually a PCI device, for example. The device model * represents the actual connections between buses and the devices they control. * A bus is represented by the bus_type structure. It contains the name, the * default attributes, the bus' methods, PM operations, and the driver core's * private data. */ |
1da177e4c Linux-2.6.12-rc2 |
100 |
struct bus_type { |
d462943af Driver core: fix ... |
101 |
const char *name; |
ca22e56de driver-core: impl... |
102 103 |
const char *dev_name; struct device *dev_root; |
d462943af Driver core: fix ... |
104 105 106 107 108 109 110 111 112 |
struct bus_attribute *bus_attrs; struct device_attribute *dev_attrs; struct driver_attribute *drv_attrs; int (*match)(struct device *dev, struct device_driver *drv); int (*uevent)(struct device *dev, struct kobj_uevent_env *env); int (*probe)(struct device *dev); int (*remove)(struct device *dev); void (*shutdown)(struct device *dev); |
4f3549d72 Driver core: Add ... |
113 114 |
int (*online)(struct device *dev); int (*offline)(struct device *dev); |
d462943af Driver core: fix ... |
115 |
int (*suspend)(struct device *dev, pm_message_t state); |
d462943af Driver core: fix ... |
116 |
int (*resume)(struct device *dev); |
b8c5cec23 Driver core: udev... |
117 |
|
8150f32b9 Driver Core: Make... |
118 |
const struct dev_pm_ops *pm; |
1eede070a Introduce new top... |
119 |
|
ff21776d1 Driver core: Add ... |
120 |
struct iommu_ops *iommu_ops; |
6b6e39a6a driver-core: merg... |
121 |
struct subsys_private *p; |
be871b7e5 device: separate ... |
122 |
struct lock_class_key lock_key; |
1da177e4c Linux-2.6.12-rc2 |
123 |
}; |
be871b7e5 device: separate ... |
124 |
extern int __must_check bus_register(struct bus_type *bus); |
d462943af Driver core: fix ... |
125 |
extern void bus_unregister(struct bus_type *bus); |
1da177e4c Linux-2.6.12-rc2 |
126 |
|
d462943af Driver core: fix ... |
127 |
extern int __must_check bus_rescan_devices(struct bus_type *bus); |
1da177e4c Linux-2.6.12-rc2 |
128 |
|
1da177e4c Linux-2.6.12-rc2 |
129 |
/* iterator helpers for buses */ |
ca22e56de driver-core: impl... |
130 131 132 133 |
struct subsys_dev_iter { struct klist_iter ki; const struct device_type *type; }; |
7cd9c9bb5 Revert "driver co... |
134 |
void subsys_dev_iter_init(struct subsys_dev_iter *iter, |
ca22e56de driver-core: impl... |
135 136 137 138 139 |
struct bus_type *subsys, struct device *start, const struct device_type *type); struct device *subsys_dev_iter_next(struct subsys_dev_iter *iter); void subsys_dev_iter_exit(struct subsys_dev_iter *iter); |
1da177e4c Linux-2.6.12-rc2 |
140 |
|
d462943af Driver core: fix ... |
141 142 143 144 145 |
int bus_for_each_dev(struct bus_type *bus, struct device *start, void *data, int (*fn)(struct device *dev, void *data)); struct device *bus_find_device(struct bus_type *bus, struct device *start, void *data, int (*match)(struct device *dev, void *data)); |
1f9ffc049 Driver core: add ... |
146 147 148 |
struct device *bus_find_device_by_name(struct bus_type *bus, struct device *start, const char *name); |
ca22e56de driver-core: impl... |
149 150 |
struct device *subsys_find_device_by_id(struct bus_type *bus, unsigned int id, struct device *hint); |
cc7447a5f Driver core: Drop... |
151 152 |
int bus_for_each_drv(struct bus_type *bus, struct device_driver *start, void *data, int (*fn)(struct device_driver *, void *)); |
99178b036 Driver core: add ... |
153 154 155 |
void bus_sort_breadthfirst(struct bus_type *bus, int (*compare)(const struct device *a, const struct device *b)); |
116af3782 Driver core: add ... |
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
/* * Bus notifiers: Get notified of addition/removal of devices * and binding/unbinding of drivers to devices. * In the long run, it should be a replacement for the platform * notify hooks. */ struct notifier_block; extern int bus_register_notifier(struct bus_type *bus, struct notifier_block *nb); extern int bus_unregister_notifier(struct bus_type *bus, struct notifier_block *nb); /* All 4 notifers below get called with the target struct device * * as an argument. Note that those functions are likely to be called |
8e9394ce2 Driver core: crea... |
171 |
* with the device lock held in the core, so be careful. |
116af3782 Driver core: add ... |
172 173 174 |
*/ #define BUS_NOTIFY_ADD_DEVICE 0x00000001 /* device added */ #define BUS_NOTIFY_DEL_DEVICE 0x00000002 /* device removed */ |
45daef0fd Driver core: Add ... |
175 176 177 178 |
#define BUS_NOTIFY_BIND_DRIVER 0x00000003 /* driver about to be bound */ #define BUS_NOTIFY_BOUND_DRIVER 0x00000004 /* driver bound to device */ #define BUS_NOTIFY_UNBIND_DRIVER 0x00000005 /* driver about to be |
116af3782 Driver core: add ... |
179 |
unbound */ |
45daef0fd Driver core: Add ... |
180 |
#define BUS_NOTIFY_UNBOUND_DRIVER 0x00000006 /* driver is unbound |
309b7d60a driver core: add ... |
181 |
from the device */ |
116af3782 Driver core: add ... |
182 |
|
0fed80f7a driver core: add ... |
183 |
extern struct kset *bus_get_kset(struct bus_type *bus); |
b249072ee driver core: add ... |
184 |
extern struct klist *bus_get_device_klist(struct bus_type *bus); |
0fed80f7a driver core: add ... |
185 |
|
880ffb5c6 driver core: Add ... |
186 187 188 189 190 191 192 193 |
/** * struct device_driver - The basic device driver structure * @name: Name of the device driver. * @bus: The bus which the device of this driver belongs to. * @owner: The module owner. * @mod_name: Used for built-in modules. * @suppress_bind_attrs: Disables bind/unbind via sysfs. * @of_match_table: The open firmware table. |
06f64c8f2 driver core / ACP... |
194 |
* @acpi_match_table: The ACPI match table. |
880ffb5c6 driver core: Add ... |
195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 |
* @probe: Called to query the existence of a specific device, * whether this driver can work with it, and bind the driver * to a specific device. * @remove: Called when the device is removed from the system to * unbind a device from this driver. * @shutdown: Called at shut-down time to quiesce the device. * @suspend: Called to put the device to sleep mode. Usually to a * low power state. * @resume: Called to bring a device from sleep mode. * @groups: Default attributes that get created by the driver core * automatically. * @pm: Power management operations of the device which matched * this driver. * @p: Driver core's private data, no one other than the driver * core can touch this. * * The device driver-model tracks all of the drivers known to the system. * The main reason for this tracking is to enable the driver core to match * up drivers with new devices. Once drivers are known objects within the * system, however, a number of other things become possible. Device drivers * can export information and configuration variables that are independent * of any specific device. */ |
1da177e4c Linux-2.6.12-rc2 |
218 |
struct device_driver { |
e5dd12784 Driver core: move... |
219 220 |
const char *name; struct bus_type *bus; |
1da177e4c Linux-2.6.12-rc2 |
221 |
|
e5dd12784 Driver core: move... |
222 |
struct module *owner; |
1a6f2a751 Driver core: allo... |
223 224 225 |
const char *mod_name; /* used for built-in modules */ bool suppress_bind_attrs; /* disables bind/unbind via sysfs */ |
1da177e4c Linux-2.6.12-rc2 |
226 |
|
597b9d1e4 drivercore: Add o... |
227 |
const struct of_device_id *of_match_table; |
06f64c8f2 driver core / ACP... |
228 |
const struct acpi_device_id *acpi_match_table; |
597b9d1e4 drivercore: Add o... |
229 |
|
d462943af Driver core: fix ... |
230 231 232 233 234 |
int (*probe) (struct device *dev); int (*remove) (struct device *dev); void (*shutdown) (struct device *dev); int (*suspend) (struct device *dev, pm_message_t state); int (*resume) (struct device *dev); |
a4dbd6740 driver model: con... |
235 |
const struct attribute_group **groups; |
e5dd12784 Driver core: move... |
236 |
|
8150f32b9 Driver Core: Make... |
237 |
const struct dev_pm_ops *pm; |
1eede070a Introduce new top... |
238 |
|
e5dd12784 Driver core: move... |
239 |
struct driver_private *p; |
1da177e4c Linux-2.6.12-rc2 |
240 |
}; |
d462943af Driver core: fix ... |
241 242 |
extern int __must_check driver_register(struct device_driver *drv); extern void driver_unregister(struct device_driver *drv); |
1da177e4c Linux-2.6.12-rc2 |
243 |
|
d462943af Driver core: fix ... |
244 245 |
extern struct device_driver *driver_find(const char *name, struct bus_type *bus); |
d779249ed Driver Core: add ... |
246 |
extern int driver_probe_done(void); |
b23530ebc driver core: remo... |
247 |
extern void wait_for_device_probe(void); |
216773a78 Consolidate drive... |
248 |
|
1da177e4c Linux-2.6.12-rc2 |
249 |
|
405ae7d38 Replace remaining... |
250 |
/* sysfs interface for exporting driver attributes */ |
1da177e4c Linux-2.6.12-rc2 |
251 252 |
struct driver_attribute { |
d462943af Driver core: fix ... |
253 254 255 256 |
struct attribute attr; ssize_t (*show)(struct device_driver *driver, char *buf); ssize_t (*store)(struct device_driver *driver, const char *buf, size_t count); |
1da177e4c Linux-2.6.12-rc2 |
257 |
}; |
ced321bf9 driver core: devi... |
258 259 260 261 262 263 |
#define DRIVER_ATTR(_name, _mode, _show, _store) \ struct driver_attribute driver_attr_##_name = __ATTR(_name, _mode, _show, _store) #define DRIVER_ATTR_RW(_name) \ struct driver_attribute driver_attr_##_name = __ATTR_RW(_name) #define DRIVER_ATTR_RO(_name) \ struct driver_attribute driver_attr_##_name = __ATTR_RO(_name) |
1da177e4c Linux-2.6.12-rc2 |
264 |
|
d462943af Driver core: fix ... |
265 |
extern int __must_check driver_create_file(struct device_driver *driver, |
099c2f21d Driver core: driv... |
266 |
const struct driver_attribute *attr); |
d462943af Driver core: fix ... |
267 |
extern void driver_remove_file(struct device_driver *driver, |
099c2f21d Driver core: driv... |
268 |
const struct driver_attribute *attr); |
1da177e4c Linux-2.6.12-rc2 |
269 |
|
d462943af Driver core: fix ... |
270 271 272 273 274 275 276 277 |
extern int __must_check driver_for_each_device(struct device_driver *drv, struct device *start, void *data, int (*fn)(struct device *dev, void *)); struct device *driver_find_device(struct device_driver *drv, struct device *start, void *data, int (*match)(struct device *dev, void *data)); |
fae3cd002 [PATCH] Add drive... |
278 |
|
880ffb5c6 driver core: Add ... |
279 |
/** |
ca22e56de driver-core: impl... |
280 |
* struct subsys_interface - interfaces to device functions |
2eda013f4 kernel-doc: fix n... |
281 282 283 284 285 |
* @name: name of the device function * @subsys: subsytem of the devices to attach to * @node: the list of functions registered at the subsystem * @add_dev: device hookup to device function handler * @remove_dev: device hookup to device function handler |
ca22e56de driver-core: impl... |
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 |
* * Simple interfaces attached to a subsystem. Multiple interfaces can * attach to a subsystem and its devices. Unlike drivers, they do not * exclusively claim or control devices. Interfaces usually represent * a specific functionality of a subsystem/class of devices. */ struct subsys_interface { const char *name; struct bus_type *subsys; struct list_head node; int (*add_dev)(struct device *dev, struct subsys_interface *sif); int (*remove_dev)(struct device *dev, struct subsys_interface *sif); }; int subsys_interface_register(struct subsys_interface *sif); void subsys_interface_unregister(struct subsys_interface *sif); int subsys_system_register(struct bus_type *subsys, const struct attribute_group **groups); |
d73ce0042 driver/base: impl... |
305 306 |
int subsys_virtual_register(struct bus_type *subsys, const struct attribute_group **groups); |
ca22e56de driver-core: impl... |
307 308 |
/** |
880ffb5c6 driver core: Add ... |
309 310 311 312 |
* struct class - device classes * @name: Name of the class. * @owner: The module owner. * @class_attrs: Default attributes of this class. |
d05a6f96c driver core: add ... |
313 |
* @dev_groups: Default attributes of the devices that belong to the class. |
880ffb5c6 driver core: Add ... |
314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 |
* @dev_attrs: Default attributes of the devices belong to the class. * @dev_bin_attrs: Default binary attributes of the devices belong to the class. * @dev_kobj: The kobject that represents this class and links it into the hierarchy. * @dev_uevent: Called when a device is added, removed from this class, or a * few other things that generate uevents to add the environment * variables. * @devnode: Callback to provide the devtmpfs. * @class_release: Called to release this class. * @dev_release: Called to release the device. * @suspend: Used to put the device to sleep mode, usually to a low power * state. * @resume: Used to bring the device from the sleep mode. * @ns_type: Callbacks so sysfs can detemine namespaces. * @namespace: Namespace of the device belongs to this class. * @pm: The default device power management operations of this class. * @p: The private data of the driver core, no one other than the * driver core can touch this. * * A class is a higher-level view of a device that abstracts out low-level * implementation details. Drivers may see a SCSI disk or an ATA disk, but, * at the class level, they are all simply disks. Classes allow user space * to work with devices based on what they do, rather than how they are * connected or how they work. |
1da177e4c Linux-2.6.12-rc2 |
337 338 |
*/ struct class { |
d462943af Driver core: fix ... |
339 340 |
const char *name; struct module *owner; |
1da177e4c Linux-2.6.12-rc2 |
341 |
|
d462943af Driver core: fix ... |
342 |
struct class_attribute *class_attrs; |
d05a6f96c driver core: add ... |
343 344 |
struct device_attribute *dev_attrs; /* use dev_groups instead */ const struct attribute_group **dev_groups; |
c97415a72 sysfs: Introducin... |
345 |
struct bin_attribute *dev_bin_attrs; |
e105b8bfc sysfs: add /sys/d... |
346 |
struct kobject *dev_kobj; |
1da177e4c Linux-2.6.12-rc2 |
347 |
|
d462943af Driver core: fix ... |
348 |
int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env); |
2c9ede55e switch device_get... |
349 |
char *(*devnode)(struct device *dev, umode_t *mode); |
1da177e4c Linux-2.6.12-rc2 |
350 |
|
d462943af Driver core: fix ... |
351 352 |
void (*class_release)(struct class *class); void (*dev_release)(struct device *dev); |
7c8265f51 Suspend infrastru... |
353 |
|
d462943af Driver core: fix ... |
354 355 |
int (*suspend)(struct device *dev, pm_message_t state); int (*resume)(struct device *dev); |
1eede070a Introduce new top... |
356 |
|
bc451f205 kobj: Add basic i... |
357 358 |
const struct kobj_ns_type_operations *ns_type; const void *(*namespace)(struct device *dev); |
8150f32b9 Driver Core: Make... |
359 |
const struct dev_pm_ops *pm; |
6b6e39a6a driver-core: merg... |
360 |
struct subsys_private *p; |
1da177e4c Linux-2.6.12-rc2 |
361 |
}; |
5a3ceb861 driver-core: use ... |
362 363 364 365 |
struct class_dev_iter { struct klist_iter ki; const struct device_type *type; }; |
e105b8bfc sysfs: add /sys/d... |
366 367 |
extern struct kobject *sysfs_dev_block_kobj; extern struct kobject *sysfs_dev_char_kobj; |
d2a3b9146 class: add lockde... |
368 369 |
extern int __must_check __class_register(struct class *class, struct lock_class_key *key); |
d462943af Driver core: fix ... |
370 |
extern void class_unregister(struct class *class); |
d2a3b9146 class: add lockde... |
371 372 373 374 375 376 377 378 |
/* This is a #define to keep the compiler from merging different * instances of the __key variable */ #define class_register(class) \ ({ \ static struct lock_class_key __key; \ __class_register(class, &__key); \ }) |
462270944 Driver core: Add ... |
379 380 381 382 383 384 385 |
struct class_compat; struct class_compat *class_compat_register(const char *name); void class_compat_unregister(struct class_compat *cls); int class_compat_create_link(struct class_compat *cls, struct device *dev, struct device *device_link); void class_compat_remove_link(struct class_compat *cls, struct device *dev, struct device *device_link); |
7cd9c9bb5 Revert "driver co... |
386 387 388 389 |
extern void class_dev_iter_init(struct class_dev_iter *iter, struct class *class, struct device *start, const struct device_type *type); |
5a3ceb861 driver-core: use ... |
390 391 |
extern struct device *class_dev_iter_next(struct class_dev_iter *iter); extern void class_dev_iter_exit(struct class_dev_iter *iter); |
93562b537 Driver Core: add ... |
392 393 |
extern int class_for_each_device(struct class *class, struct device *start, void *data, |
fd04897bb Driver Core: add ... |
394 |
int (*fn)(struct device *dev, void *data)); |
695794ae0 Driver Core: add ... |
395 |
extern struct device *class_find_device(struct class *class, |
9f3b795a6 driver-core: cons... |
396 397 |
struct device *start, const void *data, int (*match)(struct device *, const void *)); |
1da177e4c Linux-2.6.12-rc2 |
398 399 |
struct class_attribute { |
d462943af Driver core: fix ... |
400 |
struct attribute attr; |
28812fe11 driver-core: Add ... |
401 402 403 404 |
ssize_t (*show)(struct class *class, struct class_attribute *attr, char *buf); ssize_t (*store)(struct class *class, struct class_attribute *attr, const char *buf, size_t count); |
672d82c18 class: Implement ... |
405 406 |
const void *(*namespace)(struct class *class, const struct class_attribute *attr); |
1da177e4c Linux-2.6.12-rc2 |
407 |
}; |
ced321bf9 driver core: devi... |
408 409 410 411 412 413 |
#define CLASS_ATTR(_name, _mode, _show, _store) \ struct class_attribute class_attr_##_name = __ATTR(_name, _mode, _show, _store) #define CLASS_ATTR_RW(_name) \ struct class_attribute class_attr_##_name = __ATTR_RW(_name) #define CLASS_ATTR_RO(_name) \ struct class_attribute class_attr_##_name = __ATTR_RO(_name) |
1da177e4c Linux-2.6.12-rc2 |
414 |
|
d462943af Driver core: fix ... |
415 416 417 418 |
extern int __must_check class_create_file(struct class *class, const struct class_attribute *attr); extern void class_remove_file(struct class *class, const struct class_attribute *attr); |
1da177e4c Linux-2.6.12-rc2 |
419 |
|
869dfc875 driver core: Add ... |
420 |
/* Simple class attribute that is just a static string */ |
869dfc875 driver core: Add ... |
421 422 423 424 425 426 427 428 429 430 431 432 433 434 |
struct class_attribute_string { struct class_attribute attr; char *str; }; /* Currently read-only only */ #define _CLASS_ATTR_STRING(_name, _mode, _str) \ { __ATTR(_name, _mode, show_class_attr_string, NULL), _str } #define CLASS_ATTR_STRING(_name, _mode, _str) \ struct class_attribute_string class_attr_##_name = \ _CLASS_ATTR_STRING(_name, _mode, _str) extern ssize_t show_class_attr_string(struct class *class, struct class_attribute *attr, char *buf); |
1da177e4c Linux-2.6.12-rc2 |
435 436 437 |
struct class_interface { struct list_head node; struct class *class; |
c47ed219b Class: add suppor... |
438 439 |
int (*add_dev) (struct device *, struct class_interface *); void (*remove_dev) (struct device *, struct class_interface *); |
1da177e4c Linux-2.6.12-rc2 |
440 |
}; |
4a7fb6363 add __must_check ... |
441 |
extern int __must_check class_interface_register(struct class_interface *); |
1da177e4c Linux-2.6.12-rc2 |
442 |
extern void class_interface_unregister(struct class_interface *); |
d2a3b9146 class: add lockde... |
443 444 445 |
extern struct class * __must_check __class_create(struct module *owner, const char *name, struct lock_class_key *key); |
e9ba6365f [PATCH] CLASS: mo... |
446 |
extern void class_destroy(struct class *cls); |
e9ba6365f [PATCH] CLASS: mo... |
447 |
|
d2a3b9146 class: add lockde... |
448 449 450 451 452 453 454 |
/* This is a #define to keep the compiler from merging different * instances of the __key variable */ #define class_create(owner, name) \ ({ \ static struct lock_class_key __key; \ __class_create(owner, name, &__key); \ }) |
414264f95 Driver core: add ... |
455 456 457 458 459 460 461 462 463 |
/* * The type of device, "struct device" is embedded in. A class * or bus can contain devices of different types * like "partitions" and "disks", "mouse" and "event". * This identifies the device type and carries type-specific * information, equivalent to the kobj_type of a kobject. * If "name" is specified, the uevent will contain it in * the DEVTYPE variable. */ |
f9f852df2 Driver core: add ... |
464 |
struct device_type { |
414264f95 Driver core: add ... |
465 |
const char *name; |
a4dbd6740 driver model: con... |
466 |
const struct attribute_group **groups; |
7eff2e7a8 Driver core: chan... |
467 |
int (*uevent)(struct device *dev, struct kobj_uevent_env *env); |
3c2670e65 driver core: add ... |
468 |
char *(*devnode)(struct device *dev, umode_t *mode, |
4e4098a3e driver core: hand... |
469 |
kuid_t *uid, kgid_t *gid); |
f9f852df2 Driver core: add ... |
470 |
void (*release)(struct device *dev); |
1eede070a Introduce new top... |
471 |
|
8150f32b9 Driver Core: Make... |
472 |
const struct dev_pm_ops *pm; |
f9f852df2 Driver core: add ... |
473 |
}; |
a7fd67062 [PATCH] add sysfs... |
474 475 476 477 478 479 480 481 |
/* interface for exporting device attributes */ struct device_attribute { struct attribute attr; ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf); ssize_t (*store)(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); }; |
ca22e56de driver-core: impl... |
482 483 484 485 486 487 488 489 490 491 492 493 494 |
struct dev_ext_attribute { struct device_attribute attr; void *var; }; ssize_t device_show_ulong(struct device *dev, struct device_attribute *attr, char *buf); ssize_t device_store_ulong(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); ssize_t device_show_int(struct device *dev, struct device_attribute *attr, char *buf); ssize_t device_store_int(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); |
91872392f drivers/base: Add... |
495 496 497 498 |
ssize_t device_show_bool(struct device *dev, struct device_attribute *attr, char *buf); ssize_t device_store_bool(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); |
a7fd67062 [PATCH] add sysfs... |
499 |
|
d462943af Driver core: fix ... |
500 |
#define DEVICE_ATTR(_name, _mode, _show, _store) \ |
ca22e56de driver-core: impl... |
501 |
struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store) |
ced321bf9 driver core: devi... |
502 503 504 505 |
#define DEVICE_ATTR_RW(_name) \ struct device_attribute dev_attr_##_name = __ATTR_RW(_name) #define DEVICE_ATTR_RO(_name) \ struct device_attribute dev_attr_##_name = __ATTR_RO(_name) |
ca22e56de driver-core: impl... |
506 507 508 509 510 |
#define DEVICE_ULONG_ATTR(_name, _mode, _var) \ struct dev_ext_attribute dev_attr_##_name = \ { __ATTR(_name, _mode, device_show_ulong, device_store_ulong), &(_var) } #define DEVICE_INT_ATTR(_name, _mode, _var) \ struct dev_ext_attribute dev_attr_##_name = \ |
947581856 driver-core: fix ... |
511 |
{ __ATTR(_name, _mode, device_show_int, device_store_int), &(_var) } |
91872392f drivers/base: Add... |
512 513 514 |
#define DEVICE_BOOL_ATTR(_name, _mode, _var) \ struct dev_ext_attribute dev_attr_##_name = \ { __ATTR(_name, _mode, device_show_bool, device_store_bool), &(_var) } |
356c05d58 sysfs: get rid of... |
515 516 517 |
#define DEVICE_ATTR_IGNORE_LOCKDEP(_name, _mode, _show, _store) \ struct device_attribute dev_attr_##_name = \ __ATTR_IGNORE_LOCKDEP(_name, _mode, _show, _store) |
a7fd67062 [PATCH] add sysfs... |
518 |
|
b9d4e714a driver core: remo... |
519 520 |
extern int device_create_file(struct device *device, const struct device_attribute *entry); |
d462943af Driver core: fix ... |
521 |
extern void device_remove_file(struct device *dev, |
26579ab70 Driver core: devi... |
522 |
const struct device_attribute *attr); |
2589f1887 Driver core: add ... |
523 |
extern int __must_check device_create_bin_file(struct device *dev, |
66ecb92be Driver core: bin_... |
524 |
const struct bin_attribute *attr); |
2589f1887 Driver core: add ... |
525 |
extern void device_remove_bin_file(struct device *dev, |
66ecb92be Driver core: bin_... |
526 |
const struct bin_attribute *attr); |
523ded71d device_schedule_c... |
527 |
extern int device_schedule_callback_owner(struct device *dev, |
d462943af Driver core: fix ... |
528 |
void (*func)(struct device *dev), struct module *owner); |
523ded71d device_schedule_c... |
529 530 531 532 |
/* This is a macro to avoid include problems with THIS_MODULE */ #define device_schedule_callback(dev, func) \ device_schedule_callback_owner(dev, func, THIS_MODULE) |
9ac7849e3 devres: device re... |
533 534 535 536 537 538 |
/* device resource management */ typedef void (*dr_release_t)(struct device *dev, void *res); typedef int (*dr_match_t)(struct device *dev, void *res, void *match_data); #ifdef CONFIG_DEBUG_DEVRES |
d462943af Driver core: fix ... |
539 |
extern void *__devres_alloc(dr_release_t release, size_t size, gfp_t gfp, |
9ac7849e3 devres: device re... |
540 541 542 543 |
const char *name); #define devres_alloc(release, size, gfp) \ __devres_alloc(release, size, gfp, #release) #else |
d462943af Driver core: fix ... |
544 |
extern void *devres_alloc(dr_release_t release, size_t size, gfp_t gfp); |
9ac7849e3 devres: device re... |
545 |
#endif |
bddb1b907 driver core: devr... |
546 547 548 549 |
extern void devres_for_each_res(struct device *dev, dr_release_t release, dr_match_t match, void *match_data, void (*fn)(struct device *, void *, void *), void *data); |
9ac7849e3 devres: device re... |
550 551 |
extern void devres_free(void *res); extern void devres_add(struct device *dev, void *res); |
d462943af Driver core: fix ... |
552 |
extern void *devres_find(struct device *dev, dr_release_t release, |
9ac7849e3 devres: device re... |
553 |
dr_match_t match, void *match_data); |
d462943af Driver core: fix ... |
554 555 556 557 |
extern void *devres_get(struct device *dev, void *new_res, dr_match_t match, void *match_data); extern void *devres_remove(struct device *dev, dr_release_t release, dr_match_t match, void *match_data); |
9ac7849e3 devres: device re... |
558 559 |
extern int devres_destroy(struct device *dev, dr_release_t release, dr_match_t match, void *match_data); |
d926d0e4c devres: Add devre... |
560 561 |
extern int devres_release(struct device *dev, dr_release_t release, dr_match_t match, void *match_data); |
9ac7849e3 devres: device re... |
562 563 564 565 566 567 568 569 570 571 572 |
/* devres group */ extern void * __must_check devres_open_group(struct device *dev, void *id, gfp_t gfp); extern void devres_close_group(struct device *dev, void *id); extern void devres_remove_group(struct device *dev, void *id); extern int devres_release_group(struct device *dev, void *id); /* managed kzalloc/kfree for device drivers, no kmalloc, always use kzalloc */ extern void *devm_kzalloc(struct device *dev, size_t size, gfp_t gfp); extern void devm_kfree(struct device *dev, void *p); |
75096579c lib: devres: Intr... |
573 |
void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res); |
72f8c0bfa lib: devres: add ... |
574 575 |
void __iomem *devm_request_and_ioremap(struct device *dev, struct resource *res); |
d6b0c5804 devres: allow add... |
576 577 578 |
/* allows to add/remove a custom action to devres stack */ int devm_add_action(struct device *dev, void (*action)(void *), void *data); void devm_remove_action(struct device *dev, void (*action)(void *), void *data); |
6b7b65105 iommu sg merging:... |
579 580 581 582 583 584 585 586 |
struct device_dma_parameters { /* * a low level driver may set these to teach IOMMU code about * sg limitations. */ unsigned int max_segment_size; unsigned long segment_boundary_mask; }; |
95f8a082b ACPI / driver cor... |
587 588 589 590 591 |
struct acpi_dev_node { #ifdef CONFIG_ACPI void *handle; #endif }; |
880ffb5c6 driver core: Add ... |
592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 |
/** * struct device - The basic device structure * @parent: The device's "parent" device, the device to which it is attached. * In most cases, a parent device is some sort of bus or host * controller. If parent is NULL, the device, is a top-level device, * which is not usually what you want. * @p: Holds the private data of the driver core portions of the device. * See the comment of the struct device_private for detail. * @kobj: A top-level, abstract class from which other classes are derived. * @init_name: Initial name of the device. * @type: The type of device. * This identifies the device type and carries type-specific * information. * @mutex: Mutex to synchronize calls to its driver. * @bus: Type of bus device is on. * @driver: Which driver has allocated this * @platform_data: Platform data specific to the device. * Example: For devices on custom boards, as typical of embedded * and SOC based hardware, Linux often uses platform_data to point * to board-specific structures describing devices and how they * are wired. That can include what ports are available, chip * variants, which GPIO pins act in what additional roles, and so * on. This shrinks the "Board Support Packages" (BSPs) and * minimizes board-specific #ifdefs in drivers. * @power: For device power management. * See Documentation/power/devices.txt for details. |
564b905ab PM / Domains: Ren... |
618 |
* @pm_domain: Provide callbacks that are executed during system suspend, |
880ffb5c6 driver core: Add ... |
619 620 |
* hibernation, system resume and during runtime PM transitions * along with subsystem-level and driver-level callbacks. |
ab78029ec drivers/pinctrl: ... |
621 622 |
* @pins: For device pin management. * See Documentation/pinctrl.txt for details. |
880ffb5c6 driver core: Add ... |
623 624 625 626 627 628 629 630 631 |
* @numa_node: NUMA node this device is close to. * @dma_mask: Dma mask (if dma'ble device). * @coherent_dma_mask: Like dma_mask, but for alloc_coherent mapping as not all * hardware supports 64-bit addresses for consistent allocations * such descriptors. * @dma_parms: A low level driver may set these to teach IOMMU code about * segment limitations. * @dma_pools: Dma pools (if dma'ble device). * @dma_mem: Internal for coherent mem override. |
bfd63cd24 driver core: devi... |
632 |
* @cma_area: Contiguous memory area for dma allocations |
880ffb5c6 driver core: Add ... |
633 634 |
* @archdata: For arch-specific additions. * @of_node: Associated device tree node. |
95f8a082b ACPI / driver cor... |
635 |
* @acpi_node: Associated ACPI device node. |
880ffb5c6 driver core: Add ... |
636 |
* @devt: For creating the sysfs "dev". |
2eda013f4 kernel-doc: fix n... |
637 |
* @id: device instance |
880ffb5c6 driver core: Add ... |
638 639 640 641 642 643 644 645 |
* @devres_lock: Spinlock to protect the resource of the device. * @devres_head: The resources list of the device. * @knode_class: The node used to add the device to the class list. * @class: The class of the device. * @groups: Optional attribute groups. * @release: Callback to free the device after all references have * gone away. This should be set by the allocator of the * device (i.e. the bus driver that discovered the device). |
bfd63cd24 driver core: devi... |
646 |
* @iommu_group: IOMMU group the device belongs to. |
880ffb5c6 driver core: Add ... |
647 |
* |
4f3549d72 Driver core: Add ... |
648 649 |
* @offline_disabled: If set, the device is permanently online. * @offline: Set after successful invocation of bus type's .offline(). |
880ffb5c6 driver core: Add ... |
650 651 652 653 654 655 656 657 658 |
* * At the lowest level, every device in a Linux system is represented by an * instance of struct device. The device structure contains the information * that the device model core needs to model the system. Most subsystems, * however, track additional information about the devices they host. As a * result, it is rare for devices to be represented by bare device structures; * instead, that structure, like kobject structures, is usually embedded within * a higher-level representation of the device. */ |
1da177e4c Linux-2.6.12-rc2 |
659 |
struct device { |
49a4ec188 fix hotplug for l... |
660 |
struct device *parent; |
1da177e4c Linux-2.6.12-rc2 |
661 |
|
fb069a5d1 driver core: crea... |
662 |
struct device_private *p; |
1da177e4c Linux-2.6.12-rc2 |
663 |
struct kobject kobj; |
c906a48ad driver core: add ... |
664 |
const char *init_name; /* initial name of the device */ |
aed65af1c drivers: make dev... |
665 |
const struct device_type *type; |
1da177e4c Linux-2.6.12-rc2 |
666 |
|
3142788b7 drivers/base: Con... |
667 |
struct mutex mutex; /* mutex to synchronize calls to |
af70316af [PATCH] Add a sem... |
668 669 |
* its driver. */ |
d462943af Driver core: fix ... |
670 |
struct bus_type *bus; /* type of bus device is on */ |
1da177e4c Linux-2.6.12-rc2 |
671 672 |
struct device_driver *driver; /* which driver has allocated this device */ |
e67c85626 Revert driver cor... |
673 674 |
void *platform_data; /* Platform specific data, device core doesn't touch it */ |
1da177e4c Linux-2.6.12-rc2 |
675 |
struct dev_pm_info power; |
564b905ab PM / Domains: Ren... |
676 |
struct dev_pm_domain *pm_domain; |
1da177e4c Linux-2.6.12-rc2 |
677 |
|
ab78029ec drivers/pinctrl: ... |
678 679 680 |
#ifdef CONFIG_PINCTRL struct dev_pin_info *pins; #endif |
873481367 [PATCH] add numa ... |
681 682 683 |
#ifdef CONFIG_NUMA int numa_node; /* NUMA node this device is close to */ #endif |
1da177e4c Linux-2.6.12-rc2 |
684 685 686 687 688 689 |
u64 *dma_mask; /* dma mask (if dma'able device) */ u64 coherent_dma_mask;/* Like dma_mask, but for alloc_coherent mappings as not all hardware supports 64 bit addresses for consistent allocations such descriptors. */ |
6b7b65105 iommu sg merging:... |
690 |
struct device_dma_parameters *dma_parms; |
1da177e4c Linux-2.6.12-rc2 |
691 692 693 694 |
struct list_head dma_pools; /* dma pools (if dma'ble) */ struct dma_coherent_mem *dma_mem; /* internal for coherent mem override */ |
c64be2bb1 drivers: add Cont... |
695 696 697 698 |
#ifdef CONFIG_CMA struct cma *cma_area; /* contiguous memory area for dma allocations */ #endif |
c6dbaef22 Driver core: add ... |
699 700 |
/* arch specific additions */ struct dev_archdata archdata; |
c9e358dfc driver-core: remo... |
701 702 |
struct device_node *of_node; /* associated device tree node */ |
95f8a082b ACPI / driver cor... |
703 |
struct acpi_dev_node acpi_node; /* associated ACPI device node */ |
1da177e4c Linux-2.6.12-rc2 |
704 |
|
929d2fa59 driver core: Rear... |
705 |
dev_t devt; /* dev_t, creates the sysfs "dev" */ |
ca22e56de driver-core: impl... |
706 |
u32 id; /* device instance */ |
929d2fa59 driver core: Rear... |
707 |
|
9ac7849e3 devres: device re... |
708 709 |
spinlock_t devres_lock; struct list_head devres_head; |
5a3ceb861 driver-core: use ... |
710 |
struct klist_node knode_class; |
b7a3e813f Driver core: allo... |
711 |
struct class *class; |
a4dbd6740 driver model: con... |
712 |
const struct attribute_group **groups; /* optional groups */ |
23681e479 [PATCH] Driver co... |
713 |
|
d462943af Driver core: fix ... |
714 |
void (*release)(struct device *dev); |
74416e1e0 driver core: Add ... |
715 |
struct iommu_group *iommu_group; |
4f3549d72 Driver core: Add ... |
716 717 718 |
bool offline_disabled:1; bool offline:1; |
1da177e4c Linux-2.6.12-rc2 |
719 |
}; |
a42329637 driver-core: Move... |
720 721 722 723 |
static inline struct device *kobj_to_dev(struct kobject *kobj) { return container_of(kobj, struct device, kobj); } |
95f8a082b ACPI / driver cor... |
724 725 726 727 728 729 730 |
#ifdef CONFIG_ACPI #define ACPI_HANDLE(dev) ((dev)->acpi_node.handle) #define ACPI_HANDLE_SET(dev, _handle_) (dev)->acpi_node.handle = (_handle_) #else #define ACPI_HANDLE(dev) (NULL) #define ACPI_HANDLE_SET(dev, _handle_) do { } while (0) #endif |
9a3df1f7d PM: Convert wakeu... |
731 732 |
/* Get the wakeup routines, which depend on struct device */ #include <linux/pm_wakeup.h> |
bf9ca69fc dev_printk(): con... |
733 |
static inline const char *dev_name(const struct device *dev) |
06916639e driver-core: add ... |
734 |
{ |
a636ee7fb driver core: Earl... |
735 736 737 |
/* Use the init name until the kobject becomes available */ if (dev->init_name) return dev->init_name; |
1fa5ae857 driver core: get ... |
738 |
return kobject_name(&dev->kobj); |
06916639e driver-core: add ... |
739 |
} |
b9075fa96 treewide: use __p... |
740 741 |
extern __printf(2, 3) int dev_set_name(struct device *dev, const char *name, ...); |
413c239fa driver-core: prep... |
742 |
|
873481367 [PATCH] add numa ... |
743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 |
#ifdef CONFIG_NUMA static inline int dev_to_node(struct device *dev) { return dev->numa_node; } static inline void set_dev_node(struct device *dev, int node) { dev->numa_node = node; } #else static inline int dev_to_node(struct device *dev) { return -1; } static inline void set_dev_node(struct device *dev, int node) { } #endif |
5c095a0e0 PM: Introduce str... |
761 762 763 764 |
static inline struct pm_subsys_data *dev_to_psd(struct device *dev) { return dev ? dev->power.subsys_data : NULL; } |
f67f129e5 Driver core: impl... |
765 766 767 768 769 770 771 772 773 |
static inline unsigned int dev_get_uevent_suppress(const struct device *dev) { return dev->kobj.uevent_suppress; } static inline void dev_set_uevent_suppress(struct device *dev, int val) { dev->kobj.uevent_suppress = val; } |
d305ef5d2 [PATCH] driver co... |
774 775 |
static inline int device_is_registered(struct device *dev) { |
3f62e5700 Driver core: make... |
776 |
return dev->kobj.state_in_sysfs; |
d305ef5d2 [PATCH] driver co... |
777 |
} |
5af84b827 PM: Asynchronous ... |
778 779 |
static inline void device_enable_async_suspend(struct device *dev) { |
f76b168b6 PM: Rename dev_pm... |
780 |
if (!dev->power.is_prepared) |
5af84b827 PM: Asynchronous ... |
781 782 |
dev->power.async_suspend = true; } |
5a2eb8585 PM: Add facility ... |
783 784 |
static inline void device_disable_async_suspend(struct device *dev) { |
f76b168b6 PM: Rename dev_pm... |
785 |
if (!dev->power.is_prepared) |
5a2eb8585 PM: Add facility ... |
786 787 788 789 790 791 792 |
dev->power.async_suspend = false; } static inline bool device_async_suspend_enabled(struct device *dev) { return !!dev->power.async_suspend; } |
8b258cc8a PM Sleep: Do not ... |
793 794 795 796 |
static inline void pm_suspend_ignore_children(struct device *dev, bool enable) { dev->power.ignore_children = enable; } |
feb70af0e PM: Do not use th... |
797 798 799 800 801 802 |
static inline void dev_pm_syscore_device(struct device *dev, bool val) { #ifdef CONFIG_PM_SLEEP dev->power.syscore = val; #endif } |
8e9394ce2 Driver core: crea... |
803 804 |
static inline void device_lock(struct device *dev) { |
3142788b7 drivers/base: Con... |
805 |
mutex_lock(&dev->mutex); |
8e9394ce2 Driver core: crea... |
806 807 808 809 |
} static inline int device_trylock(struct device *dev) { |
3142788b7 drivers/base: Con... |
810 |
return mutex_trylock(&dev->mutex); |
8e9394ce2 Driver core: crea... |
811 812 813 814 |
} static inline void device_unlock(struct device *dev) { |
3142788b7 drivers/base: Con... |
815 |
mutex_unlock(&dev->mutex); |
8e9394ce2 Driver core: crea... |
816 |
} |
1f21782e6 Driver core: prop... |
817 |
void driver_init(void); |
1da177e4c Linux-2.6.12-rc2 |
818 819 820 |
/* * High level routines for use by the bus drivers */ |
d462943af Driver core: fix ... |
821 822 823 824 825 826 827 828 829 |
extern int __must_check device_register(struct device *dev); extern void device_unregister(struct device *dev); extern void device_initialize(struct device *dev); extern int __must_check device_add(struct device *dev); extern void device_del(struct device *dev); extern int device_for_each_child(struct device *dev, void *data, int (*fn)(struct device *dev, void *data)); extern struct device *device_find_child(struct device *dev, void *data, int (*match)(struct device *dev, void *data)); |
6937e8f8c driver core: devi... |
830 |
extern int device_rename(struct device *dev, const char *new_name); |
ffa6a7054 Driver core: Fix ... |
831 832 |
extern int device_move(struct device *dev, struct device *new_parent, enum dpm_order dpm_order); |
e454cea20 Driver-Core: exte... |
833 |
extern const char *device_get_devnode(struct device *dev, |
4e4098a3e driver core: hand... |
834 |
umode_t *mode, kuid_t *uid, kgid_t *gid, |
3c2670e65 driver core: add ... |
835 |
const char **tmp); |
b40284378 Driver core: move... |
836 |
extern void *dev_get_drvdata(const struct device *dev); |
c87050824 driver core: let ... |
837 |
extern int dev_set_drvdata(struct device *dev, void *data); |
1da177e4c Linux-2.6.12-rc2 |
838 |
|
4f3549d72 Driver core: Add ... |
839 840 841 842 843 844 845 846 847 |
static inline bool device_supports_offline(struct device *dev) { return dev->bus && dev->bus->offline && dev->bus->online; } extern void lock_device_hotplug(void); extern void unlock_device_hotplug(void); extern int device_offline(struct device *dev); extern int device_online(struct device *dev); |
1da177e4c Linux-2.6.12-rc2 |
848 |
/* |
0aa0dc41b driver core: add ... |
849 850 851 852 |
* Root device objects for grouping under /sys/devices */ extern struct device *__root_device_register(const char *name, struct module *owner); |
eb5589a8f include: convert ... |
853 854 855 856 857 858 859 |
/* * This is a macro to avoid include problems with THIS_MODULE, * just as per what is done for device_schedule_callback() above. */ #define root_device_register(name) \ __root_device_register(name, THIS_MODULE) |
0aa0dc41b driver core: add ... |
860 |
extern void root_device_unregister(struct device *root); |
a5b8b1ada Driver core: Add ... |
861 862 863 864 |
static inline void *dev_get_platdata(const struct device *dev) { return dev->platform_data; } |
0aa0dc41b driver core: add ... |
865 |
/* |
1da177e4c Linux-2.6.12-rc2 |
866 867 868 |
* Manual binding of a device to driver. See drivers/base/bus.c * for information on use. */ |
f86db396f drivers/base: che... |
869 |
extern int __must_check device_bind_driver(struct device *dev); |
d462943af Driver core: fix ... |
870 871 |
extern void device_release_driver(struct device *dev); extern int __must_check device_attach(struct device *dev); |
f86db396f drivers/base: che... |
872 873 |
extern int __must_check driver_attach(struct device_driver *drv); extern int __must_check device_reprobe(struct device *dev); |
1da177e4c Linux-2.6.12-rc2 |
874 |
|
23681e479 [PATCH] Driver co... |
875 876 877 |
/* * Easy functions for dynamically creating devices on the fly */ |
8882b3942 Driver core: add ... |
878 879 880 881 882 883 |
extern struct device *device_create_vargs(struct class *cls, struct device *parent, dev_t devt, void *drvdata, const char *fmt, va_list vargs); |
b9075fa96 treewide: use __p... |
884 885 886 887 |
extern __printf(5, 6) struct device *device_create(struct class *cls, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...); |
39ef31120 driver core: Intr... |
888 889 890 891 892 |
extern __printf(6, 7) struct device *device_create_with_groups(struct class *cls, struct device *parent, dev_t devt, void *drvdata, const struct attribute_group **groups, const char *fmt, ...); |
23681e479 [PATCH] Driver co... |
893 |
extern void device_destroy(struct class *cls, dev_t devt); |
1da177e4c Linux-2.6.12-rc2 |
894 |
|
1da177e4c Linux-2.6.12-rc2 |
895 896 897 898 899 900 |
/* * Platform "fixup" functions - allow the platform to have their say * about devices and actions that the general device layer doesn't * know about. */ /* Notify platform of device discovery */ |
d462943af Driver core: fix ... |
901 |
extern int (*platform_notify)(struct device *dev); |
1da177e4c Linux-2.6.12-rc2 |
902 |
|
d462943af Driver core: fix ... |
903 |
extern int (*platform_notify_remove)(struct device *dev); |
1da177e4c Linux-2.6.12-rc2 |
904 |
|
880ffb5c6 driver core: Add ... |
905 |
/* |
1da177e4c Linux-2.6.12-rc2 |
906 907 908 |
* get_device - atomically increment the reference count for the device. * */ |
d462943af Driver core: fix ... |
909 910 |
extern struct device *get_device(struct device *dev); extern void put_device(struct device *dev); |
1da177e4c Linux-2.6.12-rc2 |
911 |
|
2b2af54a5 Driver Core: devt... |
912 913 914 |
#ifdef CONFIG_DEVTMPFS extern int devtmpfs_create_node(struct device *dev); extern int devtmpfs_delete_node(struct device *dev); |
073120cc2 Driver Core: devt... |
915 |
extern int devtmpfs_mount(const char *mntdir); |
2b2af54a5 Driver Core: devt... |
916 917 918 919 920 |
#else static inline int devtmpfs_create_node(struct device *dev) { return 0; } static inline int devtmpfs_delete_node(struct device *dev) { return 0; } static inline int devtmpfs_mount(const char *mountpoint) { return 0; } #endif |
116f232b3 fixed path to mov... |
921 |
/* drivers/base/power/shutdown.c */ |
1da177e4c Linux-2.6.12-rc2 |
922 |
extern void device_shutdown(void); |
1da177e4c Linux-2.6.12-rc2 |
923 |
/* debugging and troubleshooting/diagnostic helpers. */ |
bf9ca69fc dev_printk(): con... |
924 |
extern const char *dev_driver_string(const struct device *dev); |
99bcf2171 device.h drivers/... |
925 926 927 |
#ifdef CONFIG_PRINTK |
0a18b0504 device.h: Add mis... |
928 929 930 |
extern __printf(3, 0) int dev_vprintk_emit(int level, const struct device *dev, const char *fmt, va_list args); |
05e4e5b87 dev: Add dev_vpri... |
931 932 |
extern __printf(3, 4) int dev_printk_emit(int level, const struct device *dev, const char *fmt, ...); |
798efc60e dev_dbg/dynamic_d... |
933 |
|
b9075fa96 treewide: use __p... |
934 935 |
extern __printf(3, 4) int dev_printk(const char *level, const struct device *dev, |
798efc60e dev_dbg/dynamic_d... |
936 |
const char *fmt, ...); |
b9075fa96 treewide: use __p... |
937 938 939 940 941 942 943 944 945 946 947 948 949 950 |
extern __printf(2, 3) int dev_emerg(const struct device *dev, const char *fmt, ...); extern __printf(2, 3) int dev_alert(const struct device *dev, const char *fmt, ...); extern __printf(2, 3) int dev_crit(const struct device *dev, const char *fmt, ...); extern __printf(2, 3) int dev_err(const struct device *dev, const char *fmt, ...); extern __printf(2, 3) int dev_warn(const struct device *dev, const char *fmt, ...); extern __printf(2, 3) int dev_notice(const struct device *dev, const char *fmt, ...); extern __printf(2, 3) int _dev_info(const struct device *dev, const char *fmt, ...); |
99bcf2171 device.h drivers/... |
951 952 |
#else |
0a18b0504 device.h: Add mis... |
953 954 955 |
static inline __printf(3, 0) int dev_vprintk_emit(int level, const struct device *dev, const char *fmt, va_list args) |
05e4e5b87 dev: Add dev_vpri... |
956 957 958 959 |
{ return 0; } static inline __printf(3, 4) int dev_printk_emit(int level, const struct device *dev, const char *fmt, ...) { return 0; } |
cbc466355 dynamic_debug: Ad... |
960 961 |
static inline int __dev_printk(const char *level, const struct device *dev, struct va_format *vaf) |
b9075fa96 treewide: use __p... |
962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 |
{ return 0; } static inline __printf(3, 4) int dev_printk(const char *level, const struct device *dev, const char *fmt, ...) { return 0; } static inline __printf(2, 3) int dev_emerg(const struct device *dev, const char *fmt, ...) { return 0; } static inline __printf(2, 3) int dev_crit(const struct device *dev, const char *fmt, ...) { return 0; } static inline __printf(2, 3) int dev_alert(const struct device *dev, const char *fmt, ...) { return 0; } static inline __printf(2, 3) int dev_err(const struct device *dev, const char *fmt, ...) { return 0; } static inline __printf(2, 3) int dev_warn(const struct device *dev, const char *fmt, ...) { return 0; } static inline __printf(2, 3) int dev_notice(const struct device *dev, const char *fmt, ...) { return 0; } static inline __printf(2, 3) int _dev_info(const struct device *dev, const char *fmt, ...) { return 0; } |
99bcf2171 device.h drivers/... |
989 990 |
#endif |
6f586e663 driver-core: Shut... |
991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 |
/* * Stupid hackaround for existing uses of non-printk uses dev_info * * Note that the definition of dev_info below is actually _dev_info * and a macro is used to avoid redefining dev_info */ #define dev_info(dev, fmt, arg...) _dev_info(dev, fmt, ##arg) #if defined(CONFIG_DYNAMIC_DEBUG) #define dev_dbg(dev, format, ...) \ do { \ dynamic_dev_dbg(dev, format, ##__VA_ARGS__); \ } while (0) #elif defined(DEBUG) #define dev_dbg(dev, format, arg...) \ dev_printk(KERN_DEBUG, dev, format, ##arg) #else #define dev_dbg(dev, format, arg...) \ ({ \ if (0) \ dev_printk(KERN_DEBUG, dev, format, ##arg); \ 0; \ }) #endif |
6ca045930 driver core: Add ... |
1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 |
#define dev_level_ratelimited(dev_level, dev, fmt, ...) \ do { \ static DEFINE_RATELIMIT_STATE(_rs, \ DEFAULT_RATELIMIT_INTERVAL, \ DEFAULT_RATELIMIT_BURST); \ if (__ratelimit(&_rs)) \ dev_level(dev, fmt, ##__VA_ARGS__); \ } while (0) #define dev_emerg_ratelimited(dev, fmt, ...) \ dev_level_ratelimited(dev_emerg, dev, fmt, ##__VA_ARGS__) #define dev_alert_ratelimited(dev, fmt, ...) \ dev_level_ratelimited(dev_alert, dev, fmt, ##__VA_ARGS__) #define dev_crit_ratelimited(dev, fmt, ...) \ dev_level_ratelimited(dev_crit, dev, fmt, ##__VA_ARGS__) #define dev_err_ratelimited(dev, fmt, ...) \ dev_level_ratelimited(dev_err, dev, fmt, ##__VA_ARGS__) #define dev_warn_ratelimited(dev, fmt, ...) \ dev_level_ratelimited(dev_warn, dev, fmt, ##__VA_ARGS__) #define dev_notice_ratelimited(dev, fmt, ...) \ dev_level_ratelimited(dev_notice, dev, fmt, ##__VA_ARGS__) #define dev_info_ratelimited(dev, fmt, ...) \ dev_level_ratelimited(dev_info, dev, fmt, ##__VA_ARGS__) |
6f586e663 driver-core: Shut... |
1039 |
#if defined(CONFIG_DYNAMIC_DEBUG) || defined(DEBUG) |
6ca045930 driver core: Add ... |
1040 |
#define dev_dbg_ratelimited(dev, fmt, ...) \ |
6f586e663 driver-core: Shut... |
1041 1042 1043 1044 1045 1046 1047 1048 1049 |
do { \ static DEFINE_RATELIMIT_STATE(_rs, \ DEFAULT_RATELIMIT_INTERVAL, \ DEFAULT_RATELIMIT_BURST); \ DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \ if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT) && \ __ratelimit(&_rs)) \ __dynamic_pr_debug(&descriptor, pr_fmt(fmt), \ ##__VA_ARGS__); \ |
99bcf2171 device.h drivers/... |
1050 |
} while (0) |
1da177e4c Linux-2.6.12-rc2 |
1051 |
#else |
6f586e663 driver-core: Shut... |
1052 1053 |
#define dev_dbg_ratelimited(dev, fmt, ...) \ no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) |
1da177e4c Linux-2.6.12-rc2 |
1054 |
#endif |
aebdc3b45 dev_vdbg(), avail... |
1055 1056 1057 |
#ifdef VERBOSE_DEBUG #define dev_vdbg dev_dbg #else |
99bcf2171 device.h drivers/... |
1058 1059 1060 1061 1062 1063 |
#define dev_vdbg(dev, format, arg...) \ ({ \ if (0) \ dev_printk(KERN_DEBUG, dev, format, ##arg); \ 0; \ }) |
aebdc3b45 dev_vdbg(), avail... |
1064 |
#endif |
e61396627 debug: Introduce ... |
1065 |
/* |
bcdd323b8 device: add dev_W... |
1066 |
* dev_WARN*() acts like dev_printk(), but with the key difference |
e61396627 debug: Introduce ... |
1067 1068 1069 1070 1071 1072 |
* of using a WARN/WARN_ON to get the message out, including the * file/line information and a backtrace. */ #define dev_WARN(dev, format, arg...) \ WARN(1, "Device: %s " format, dev_driver_string(dev), ## arg); |
bcdd323b8 device: add dev_W... |
1073 1074 1075 1076 |
#define dev_WARN_ONCE(dev, condition, format, arg...) \ WARN_ONCE(condition, "Device %s " format, \ dev_driver_string(dev), ## arg) |
1da177e4c Linux-2.6.12-rc2 |
1077 1078 1079 1080 1081 |
/* Create alias, so I can be autoloaded. */ #define MODULE_ALIAS_CHARDEV(major,minor) \ MODULE_ALIAS("char-major-" __stringify(major) "-" __stringify(minor)) #define MODULE_ALIAS_CHARDEV_MAJOR(major) \ MODULE_ALIAS("char-major-" __stringify(major) "-*") |
e52eec13c SYSFS: Allow boot... |
1082 1083 1084 1085 1086 1087 |
#ifdef CONFIG_SYSFS_DEPRECATED extern long sysfs_deprecated; #else #define sysfs_deprecated 0 #endif |
907d0ed1c drivercore: Gener... |
1088 1089 1090 1091 1092 1093 |
/** * module_driver() - Helper macro for drivers that don't do anything * special in module init/exit. This eliminates a lot of boilerplate. * Each module may only use this macro once, and calling it replaces * module_init() and module_exit(). * |
2eda013f4 kernel-doc: fix n... |
1094 1095 1096 |
* @__driver: driver name * @__register: register function for this driver type * @__unregister: unregister function for this driver type |
cd4946188 driver-core: Allo... |
1097 |
* @...: Additional arguments to be passed to __register and __unregister. |
2eda013f4 kernel-doc: fix n... |
1098 |
* |
907d0ed1c drivercore: Gener... |
1099 1100 1101 |
* Use this macro to construct bus specific macros for registering * drivers, and do not use it on its own. */ |
cd4946188 driver-core: Allo... |
1102 |
#define module_driver(__driver, __register, __unregister, ...) \ |
907d0ed1c drivercore: Gener... |
1103 1104 |
static int __init __driver##_init(void) \ { \ |
cd4946188 driver-core: Allo... |
1105 |
return __register(&(__driver) , ##__VA_ARGS__); \ |
907d0ed1c drivercore: Gener... |
1106 1107 1108 1109 |
} \ module_init(__driver##_init); \ static void __exit __driver##_exit(void) \ { \ |
cd4946188 driver-core: Allo... |
1110 |
__unregister(&(__driver) , ##__VA_ARGS__); \ |
907d0ed1c drivercore: Gener... |
1111 1112 |
} \ module_exit(__driver##_exit); |
1da177e4c Linux-2.6.12-rc2 |
1113 |
#endif /* _DEVICE_H_ */ |