Blame view

include/linux/device.h 23.7 KB
1da177e4c   Linus Torvalds   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   Greg Kroah-Hartman   Driver core: move...
5
6
   * Copyright (c) 2004-2009 Greg Kroah-Hartman <gregkh@suse.de>
   * Copyright (c) 2008-2009 Novell Inc.
1da177e4c   Linus Torvalds   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   Linus Torvalds   Linux-2.6.12-rc2
15
16
  #include <linux/ioport.h>
  #include <linux/kobject.h>
465c7a3a3   Patrick Mochel   [PATCH] Add a kli...
17
  #include <linux/klist.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
18
  #include <linux/list.h>
d2a3b9146   Matthew Wilcox   class: add lockde...
19
  #include <linux/lockdep.h>
4a7fb6363   Andrew Morton   add __must_check ...
20
  #include <linux/compiler.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
23
  #include <linux/types.h>
  #include <linux/module.h>
  #include <linux/pm.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
  #include <asm/atomic.h>
c6dbaef22   Benjamin Herrenschmidt   Driver core: add ...
25
  #include <asm/device.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
  struct device;
fb069a5d1   Greg Kroah-Hartman   driver core: crea...
28
  struct device_private;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29
  struct device_driver;
e5dd12784   Greg Kroah-Hartman   Driver core: move...
30
  struct driver_private;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
  struct class;
7c71448b8   Greg Kroah-Hartman   class: move drive...
32
  struct class_private;
b8c5cec23   Kay Sievers   Driver core: udev...
33
  struct bus_type;
c6f7e72a3   Greg Kroah-Hartman   driver core: remo...
34
  struct bus_type_private;
d706c1b05   Grant Likely   driver-core: Add ...
35
  struct device_node;
b8c5cec23   Kay Sievers   Driver core: udev...
36
37
38
  
  struct bus_attribute {
  	struct attribute	attr;
d462943af   Greg Kroah-Hartman   Driver core: fix ...
39
40
  	ssize_t (*show)(struct bus_type *bus, char *buf);
  	ssize_t (*store)(struct bus_type *bus, const char *buf, size_t count);
b8c5cec23   Kay Sievers   Driver core: udev...
41
  };
d462943af   Greg Kroah-Hartman   Driver core: fix ...
42
43
  #define BUS_ATTR(_name, _mode, _show, _store)	\
  struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store)
b8c5cec23   Kay Sievers   Driver core: udev...
44
45
46
47
  
  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   Linus Torvalds   Linux-2.6.12-rc2
48
49
  
  struct bus_type {
d462943af   Greg Kroah-Hartman   Driver core: fix ...
50
51
52
53
54
55
56
57
58
59
60
61
  	const char		*name;
  	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);
  
  	int (*suspend)(struct device *dev, pm_message_t state);
d462943af   Greg Kroah-Hartman   Driver core: fix ...
62
  	int (*resume)(struct device *dev);
b8c5cec23   Kay Sievers   Driver core: udev...
63

8150f32b9   Dmitry Torokhov   Driver Core: Make...
64
  	const struct dev_pm_ops *pm;
1eede070a   Rafael J. Wysocki   Introduce new top...
65

c6f7e72a3   Greg Kroah-Hartman   driver core: remo...
66
  	struct bus_type_private *p;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67
  };
d462943af   Greg Kroah-Hartman   Driver core: fix ...
68
69
  extern int __must_check bus_register(struct bus_type *bus);
  extern void bus_unregister(struct bus_type *bus);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
70

d462943af   Greg Kroah-Hartman   Driver core: fix ...
71
  extern int __must_check bus_rescan_devices(struct bus_type *bus);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
72

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73
  /* iterator helpers for buses */
d462943af   Greg Kroah-Hartman   Driver core: fix ...
74
75
76
77
78
  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   Greg Kroah-Hartman   Driver core: add ...
