Subversion Repositories shark

Rev

Rev 422 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
422 giacomo 1
/*
2
 * Linux Plug and Play Support
3
 * Copyright by Adam Belay <ambx1@neo.rr.com>
4
 *
5
 */
6
 
7
#ifndef _LINUX_PNP_H
8
#define _LINUX_PNP_H
9
 
10
#ifdef __KERNEL__
11
 
12
#include <linux/device.h>
13
#include <linux/list.h>
14
#include <linux/errno.h>
15
 
16
#define PNP_MAX_PORT            8
17
#define PNP_MAX_MEM             4
18
#define PNP_MAX_IRQ             2
19
#define PNP_MAX_DMA             2
20
#define PNP_MAX_DEVICES         8
21
#define PNP_ID_LEN              8
22
#define PNP_NAME_LEN            50
23
 
24
struct pnp_protocol;
25
struct pnp_dev;
26
 
27
 
28
/*
29
 * Resource Management
30
 */
31
 
32
/* Use these instead of directly reading pnp_dev to get resource information */
33
#define pnp_port_start(dev,bar)   ((dev)->res.port_resource[(bar)].start)
34
#define pnp_port_end(dev,bar)     ((dev)->res.port_resource[(bar)].end)
35
#define pnp_port_flags(dev,bar)   ((dev)->res.port_resource[(bar)].flags)
36
#define pnp_port_valid(dev,bar)   (pnp_port_flags((dev),(bar)) & IORESOURCE_IO)
37
#define pnp_port_len(dev,bar) \
38
        ((pnp_port_start((dev),(bar)) == 0 &&   \
39
          pnp_port_end((dev),(bar)) ==          \
40
          pnp_port_start((dev),(bar))) ? 0 :    \
41
                                                \
42
         (pnp_port_end((dev),(bar)) -           \
43
          pnp_port_start((dev),(bar)) + 1))
44
 
45
#define pnp_mem_start(dev,bar)   ((dev)->res.mem_resource[(bar)].start)
46
#define pnp_mem_end(dev,bar)     ((dev)->res.mem_resource[(bar)].end)
47
#define pnp_mem_flags(dev,bar)   ((dev)->res.mem_resource[(bar)].flags)
48
#define pnp_mem_valid(dev,bar)   (pnp_mem_flags((dev),(bar)) & IORESOURCE_MEM)
49
#define pnp_mem_len(dev,bar) \
50
        ((pnp_mem_start((dev),(bar)) == 0 &&    \
51
          pnp_mem_end((dev),(bar)) ==           \
52
          pnp_mem_start((dev),(bar))) ? 0 :     \
53
                                                \
54
         (pnp_mem_end((dev),(bar)) -            \
55
          pnp_mem_start((dev),(bar)) + 1))
56
 
57
#define pnp_irq(dev,bar)         ((dev)->res.irq_resource[(bar)].start)
58
#define pnp_irq_flags(dev,bar)   ((dev)->res.irq_resource[(bar)].flags)
59
#define pnp_irq_valid(dev,bar)   (pnp_irq_flags((dev),(bar)) & IORESOURCE_IRQ)
60
 
61
#define pnp_dma(dev,bar)         ((dev)->res.dma_resource[(bar)].start)
62
#define pnp_dma_flags(dev,bar)   ((dev)->res.dma_resource[(bar)].flags)
63
#define pnp_dma_valid(dev,bar)   (pnp_dma_flags((dev),(bar)) & IORESOURCE_DMA)
64
 
65
#define PNP_PORT_FLAG_16BITADDR (1<<0)
66
#define PNP_PORT_FLAG_FIXED     (1<<1)
67
 
68
struct pnp_port {
69
        unsigned short min;             /* min base number */
70
        unsigned short max;             /* max base number */
71
        unsigned char align;            /* align boundary */
72
        unsigned char size;             /* size of range */
73
        unsigned char flags;            /* port flags */
74
        unsigned char pad;              /* pad */
75
        struct pnp_port *next;          /* next port */
76
};
77
 
