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