79
80
81
  struct device *bus_find_device_by_name(struct bus_type *bus,
  				       struct device *start,
  				       const char *name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
82

cc7447a5f   Jean Delvare   Driver core: Drop...
83
84
  int bus_for_each_drv(struct bus_type *bus, struct device_driver *start,
  		     void *data, int (*fn)(struct device_driver *, void *));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85

99178b036   Greg Kroah-Hartman   Driver core: add ...
86
87
88
  void bus_sort_breadthfirst(struct bus_type *bus,
  			   int (*compare)(const struct device *a,
  					  const struct device *b));
116af3782   Benjamin Herrenschmidt   Driver core: add ...
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
  /*
   * 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   Greg Kroah-Hartman   Driver core: crea...
104
   * with the device lock held in the core, so be careful.
116af3782   Benjamin Herrenschmidt   Driver core: add ...
105
106
107
   */
  #define BUS_NOTIFY_ADD_DEVICE		0x00000001 /* device added */
  #define BUS_NOTIFY_DEL_DEVICE		0x00000002 /* device removed */
45daef0fd   Magnus Damm   Driver core: Add ...
108
109
110
111
  #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   Benjamin Herrenschmidt   Driver core: add ...
112
  						      unbound */
45daef0fd   Magnus Damm   Driver core: Add ...
113
  #define BUS_NOTIFY_UNBOUND_DRIVER	0x00000006 /* driver is unbound
309b7d60a   Joerg Roedel   driver core: add ...
114
  						      from the device */
116af3782   Benjamin Herrenschmidt   Driver core: add ...
115

0fed80f7a   Greg Kroah-Hartman   driver core: add ...
116
  extern struct kset *bus_get_kset(struct bus_type *bus);
b249072ee   Greg Kroah-Hartman   driver core: add ...
117
  extern struct klist *bus_get_device_klist(struct bus_type *bus);
0fed80f7a   Greg Kroah-Hartman   driver core: add ...
118

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
119
  struct device_driver {
e5dd12784   Greg Kroah-Hartman   Driver core: move...
120
121
  	const char		*name;
  	struct bus_type		*bus;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
122

e5dd12784   Greg Kroah-Hartman   Driver core: move...
123
  	struct module		*owner;
1a6f2a751   Dmitry Torokhov   Driver core: allo...
124
125
126
  	const char		*mod_name;	/* used for built-in modules */
  
  	bool suppress_bind_attrs;	/* disables bind/unbind via sysfs */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
127

597b9d1e4   Grant Likely   drivercore: Add o...
128
129
130
  #if defined(CONFIG_OF)
  	const struct of_device_id	*of_match_table;
  #endif
d462943af   Greg Kroah-Hartman   Driver core: fix ...
131
132
133
134
135
  	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   David Brownell   driver model: con...
136
  	const struct attribute_group **groups;
e5dd12784   Greg Kroah-Hartman   Driver core: move...
137

8150f32b9   Dmitry Torokhov   Driver Core: Make...
138
  	const struct dev_pm_ops *pm;
1eede070a   Rafael J. Wysocki   Introduce new top...
139

e5dd12784   Greg Kroah-Hartman   Driver core: move...
140
  	struct driver_private *p;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141
  };
d462943af   Greg Kroah-Hartman   Driver core: fix ...
142
143
  extern int __must_check driver_register(struct device_driver *drv);
  extern void driver_unregister(struct device_driver *drv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
144

d462943af   Greg Kroah-Hartman   Driver core: fix ...
145
146
147
148
  extern struct device_driver *get_driver(struct device_driver *drv);
  extern void put_driver(struct device_driver *drv);
  extern struct device_driver *driver_find(const char *name,
  					 struct bus_type *bus);
d779249ed   Greg Kroah-Hartman   Driver Core: add ...
149
  extern int driver_probe_done(void);
b23530ebc   Ming Lei   driver core: remo...
150
  extern void wait_for_device_probe(void);
216773a78   Arjan van de Ven   Consolidate drive...
151

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
152

405ae7d38   Robert P. J. Day   Replace remaining...
153
  /* sysfs interface for exporting driver attributes */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
154
155
  
  struct driver_attribute {
d462943af   Greg Kroah-Hartman   Driver core: fix ...
156
157
158
159
  	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   Linus Torvalds   Linux-2.6.12-rc2
160
  };
d462943af   Greg Kroah-Hartman   Driver core: fix ...
161
162
163
  #define DRIVER_ATTR(_name, _mode, _show, _store)	\
  struct driver_attribute driver_attr_##_name =		\
  	__ATTR(_name, _mode, _show, _store)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164

d462943af   Greg Kroah-Hartman   Driver core: fix ...
165
  extern int __must_check driver_create_file(struct device_driver *driver,
099c2f21d   Phil Carmody   Driver core: driv...
166
  					const struct driver_attribute *attr);
d462943af   Greg Kroah-Hartman   Driver core: fix ...
167
  extern void driver_remove_file(struct device_driver *driver,
099c2f21d   Phil Carmody   Driver core: driv...
168
  			       const struct driver_attribute *attr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
169

cbe9c595f   Greg Kroah-Hartman   Driver: add drive...
170
171
172
  extern int __must_check driver_add_kobj(struct device_driver *drv,
  					struct kobject *kobj,
  					const char *fmt, ...);
d462943af   Greg Kroah-Hartman   Driver core: fix ...
173
174
175
176
177
178
179
180
  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   Patrick Mochel   [PATCH] Add drive...
181

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
182
183
184
185
  /*
   * device classes
   */
  struct class {
d462943af   Greg Kroah-Hartman   Driver core: fix ...
186
187
  	const char		*name;
  	struct module		*owner;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
188

d462943af   Greg Kroah-Hartman   Driver core: fix ...
189
  	struct class_attribute		*class_attrs;
d462943af   Greg Kroah-Hartman   Driver core: fix ...
190
  	struct device_attribute		*dev_attrs;
e105b8bfc   Dan Williams   sysfs: add /sys/d...
191
  	struct kobject			*dev_kobj;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
192

d462943af   Greg Kroah-Hartman   Driver core: fix ...
193
  	int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env);
e454cea20   Kay Sievers   Driver-Core: exte...
194
  	char *(*devnode)(struct device *dev, mode_t *mode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
195

d462943af   Greg Kroah-Hartman   Driver core: fix ...
196
197
  	void (*class_release)(struct class *class);
  	void (*dev_release)(struct device *dev);
7c8265f51   Linus Torvalds   Suspend infrastru...
198

d462943af   Greg Kroah-Hartman   Driver core: fix ...
199
200
  	int (*suspend)(struct device *dev, pm_message_t state);
  	int (*resume)(struct device *dev);
1eede070a   Rafael J. Wysocki   Introduce new top...
201

bc451f205   Eric W. Biederman   kobj: Add basic i...
202
203
  	const struct kobj_ns_type_operations *ns_type;
  	const void *(*namespace)(struct device *dev);
8150f32b9   Dmitry Torokhov   Driver Core: Make...
204
  	const struct dev_pm_ops *pm;
7c71448b8   Greg Kroah-Hartman   class: move drive...
205
  	struct class_private *p;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
206
  };
5a3ceb861   Tejun Heo   driver-core: use ...
207
208
209
210
  struct class_dev_iter {
  	struct klist_iter		ki;
  	const struct device_type	*type;
  };
e105b8bfc   Dan Williams   sysfs: add /sys/d...
211
212
  extern struct kobject *sysfs_dev_block_kobj;
  extern struct kobject *sysfs_dev_char_kobj;
d2a3b9146   Matthew Wilcox   class: add lockde...
213
214
  extern int __must_check __class_register(struct class *class,
  					 struct lock_class_key *key);
d462943af   Greg Kroah-Hartman   Driver core: fix ...
215
  extern void class_unregister(struct class *class);
d2a3b9146   Matthew Wilcox   class: add lockde...
216
217
218
219
220
221
222
223
  
  /* 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   Jean Delvare   Driver core: Add ...
224
225
226
227
228
229
230
  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);
5a3ceb861   Tejun Heo   driver-core: use ...
231
232
233
234
235
236
  extern void class_dev_iter_init(struct class_dev_iter *iter,
  				struct class *class,
  				struct device *start,
  				const struct device_type *type);
  extern struct device *class_dev_iter_next(struct class_dev_iter *iter);
  extern void class_dev_iter_exit(struct class_dev_iter *iter);
93562b537   Greg Kroah-Hartman   Driver Core: add ...
237
238
  extern int class_for_each_device(struct class *class, struct device *start,
  				 void *data,
fd04897bb   Dave Young   Driver Core: add ...
239
  				 int (*fn)(struct device *dev, void *data));
695794ae0   Greg Kroah-Hartman   Driver Core: add ...
240
241
  extern struct device *class_find_device(struct class *class,
  					struct device *start, void *data,
fd04897bb   Dave Young   Driver Core: add ...
242
  					int (*match)(struct device *, void *));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
243
244
  
  struct class_attribute {
d462943af   Greg Kroah-Hartman   Driver core: fix ...
245
  	struct attribute attr;
28812fe11   Andi Kleen   driver-core: Add ...
246
247
248
249
  	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);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
250
  };
d462943af   Greg Kroah-Hartman   Driver core: fix ...
251
252
  #define CLASS_ATTR(_name, _mode, _show, _store)			\
  struct class_attribute class_attr_##_name = __ATTR(_name, _mode, _show, _store)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
253

d462943af   Greg Kroah-Hartman   Driver core: fix ...
254
255
256
257
  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   Linus Torvalds   Linux-2.6.12-rc2
258

869dfc875   Andi Kleen   driver core: Add ...
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
  /* Simple class attribute that is just a static string */
  
  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   Linus Torvalds   Linux-2.6.12-rc2
275
276
277
  struct class_interface {
  	struct list_head	node;
  	struct class		*class;
c47ed219b   Greg Kroah-Hartman   Class: add suppor...
278
279
  	int (*add_dev)		(struct device *, struct class_interface *);
  	void (*remove_dev)	(struct device *, struct class_interface *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
280
  };
4a7fb6363   Andrew Morton   add __must_check ...
281
  extern int __must_check class_interface_register(struct class_interface *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
282
  extern void class_interface_unregister(struct class_interface *);
d2a3b9146   Matthew Wilcox   class: add lockde...
283
284
285
  extern struct class * __must_check __class_create(struct module *owner,
  						  const char *name,
  						  struct lock_class_key *key);
e9ba6365f   Greg Kroah-Hartman   [PATCH] CLASS: mo...
286
  extern void class_destroy(struct class *cls);
e9ba6365f   Greg Kroah-Hartman   [PATCH] CLASS: mo...
287

d2a3b9146   Matthew Wilcox   class: add lockde...
288
289
290
291
292
293
294
  /* 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   Kay Sievers   Driver core: add ...
295
296
297
298
299
300
301
302
303
  /*
   * 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   Kay Sievers   Driver core: add ...
304
  struct device_type {
414264f95   Kay Sievers   Driver core: add ...
305
  	const char *name;
a4dbd6740   David Brownell   driver model: con...
306
  	const struct attribute_group **groups;
7eff2e7a8   Kay Sievers   Driver core: chan...
307
  	int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
e454cea20   Kay Sievers   Driver-Core: exte...
308
  	char *(*devnode)(struct device *dev, mode_t *mode);
f9f852df2   Kay Sievers   Driver core: add ...
309
  	void (*release)(struct device *dev);
1eede070a   Rafael J. Wysocki   Introduce new top...
310

8150f32b9   Dmitry Torokhov   Driver Core: Make...
311
  	const struct dev_pm_ops *pm;
f9f852df2   Kay Sievers   Driver core: add ...
312
  };
a7fd67062   Kay Sievers   [PATCH] add sysfs...
313
314
315
316
317
318
319
320
  /* 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);
  };
d462943af   Greg Kroah-Hartman   Driver core: fix ...
321
322
  #define DEVICE_ATTR(_name, _mode, _show, _store) \
  struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)
a7fd67062   Kay Sievers   [PATCH] add sysfs...
323

4a7fb6363   Andrew Morton   add __must_check ...
324
  extern int __must_check device_create_file(struct device *device,
66ecb92be   Phil Carmody   Driver core: bin_...
325
  					const struct device_attribute *entry);
d462943af   Greg Kroah-Hartman   Driver core: fix ...
326
  extern void device_remove_file(struct device *dev,
26579ab70   Phil Carmody   Driver core: devi...
327
  			       const struct device_attribute *attr);
2589f1887   Greg Kroah-Hartman   Driver core: add ...
328
  extern int __must_check device_create_bin_file(struct device *dev,
66ecb92be   Phil Carmody   Driver core: bin_...
329
  					const struct bin_attribute *attr);
2589f1887   Greg Kroah-Hartman   Driver core: add ...
330
  extern void device_remove_bin_file(struct device *dev,
66ecb92be   Phil Carmody   Driver core: bin_...
331
  				   const struct bin_attribute *attr);
523ded71d   Alan Stern   device_schedule_c...
332
  extern int device_schedule_callback_owner(struct device *dev,
d462943af   Greg Kroah-Hartman   Driver core: fix ...
333
  		void (*func)(struct device *dev), struct module *owner);
523ded71d   Alan Stern   device_schedule_c...
334
335
336
337
  
  /* 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   Tejun Heo   devres: device re...
338
339
340
341
342
343
  
  /* 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   Greg Kroah-Hartman   Driver core: fix ...
344
  extern void *__devres_alloc(dr_release_t release, size_t size, gfp_t gfp,
9ac7849e3   Tejun Heo   devres: device re...
345
346
347
348
  			     const char *name);
  #define devres_alloc(release, size, gfp) \
  	__devres_alloc(release, size, gfp, #release)
  #else
d462943af   Greg Kroah-Hartman   Driver core: fix ...
349
  extern void *devres_alloc(dr_release_t release, size_t size, gfp_t gfp);
9ac7849e3   Tejun Heo   devres: device re...
350
351
352
  #endif
  extern void devres_free(void *res);
  extern void devres_add(struct device *dev, void *res);
d462943af   Greg Kroah-Hartman   Driver core: fix ...
353
  extern void *devres_find(struct device *dev, dr_release_t release,
9ac7849e3   Tejun Heo   devres: device re...
354
  			 dr_match_t match, void *match_data);
d462943af   Greg Kroah-Hartman   Driver core: fix ...
355
356
357
358
  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   Tejun Heo   devres: device re...
359
360
361
362
363
364
365
366
367
368
369
370
371
  extern int devres_destroy(struct device *dev, dr_release_t release,
  			  dr_match_t match, void *match_data);
  
  /* 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);
6b7b65105   FUJITA Tomonori   iommu sg merging:...
372
373
374
375
376
377
378
379
  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;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
380
  struct device {
49a4ec188   David Brownell   fix hotplug for l...
381
  	struct device		*parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
382

fb069a5d1   Greg Kroah-Hartman   driver core: crea...
383
  	struct device_private	*p;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
384
  	struct kobject kobj;
c906a48ad   Greg Kroah-Hartman   driver core: add ...
385
  	const char		*init_name; /* initial name of the device */
f9f852df2   Kay Sievers   Driver core: add ...
386
  	struct device_type	*type;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
387

3142788b7   Thomas Gleixner   drivers/base: Con...
388
  	struct mutex		mutex;	/* mutex to synchronize calls to
af70316af   Patrick Mochel   [PATCH] Add a sem...
389
390
  					 * its driver.
  					 */
d462943af   Greg Kroah-Hartman   Driver core: fix ...
391
  	struct bus_type	*bus;		/* type of bus device is on */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
392
393
  	struct device_driver *driver;	/* which driver has allocated this
  					   device */
e67c85626   Greg Kroah-Hartman   Revert driver cor...
394
395
  	void		*platform_data;	/* Platform specific data, device
  					   core doesn't touch it */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
396
  	struct dev_pm_info	power;
873481367   Christoph Hellwig   [PATCH] add numa ...
397
398
399
  #ifdef CONFIG_NUMA
  	int		numa_node;	/* NUMA node this device is close to */
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
400
401
402
403
404
405
  	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   FUJITA Tomonori   iommu sg merging:...
406
  	struct device_dma_parameters *dma_parms;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
407
408
409
410
  	struct list_head	dma_pools;	/* dma pools (if dma'ble) */
  
  	struct dma_coherent_mem	*dma_mem; /* internal for coherent mem
  					     override */
c6dbaef22   Benjamin Herrenschmidt   Driver core: add ...
411
412
  	/* arch specific additions */
  	struct dev_archdata	archdata;
d706c1b05   Grant Likely   driver-core: Add ...
413
414
415
  #ifdef CONFIG_OF
  	struct device_node	*of_node;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
416

929d2fa59   Matthew Wilcox   driver core: Rear...
417
  	dev_t			devt;	/* dev_t, creates the sysfs "dev" */
9ac7849e3   Tejun Heo   devres: device re...
418
419
  	spinlock_t		devres_lock;
  	struct list_head	devres_head;
5a3ceb861   Tejun Heo   driver-core: use ...
420
  	struct klist_node	knode_class;
b7a3e813f   Kay Sievers   Driver core: allo...
421
  	struct class		*class;
a4dbd6740   David Brownell   driver model: con...
422
  	const struct attribute_group **groups;	/* optional groups */
23681e479   Greg Kroah-Hartman   [PATCH] Driver co...
423

d462943af   Greg Kroah-Hartman   Driver core: fix ...
424
  	void	(*release)(struct device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
425
  };
9a3df1f7d   Alan Stern   PM: Convert wakeu...
426
427
  /* Get the wakeup routines, which depend on struct device */
  #include <linux/pm_wakeup.h>
bf9ca69fc   Jean Delvare   dev_printk(): con...
428
  static inline const char *dev_name(const struct device *dev)
06916639e   Kay Sievers   driver-core: add ...
429
  {
a636ee7fb   Paul Mundt   driver core: Earl...
430
431
432
  	/* Use the init name until the kobject becomes available */
  	if (dev->init_name)
  		return dev->init_name;
1fa5ae857   Kay Sievers   driver core: get ...
433
  	return kobject_name(&dev->kobj);
06916639e   Kay Sievers   driver-core: add ...
434
  }
413c239fa   Stephen Rothwell   driver-core: prep...
435
436
  extern int dev_set_name(struct device *dev, const char *name, ...)
  			__attribute__((format(printf, 2, 3)));
873481367   Christoph Hellwig   [PATCH] add numa ...
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
  #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
f67f129e5   Ming Lei   Driver core: impl...
455
456
457
458
459
460
461
462
463
  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   Daniel Ritz   [PATCH] driver co...
464
465
  static inline int device_is_registered(struct device *dev)
  {
3f62e5700   Greg Kroah-Hartman   Driver core: make...
466
  	return dev->kobj.state_in_sysfs;
d305ef5d2   Daniel Ritz   [PATCH] driver co...
467
  }
5af84b827   Rafael J. Wysocki   PM: Asynchronous ...
468
469
470
471
472
  static inline void device_enable_async_suspend(struct device *dev)
  {
  	if (dev->power.status == DPM_ON)
  		dev->power.async_suspend = true;
  }
5a2eb8585   Rafael J. Wysocki   PM: Add facility ...
473
474
475
476
477
478
479
480
481
482
  static inline void device_disable_async_suspend(struct device *dev)
  {
  	if (dev->power.status == DPM_ON)
  		dev->power.async_suspend = false;
  }
  
  static inline bool device_async_suspend_enabled(struct device *dev)
  {
  	return !!dev->power.async_suspend;
  }
8e9394ce2   Greg Kroah-Hartman   Driver core: crea...
483
484
  static inline void device_lock(struct device *dev)
  {
3142788b7   Thomas Gleixner   drivers/base: Con...
485
  	mutex_lock(&dev->mutex);
8e9394ce2   Greg Kroah-Hartman   Driver core: crea...
486
487
488
489
  }
  
  static inline int device_trylock(struct device *dev)
  {
3142788b7   Thomas Gleixner   drivers/base: Con...
490
  	return mutex_trylock(&dev->mutex);
8e9394ce2   Greg Kroah-Hartman   Driver core: crea...
491
492
493
494
  }
  
  static inline void device_unlock(struct device *dev)
  {
3142788b7   Thomas Gleixner   drivers/base: Con...
495
  	mutex_unlock(&dev->mutex);
8e9394ce2   Greg Kroah-Hartman   Driver core: crea...
496
  }
1f21782e6   Adrian Bunk   Driver core: prop...
497
  void driver_init(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
498
499
500
  /*
   * High level routines for use by the bus drivers
   */
d462943af   Greg Kroah-Hartman   Driver core: fix ...
501
502
503
504
505
506
507
508
509
  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   Johannes Berg   driver core: devi...
510
  extern int device_rename(struct device *dev, const char *new_name);
ffa6a7054   Cornelia Huck   Driver core: Fix ...
511
512
  extern int device_move(struct device *dev, struct device *new_parent,
  		       enum dpm_order dpm_order);
e454cea20   Kay Sievers   Driver-Core: exte...
513
514
  extern const char *device_get_devnode(struct device *dev,
  				      mode_t *mode, const char **tmp);
b40284378   Greg Kroah-Hartman   Driver core: move...
515
516
  extern void *dev_get_drvdata(const struct device *dev);
  extern void dev_set_drvdata(struct device *dev, void *data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
517
518
  
  /*
0aa0dc41b   Mark McLoughlin   driver core: add ...
519
520
521
522
523
524
525
526
527
   * Root device objects for grouping under /sys/devices
   */
  extern struct device *__root_device_register(const char *name,
  					     struct module *owner);
  static inline struct device *root_device_register(const char *name)
  {
  	return __root_device_register(name, THIS_MODULE);
  }
  extern void root_device_unregister(struct device *root);
a5b8b1ada   Mark Brown   Driver core: Add ...
528
529
530
531
  static inline void *dev_get_platdata(const struct device *dev)
  {
  	return dev->platform_data;
  }
0aa0dc41b   Mark McLoughlin   driver core: add ...
532
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
533
534
535
   * Manual binding of a device to driver. See drivers/base/bus.c
   * for information on use.
   */
f86db396f   Andrew Morton   drivers/base: che...
536
  extern int __must_check device_bind_driver(struct device *dev);
d462943af   Greg Kroah-Hartman   Driver core: fix ...
537
538
  extern void device_release_driver(struct device *dev);
  extern int  __must_check device_attach(struct device *dev);
f86db396f   Andrew Morton   drivers/base: che...
539
540
  extern int __must_check driver_attach(struct device_driver *drv);
  extern int __must_check device_reprobe(struct device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
541

23681e479   Greg Kroah-Hartman   [PATCH] Driver co...
542
543
544
  /*
   * Easy functions for dynamically creating devices on the fly
   */
8882b3942   Greg Kroah-Hartman   Driver core: add ...
545
546
547
548
549
550
  extern struct device *device_create_vargs(struct class *cls,
  					  struct device *parent,
  					  dev_t devt,
  					  void *drvdata,
  					  const char *fmt,
  					  va_list vargs);
4e1067394   Greg Kroah-Hartman   device create: co...
551
552
553
  extern struct device *device_create(struct class *cls, struct device *parent,
  				    dev_t devt, void *drvdata,
  				    const char *fmt, ...)
8882b3942   Greg Kroah-Hartman   Driver core: add ...
554
  				    __attribute__((format(printf, 5, 6)));
23681e479   Greg Kroah-Hartman   [PATCH] Driver co...
555
  extern void device_destroy(struct class *cls, dev_t devt);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
556

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
557
558
559
560
561
562
  /*
   * 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   Greg Kroah-Hartman   Driver core: fix ...
563
  extern int (*platform_notify)(struct device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
564

d462943af   Greg Kroah-Hartman   Driver core: fix ...
565
  extern int (*platform_notify_remove)(struct device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
566
567
568
569
570
571
  
  
  /**
   * get_device - atomically increment the reference count for the device.
   *
   */
d462943af   Greg Kroah-Hartman   Driver core: fix ...
572
573
  extern struct device *get_device(struct device *dev);
  extern void put_device(struct device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
574

d4d5291c8   Arjan van de Ven   driver synchroniz...
575
  extern void wait_for_device_probe(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
576

2b2af54a5   Kay Sievers   Driver Core: devt...
577
578
579
  #ifdef CONFIG_DEVTMPFS
  extern int devtmpfs_create_node(struct device *dev);
  extern int devtmpfs_delete_node(struct device *dev);
073120cc2   Kay Sievers   Driver Core: devt...
580
  extern int devtmpfs_mount(const char *mntdir);
2b2af54a5   Kay Sievers   Driver Core: devt...
581
582
583
584
585
  #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   Rytchkov Alexey   fixed path to mov...
586
  /* drivers/base/power/shutdown.c */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
587
  extern void device_shutdown(void);
58b3b71df   Rafael J. Wysocki   Fix ThinkPad T42 ...
588
589
  /* drivers/base/sys.c */
  extern void sysdev_shutdown(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
590
  /* debugging and troubleshooting/diagnostic helpers. */
bf9ca69fc   Jean Delvare   dev_printk(): con...
591
  extern const char *dev_driver_string(const struct device *dev);
99bcf2171   Joe Perches   device.h drivers/...
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
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
  
  
  #ifdef CONFIG_PRINTK
  
  extern int dev_printk(const char *level, const struct device *dev,
  		      const char *fmt, ...)
  	__attribute__ ((format (printf, 3, 4)));
  extern int dev_emerg(const struct device *dev, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
  extern int dev_alert(const struct device *dev, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
  extern int dev_crit(const struct device *dev, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
  extern int dev_err(const struct device *dev, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
  extern int dev_warn(const struct device *dev, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
  extern int dev_notice(const struct device *dev, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
  extern int _dev_info(const struct device *dev, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
  
  #else
  
  static inline int dev_printk(const char *level, const struct device *dev,
  		      const char *fmt, ...)
  	__attribute__ ((format (printf, 3, 4)));
  static inline int dev_printk(const char *level, const struct device *dev,
  		      const char *fmt, ...)
  	 { return 0; }
  
  static inline int dev_emerg(const struct device *dev, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
  static inline int dev_emerg(const struct device *dev, const char *fmt, ...)
  	{ return 0; }
  static inline int dev_crit(const struct device *dev, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
  static inline int dev_crit(const struct device *dev, const char *fmt, ...)
  	{ return 0; }
  static inline int dev_alert(const struct device *dev, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
  static inline int dev_alert(const struct device *dev, const char *fmt, ...)
  	{ return 0; }
  static inline int dev_err(const struct device *dev, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
  static inline int dev_err(const struct device *dev, const char *fmt, ...)
  	{ return 0; }
  static inline int dev_warn(const struct device *dev, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
  static inline int dev_warn(const struct device *dev, const char *fmt, ...)
  	{ return 0; }
  static inline int dev_notice(const struct device *dev, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
  static inline int dev_notice(const struct device *dev, const char *fmt, ...)
  	{ return 0; }
  static inline int _dev_info(const struct device *dev, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
  static inline int _dev_info(const struct device *dev, const char *fmt, ...)
  	{ return 0; }
  
  #endif
  
  /*
   * 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)
7b8712e56   Emil Medve   driver core: Make...
662

d0d85ff98   Cornelia Huck   Make DEBUG take p...
663
664
  #if defined(DEBUG)
  #define dev_dbg(dev, format, arg...)		\
99bcf2171   Joe Perches   device.h drivers/...
665
  	dev_printk(KERN_DEBUG, dev, format, ##arg)
e9d376f0f   Jason Baron   dynamic debug: co...
666
  #elif defined(CONFIG_DYNAMIC_DEBUG)
99bcf2171   Joe Perches   device.h drivers/...
667
668
  #define dev_dbg(dev, format, ...)		     \
  do {						     \
346e15beb   Jason Baron   driver core: basi...
669
  	dynamic_dev_dbg(dev, format, ##__VA_ARGS__); \
99bcf2171   Joe Perches   device.h drivers/...
670
  } while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
671
  #else
99bcf2171   Joe Perches   device.h drivers/...
672
673
674
675
676
677
  #define dev_dbg(dev, format, arg...)				\
  ({								\
  	if (0)							\
  		dev_printk(KERN_DEBUG, dev, format, ##arg);	\
  	0;							\
  })
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
678
  #endif
aebdc3b45   David Brownell   dev_vdbg(), avail...
679
680
681
  #ifdef VERBOSE_DEBUG
  #define dev_vdbg	dev_dbg
  #else
99bcf2171   Joe Perches   device.h drivers/...
682
683
684
685
686
687
  #define dev_vdbg(dev, format, arg...)				\
  ({								\
  	if (0)							\
  		dev_printk(KERN_DEBUG, dev, format, ##arg);	\
  	0;							\
  })
aebdc3b45   David Brownell   dev_vdbg(), avail...
688
  #endif
e61396627   Arjan van de Ven   debug: Introduce ...
689
690
691
692
693
694
695
696
  /*
   * dev_WARN() acts like dev_printk(), but with the key difference
   * 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);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
697
698
699
700
701
702
  /* 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) "-*")
  #endif /* _DEVICE_H_ */