78
struct pnp_irq {
79
        unsigned short map;             /* bitmaks for IRQ lines */
80
        unsigned char flags;            /* IRQ flags */
81
        unsigned char pad;              /* pad */
82
        struct pnp_irq *next;           /* next IRQ */
83
};
84
 
85
struct pnp_dma {
86
        unsigned char map;              /* bitmask for DMA channels */
87
        unsigned char flags;            /* DMA flags */
88
        struct pnp_dma *next;           /* next port */
89
};
90
 
91
struct pnp_mem {
92
        unsigned int min;               /* min base number */
93
        unsigned int max;               /* max base number */
94
        unsigned int align;             /* align boundary */
95
        unsigned int size;              /* size of range */
96
        unsigned char flags;            /* memory flags */
97
        unsigned char pad;              /* pad */
98
        struct pnp_mem *next;           /* next memory resource */
99
};
100
 
101
#define PNP_RES_PRIORITY_PREFERRED      0
102
#define PNP_RES_PRIORITY_ACCEPTABLE     1
103
#define PNP_RES_PRIORITY_FUNCTIONAL     2
104
#define PNP_RES_PRIORITY_INVALID        65535
105
 
106
struct pnp_option {
107
        unsigned short priority;        /* priority */
108
        struct pnp_port *port;          /* first port */
109
        struct pnp_irq *irq;            /* first IRQ */
110
        struct pnp_dma *dma;            /* first DMA */
111
        struct pnp_mem *mem;            /* first memory resource */
112
        struct pnp_option *next;        /* used to chain dependent resources */
113
};
114
 
115
struct pnp_resource_table {
116
        struct resource port_resource[PNP_MAX_PORT];
117
        struct resource mem_resource[PNP_MAX_MEM];
118
        struct resource dma_resource[PNP_MAX_DMA];
119
        struct resource irq_resource[PNP_MAX_IRQ];
120
};
121
 
122
 
123
/*
124
 * Device Managemnt
125
 */
126
 
127
struct pnp_card {
128
        struct device dev;              /* Driver Model device interface */
129
        unsigned char number;           /* used as an index, must be unique */
130
        struct list_head global_list;   /* node in global list of cards */
131
        struct list_head protocol_list; /* node in protocol's list of cards */
132
        struct list_head devices;       /* devices attached to the card */
133
 
134
        struct pnp_protocol * protocol;
135
        struct pnp_id * id;             /* contains supported EISA IDs*/
136
 
137
        char name[PNP_NAME_LEN];        /* contains a human-readable name */
138
        unsigned char   pnpver;         /* Plug & Play version */
139
        unsigned char   productver;     /* product version */
140
        unsigned int    serial;         /* serial number */
141
        unsigned char   checksum;       /* if zero - checksum passed */
142
        struct proc_dir_entry *procdir; /* directory entry in /proc/bus/isapnp */
143
};
144
 
145
#define global_to_pnp_card(n) list_entry(n, struct pnp_card, global_list)
146
#define protocol_to_pnp_card(n) list_entry(n, struct pnp_card, protocol_list)
147
#define to_pnp_card(n) container_of(n, struct pnp_card, dev)
148
#define pnp_for_each_card(card) \
149
        for((card) = global_to_pnp_card(pnp_cards.next); \
150
        (card) != global_to_pnp_card(&pnp_cards); \
151
        (card) = global_to_pnp_card((card)->global_list.next))
152
 
153
struct pnp_card_link {
154
        struct pnp_card * card;
155
        struct pnp_card_driver * driver;
156
        void * driver_data;
157
};
158
 
159
static inline void *pnp_get_card_drvdata (struct pnp_card_link *pcard)
160
{
161
        return pcard->driver_data;
162
}
163
 
164
static inline void pnp_set_card_drvdata (struct pnp_card_link *pcard, void *data)
165
{
166
        pcard->driver_data = data;
167
}
168
 
169
struct pnp_dev {
170
        struct device dev;              /* Driver Model device interface */
171
        unsigned char number;           /* used as an index, must be unique */
172
        int status;
173
 
174
        struct list_head global_list;   /* node in global list of devices */
175
        struct list_head protocol_list; /* node in list of device's protocol */
176
        struct list_head card_list;     /* node in card's list of devices */
177
        struct list_head rdev_list;     /* node in cards list of requested devices */
178
 
179
        struct pnp_protocol * protocol;
180
        struct pnp_card * card;         /* card the device is attached to, none if NULL */
181
        struct pnp_driver * driver;
182
        struct pnp_card_link * card_link;
183
 
184
        struct pnp_id   * id;   /* supported EISA IDs*/
185
 
186
        int active;
187
        int capabilities;
188
        struct pnp_option * independent;
189
        struct pnp_option * dependent;
190
        struct pnp_resource_table res;
191
 
192
        char name[PNP_NAME_LEN];        /* contains a human-readable name */
193
        unsigned short  regs;           /* ISAPnP: supported registers */
194
        int             flags;          /* used by protocols */
195
        struct proc_dir_entry *procent; /* device entry in /proc/bus/isapnp */
196
};
197
 
198
#define global_to_pnp_dev(n) list_entry(n, struct pnp_dev, global_list)
199
#define card_to_pnp_dev(n) list_entry(n, struct pnp_dev, card_list)
200
#define protocol_to_pnp_dev(n) list_entry(n, struct pnp_dev, protocol_list)
201
#define to_pnp_dev(n) container_of(n, struct pnp_dev, dev)
202
#define pnp_for_each_dev(dev) \
203
        for((dev) = global_to_pnp_dev(pnp_global.next); \
204
        (dev) != global_to_pnp_dev(&pnp_global); \
205
        (dev) = global_to_pnp_dev((dev)->global_list.next))
206
#define card_for_each_dev(card,dev) \
207
        for((dev) = card_to_pnp_dev((card)->devices.next); \
208
        (dev) != card_to_pnp_dev(&(card)->devices); \
209
        (dev) = card_to_pnp_dev((dev)->card_list.next))
210
#define pnp_dev_name(dev) (dev)->name
211
 
212
static inline void *pnp_get_drvdata (struct pnp_dev *pdev)
213
{
214
        return dev_get_drvdata(&pdev->dev);
215
}
216
 
217
static inline void pnp_set_drvdata (struct pnp_dev *pdev, void *data)
218
{
219
        dev_set_drvdata(&pdev->dev, data);
220
}
221
 
222
struct pnp_fixup {
223
        char id[7];
224
        void (*quirk_function)(struct pnp_dev *dev);    /* fixup function */
225
};
226
 
227
/* config parameters */
228
#define PNP_CONFIG_NORMAL       0x0001
229
#define PNP_CONFIG_FORCE        0x0002  /* disables validity checking */
230
 
231
/* capabilities */
232
#define PNP_READ                0x0001
233
#define PNP_WRITE               0x0002
234
#define PNP_DISABLE             0x0004
235
#define PNP_CONFIGURABLE        0x0008
236
#define PNP_REMOVABLE           0x0010
237
 
238
#define pnp_can_read(dev)       (((dev)->protocol) && ((dev)->protocol->get) && \
239
                                 ((dev)->capabilities & PNP_READ))
240
#define pnp_can_write(dev)      (((dev)->protocol) && ((dev)->protocol->set) && \
241
                                 ((dev)->capabilities & PNP_WRITE))
242
#define pnp_can_disable(dev)    (((dev)->protocol) && ((dev)->protocol->disable) && \
243
                                 ((dev)->capabilities & PNP_DISABLE))
244
#define pnp_can_configure(dev)  ((!(dev)->active) && \
245
                                 ((dev)->capabilities & PNP_CONFIGURABLE))
246
 
247
#ifdef CONFIG_ISAPNP
248
extern struct pnp_protocol isapnp_protocol;
249
#define pnp_device_is_isapnp(dev) ((dev)->protocol == (&isapnp_protocol))
250
#else
251
#define pnp_device_is_isapnp(dev) 0
252
#endif
253
 
254
#ifdef CONFIG_PNPBIOS
255
extern struct pnp_protocol pnpbios_protocol;
256
#define pnp_device_is_pnpbios(dev) ((dev)->protocol == (&pnpbios_protocol))
257
#else
258
#define pnp_device_is_pnpbios(dev) 0
259
#endif
260
 
261
 
262
/* status */
263
#define PNP_READY               0x0000
264
#define PNP_ATTACHED            0x0001
265
#define PNP_BUSY                0x0002
266
#define PNP_FAULTY              0x0004
267
 
268
/* isapnp specific macros */
269
 
270
#define isapnp_card_number(dev) ((dev)->card ? (dev)->card->number : -1)
271
#define isapnp_csn_number(dev)  ((dev)->number)
272
 
273
/*
274
 * Driver Management
275
 */
276
 
277
struct pnp_id {
278
        char id[PNP_ID_LEN];
279
        struct pnp_id * next;
280
};
281
 
282
struct pnp_device_id {
283
        char id[PNP_ID_LEN];
284
        unsigned long driver_data;      /* data private to the driver */
285
};
286
 
287
struct pnp_card_device_id {
288
        char id[PNP_ID_LEN];
289
        unsigned long driver_data;      /* data private to the driver */
290
        struct {
291
                char id[PNP_ID_LEN];
292
        } devs[PNP_MAX_DEVICES];        /* logical devices */
293
};
294
 
295
struct pnp_driver {
296
        char * name;
297
        const struct pnp_device_id *id_table;
298
        unsigned int flags;
299
        int  (*probe)  (struct pnp_dev *dev, const struct pnp_device_id *dev_id);
300
        void (*remove) (struct pnp_dev *dev);
301
        struct device_driver driver;
302
};
303
 
304
#define to_pnp_driver(drv) container_of(drv, struct pnp_driver, driver)
305
 
306
struct pnp_card_driver {
307
        struct list_head global_list;
308
        char * name;
309
        const struct pnp_card_device_id *id_table;
310
        unsigned int flags;
311
        int  (*probe)  (struct pnp_card_link *card, const struct pnp_card_device_id *card_id);
312
        void (*remove) (struct pnp_card_link *card);
313
        struct pnp_driver link;
314
};
315
 
316
#define to_pnp_card_driver(drv) container_of(drv, struct pnp_card_driver, link)
317
 
318
/* pnp driver flags */
319
#define PNP_DRIVER_RES_DO_NOT_CHANGE    0x0001  /* do not change the state of the device */
320
#define PNP_DRIVER_RES_DISABLE          0x0003  /* ensure the device is disabled */
321
 
322
 
323
/*
324
 * Protocol Management
325
 */
326
 
327
struct pnp_protocol {
328
        struct list_head        protocol_list;
329
        char                  * name;
330
 
331
        /* resource control functions */
332
        int (*get)(struct pnp_dev *dev, struct pnp_resource_table *res);
333
        int (*set)(struct pnp_dev *dev, struct pnp_resource_table *res);
334
        int (*disable)(struct pnp_dev *dev);
335
 
336
        /* used by pnp layer only (look but don't touch) */
337
        unsigned char           number;         /* protocol number*/
338
        struct device           dev;            /* link to driver model */
339
        struct list_head        cards;
340
        struct list_head        devices;
341
};
342
 
343
#define to_pnp_protocol(n) list_entry(n, struct pnp_protocol, protocol_list)
344
#define protocol_for_each_card(protocol,card) \
345
        for((card) = protocol_to_pnp_card((protocol)->cards.next); \
346
        (card) != protocol_to_pnp_card(&(protocol)->cards); \
347
        (card) = protocol_to_pnp_card((card)->protocol_list.next))
348
#define protocol_for_each_dev(protocol,dev) \
349
        for((dev) = protocol_to_pnp_dev((protocol)->devices.next); \
350
        (dev) != protocol_to_pnp_dev(&(protocol)->devices); \
351
        (dev) = protocol_to_pnp_dev((dev)->protocol_list.next))
352
 
353
 
354
#if defined(CONFIG_PNP)
355
 
356
/* device management */
357
int pnp_register_protocol(struct pnp_protocol *protocol);
358
void pnp_unregister_protocol(struct pnp_protocol *protocol);
359
int pnp_add_device(struct pnp_dev *dev);
360
void pnp_remove_device(struct pnp_dev *dev);
361
int pnp_device_attach(struct pnp_dev *pnp_dev);
362
void pnp_device_detach(struct pnp_dev *pnp_dev);
363
extern struct list_head pnp_global;
364
 
365
/* multidevice card support */
366
int pnp_add_card(struct pnp_card *card);
367
void pnp_remove_card(struct pnp_card *card);
368
int pnp_add_card_device(struct pnp_card *card, struct pnp_dev *dev);
369
void pnp_remove_card_device(struct pnp_dev *dev);
370
int pnp_add_card_id(struct pnp_id *id, struct pnp_card *card);
371
struct pnp_dev * pnp_request_card_device(struct pnp_card_link *clink, const char * id, struct pnp_dev * from);
372
void pnp_release_card_device(struct pnp_dev * dev);
373
int pnp_register_card_driver(struct pnp_card_driver * drv);
374
void pnp_unregister_card_driver(struct pnp_card_driver * drv);
375
extern struct list_head pnp_cards;
376
 
377
/* resource management */
378
struct pnp_option * pnp_register_independent_option(struct pnp_dev *dev);
379
struct pnp_option * pnp_register_dependent_option(struct pnp_dev *dev, int priority);
380
int pnp_register_irq_resource(struct pnp_option *option, struct pnp_irq *data);
381
int pnp_register_dma_resource(struct pnp_option *option, struct pnp_dma *data);
382
int pnp_register_port_resource(struct pnp_option *option, struct pnp_port *data);
383
int pnp_register_mem_resource(struct pnp_option *option, struct pnp_mem *data);
384
void pnp_init_resource_table(struct pnp_resource_table *table);
385
int pnp_assign_resources(struct pnp_dev *dev, int depnum);
386
int pnp_manual_config_dev(struct pnp_dev *dev, struct pnp_resource_table *res, int mode);
387
int pnp_auto_config_dev(struct pnp_dev *dev);
388
int pnp_validate_config(struct pnp_dev *dev);
389
int pnp_activate_dev(struct pnp_dev *dev);
390
int pnp_disable_dev(struct pnp_dev *dev);
391
void pnp_resource_change(struct resource *resource, unsigned long start, unsigned long size);
392
 
393
/* protocol helpers */
394
int pnp_is_active(struct pnp_dev * dev);
395
int compare_pnp_id(struct pnp_id * pos, const char * id);
396
int pnp_add_id(struct pnp_id *id, struct pnp_dev *dev);
397
int pnp_register_driver(struct pnp_driver *drv);
398
void pnp_unregister_driver(struct pnp_driver *drv);
399
 
400
#else
401
 
402
/* device management */
403
static inline int pnp_register_protocol(struct pnp_protocol *protocol) { return -ENODEV; }
404
static inline void pnp_unregister_protocol(struct pnp_protocol *protocol) { }
405
static inline int pnp_init_device(struct pnp_dev *dev) { return -ENODEV; }
406
static inline int pnp_add_device(struct pnp_dev *dev) { return -ENODEV; }
407
static inline void pnp_remove_device(struct pnp_dev *dev) { }
408
static inline int pnp_device_attach(struct pnp_dev *pnp_dev) { return -ENODEV; }
409
static inline void pnp_device_detach(struct pnp_dev *pnp_dev) { ; }
410
 
411
/* multidevice card support */
412
static inline int pnp_add_card(struct pnp_card *card) { return -ENODEV; }
413
static inline void pnp_remove_card(struct pnp_card *card) { ; }
414
static inline int pnp_add_card_device(struct pnp_card *card, struct pnp_dev *dev) { return -ENODEV; }
415
static inline void pnp_remove_card_device(struct pnp_dev *dev) { ; }
416
static inline int pnp_add_card_id(struct pnp_id *id, struct pnp_card *card) { return -ENODEV; }
417
static inline struct pnp_dev * pnp_request_card_device(struct pnp_card_link *clink, const char * id, struct pnp_dev * from) { return NULL; }
418
static inline void pnp_release_card_device(struct pnp_dev * dev) { ; }
419
static inline int pnp_register_card_driver(struct pnp_card_driver * drv) { return -ENODEV; }
420
static inline void pnp_unregister_card_driver(struct pnp_card_driver * drv) { ; }
421
 
422
/* resource management */
423
static inline struct pnp_option * pnp_register_independent_option(struct pnp_dev *dev) { return NULL; }
424
static inline struct pnp_option * pnp_register_dependent_option(struct pnp_dev *dev, int priority) { return NULL; }
425
static inline int pnp_register_irq_resource(struct pnp_option *option, struct pnp_irq *data) { return -ENODEV; }
426
static inline int pnp_register_dma_resource(struct pnp_option *option, struct pnp_dma *data) { return -ENODEV; }
427
static inline int pnp_register_port_resource(struct pnp_option *option, struct pnp_port *data) { return -ENODEV; }
428
static inline int pnp_register_mem_resource(struct pnp_option *option, struct pnp_mem *data) { return -ENODEV; }
429
static inline void pnp_init_resource_table(struct pnp_resource_table *table) { }
430
static inline int pnp_assign_resources(struct pnp_dev *dev, int depnum) { return -ENODEV; }
431
static inline int pnp_manual_config_dev(struct pnp_dev *dev, struct pnp_resource_table *res, int mode) { return -ENODEV; }
432
static inline int pnp_auto_config_dev(struct pnp_dev *dev) { return -ENODEV; }
433
static inline int pnp_validate_config(struct pnp_dev *dev) { return -ENODEV; }
434
static inline int pnp_activate_dev(struct pnp_dev *dev) { return -ENODEV; }
435
static inline int pnp_disable_dev(struct pnp_dev *dev) { return -ENODEV; }
436
static inline void pnp_resource_change(struct resource *resource, unsigned long start, unsigned long size) { }
437
 
438
/* protocol helpers */
439
static inline int pnp_is_active(struct pnp_dev * dev) { return 0; }
440
static inline int compare_pnp_id(struct pnp_id * pos, const char * id) { return -ENODEV; }
441
static inline int pnp_add_id(struct pnp_id *id, struct pnp_dev *dev) { return -ENODEV; }
442
static inline int pnp_register_driver(struct pnp_driver *drv) { return -ENODEV; }
443
static inline void pnp_unregister_driver(struct pnp_driver *drv) { ; }
444
 
445
#endif /* CONFIG_PNP */
446
 
447
 
448
#define pnp_err(format, arg...) printk(KERN_ERR "pnp: " format "\n" , ## arg)
449
#define pnp_info(format, arg...) printk(KERN_INFO "pnp: " format "\n" , ## arg)
450
#define pnp_warn(format, arg...) printk(KERN_WARNING "pnp: " format "\n" , ## arg)
451
 
452
#ifdef DEBUG
453
#define pnp_dbg(format, arg...) printk(KERN_DEBUG "pnp: " format "\n" , ## arg)
454
#else
455
#define pnp_dbg(format, arg...) do {} while (0)
456
#endif
457
 
458
#endif /* __KERNEL__ */
459
 
460
#endif /* _LINUX_PNP_H */