source: GPL/trunk/include/linux/pnp.h@ 276

Last change on this file since 276 was 249, checked in by Brendan Oakley, 18 years ago

Use pnp.h from ALSA 1.0.14 instead

  • Property svn:eol-style set to native
File size: 7.5 KB
Line 
1/*
2 * Linux Plug and Play Support
3 * Copyright by Adam Belay <ambx1@neo.rr.com>
4 *
5 * Reduced and backported for compatibility reasons for 2.2 and
6 * 2.4 kernels by Jaroslav Kysela <perex@suse.cz>
7 *
8 */
9
10#ifndef _LINUX_PNP_H
11#define _LINUX_PNP_H
12
13#ifdef __KERNEL__
14
15#ifndef TARGET_OS2
16#include <linux/isapnp.h>
17#else /* TARGET_OS2 */
18#include <sound/isapnp.h>
19#endif /* TARGET_OS2 */
20#include <linux/list.h>
21
22#define PNP_MAX_PORT 8
23#define PNP_MAX_MEM 4
24#define PNP_MAX_IRQ 2
25#define PNP_MAX_DMA 2
26#define PNP_MAX_DEVICES 8
27#define PNP_ID_LEN 8
28
29#ifndef ISAPNP_ALSA_LOCAL
30#define isapnp_dev pci_dev
31#define isapnp_card pci_bus
32#endif
33
34struct pnp_card {
35 struct isapnp_card p;
36};
37
38struct pnp_dev {
39 struct isapnp_dev p;
40 void * driver_data;
41 struct pm_dev *pm;
42};
43
44static inline void *pnp_get_drvdata (struct pnp_dev *dev)
45{
46 return dev->driver_data;
47}
48
49static inline void pnp_set_drvdata (struct pnp_dev *dev, void *data)
50{
51 dev->driver_data = data;
52}
53
54/*
55 * Resource Management
56 */
57
58/* Use these instead of directly reading pnp_dev to get resource information */
59#define pnp_port_start(dev,bar) ((dev)->p.resource[(bar)].start)
60#define pnp_port_end(dev,bar) ((dev)->p.resource[(bar)].end)
61#define pnp_port_flags(dev,bar) ((dev)->p.resource[(bar)].flags)
62#define pnp_port_valid(dev,bar) (pnp_port_flags((dev),(bar)) & IORESOURCE_IO)
63#define pnp_port_len(dev,bar) \
64 ((pnp_port_start((dev),(bar)) == 0 && \
65 pnp_port_end((dev),(bar)) == \
66 pnp_port_start((dev),(bar))) ? 0 : \
67 \
68 (pnp_port_end((dev),(bar)) - \
69 pnp_port_start((dev),(bar)) + 1))
70
71#define pnp_mem_start(dev,bar) ((dev)->p.resource[(bar)+8].start)
72#define pnp_mem_end(dev,bar) ((dev)->p.resource[(bar)+8].end)
73#define pnp_mem_flags(dev,bar) ((dev)->p.resource[(bar)+8].flags)
74#define pnp_mem_valid(dev,bar) (pnp_mem_flags((dev),(bar)) & IORESOURCE_MEM)
75#define pnp_mem_len(dev,bar) \
76 ((pnp_mem_start((dev),(bar)) == 0 && \
77 pnp_mem_end((dev),(bar)) == \
78 pnp_mem_start((dev),(bar))) ? 0 : \
79 \
80 (pnp_mem_end((dev),(bar)) - \
81 pnp_mem_start((dev),(bar)) + 1))
82
83#define pnp_irq(dev,bar) ((dev)->p.irq_resource[(bar)].start)
84#define pnp_irq_flags(dev,bar) ((dev)->p.irq_resource[(bar)].flags)
85#define pnp_irq_valid(dev,bar) (pnp_irq_flags((dev),(bar)) & IORESOURCE_IRQ)
86
87#define pnp_dma(dev,bar) ((dev)->p.dma_resource[(bar)].start)
88#define pnp_dma_flags(dev,bar) ((dev)->p.dma_resource[(bar)].flags)
89#define pnp_dma_valid(dev,bar) (pnp_dma_flags((dev),(bar)) & IORESOURCE_DMA)
90
91#define PNP_PORT_FLAG_16BITADDR ISAPNP_PORT_FLAG_16BITADDR
92#define PNP_PORT_FLAG_FIXED ISAPNP_PORT_FLAG_FIXED
93
94#define PNP_RES_PRIORITY_PREFERRED ISAPNP_RES_PRIORITY_PREFERRED
95#define PNP_RES_PRIORITY_ACCEPTABLE ISAPNP_RES_PRIORITY_ACCEPTABLE
96#define PNP_RES_PRIORITY_FUNCTIONAL ISAPNP_RES_PRIORITY_FUNCTIONAL
97#define PNP_RES_PRIORITY_INVALID ISAPNP_RES_PRIORITY_INVALID
98
99struct pnp_resource_table {
100 struct resource port_resource[PNP_MAX_PORT];
101 struct resource mem_resource[PNP_MAX_MEM];
102 struct resource dma_resource[PNP_MAX_DMA];
103 struct resource irq_resource[PNP_MAX_IRQ];
104};
105
106
107/*
108 * Device Managemnt
109 */
110
111struct pnp_card_link {
112 struct pnp_card * card;
113 struct pnp_card_driver * driver;
114 void * driver_data;
115 struct pm_dev *pm;
116};
117
118static inline void *pnp_get_card_drvdata (struct pnp_card_link *pcard)
119{
120 return pcard->driver_data;
121}
122
123static inline void pnp_set_card_drvdata (struct pnp_card_link *pcard, void *data)
124{
125 pcard->driver_data = data;
126}
127
128struct pnp_fixup {
129 char id[7];
130 void (*quirk_function)(struct pnp_dev *dev); /* fixup function */
131};
132
133/* config modes */
134#define PNP_CONFIG_AUTO 0x0001 /* Use the Resource Configuration Engine to determine resource settings */
135#define PNP_CONFIG_MANUAL 0x0002 /* the config has been manually specified */
136#define PNP_CONFIG_FORCE 0x0004 /* disables validity checking */
137#define PNP_CONFIG_INVALID 0x0008 /* If this flag is set, the pnp layer will refuse to activate the device */
138
139/* capabilities */
140#define PNP_READ 0x0001
141#define PNP_WRITE 0x0002
142#define PNP_DISABLE 0x0004
143#define PNP_CONFIGURABLE 0x0008
144#define PNP_REMOVABLE 0x0010
145
146#define pnp_can_read(dev) 1
147#define pnp_can_write(dev) 1
148#define pnp_can_disable(dev) 0
149#define pnp_can_configure(dev) 1
150
151#define pnp_device_is_isapnp(dev) 1
152
153#define isapnp_card_number(dev) (dev->p.bus->number)
154#define isapnp_csn_number(dev) (dev->p.devfn)
155
156/*
157 * Driver Management
158 */
159
160struct pnp_id {
161 char id[PNP_ID_LEN];
162 struct pnp_id * next;
163};
164
165struct pnp_device_id {
166 char id[PNP_ID_LEN];
167 unsigned long driver_data; /* data private to the driver */
168};
169
170struct pnp_card_device_id {
171 char id[PNP_ID_LEN];
172 unsigned long driver_data; /* data private to the driver */
173 struct {
174 char id[PNP_ID_LEN];
175 } devs[PNP_MAX_DEVICES]; /* logical devices */
176};
177
178struct pnp_driver {
179 char * name;
180 const struct pnp_device_id *id_table;
181 unsigned int flags;
182 int (*probe) (struct pnp_dev *dev, const struct pnp_device_id *dev_id);
183 void (*remove) (struct pnp_dev *dev);
184 int (*suspend)(struct pnp_dev *dev, pm_message_t state);
185 int (*resume)(struct pnp_dev *dev);
186};
187
188#define to_pnp_driver(drv) container_of(drv, struct pnp_driver, driver)
189
190struct pnp_card_driver {
191 struct list_head global_list;
192 char * name;
193 const struct pnp_card_device_id *id_table;
194 unsigned int flags;
195 int (*probe) (struct pnp_card_link *card, const struct pnp_card_device_id *card_id);
196 void (*remove) (struct pnp_card_link *card);
197 int (*suspend)(struct pnp_card_link *card, pm_message_t state);
198 int (*resume)(struct pnp_card_link *card);
199 struct pnp_driver link;
200};
201
202#define to_pnp_card_driver(drv) container_of(drv, struct pnp_card_driver, link)
203
204/* pnp driver flags */
205#define PNP_DRIVER_RES_DO_NOT_CHANGE 0x0001 /* do not change the state of the device */
206#define PNP_DRIVER_RES_DISABLE 0x0003 /* ensure the device is disabled */
207
208#define pnp_resource_change(resource, start, size) isapnp_resource_change(resource, start, size)
209
210#if defined(CONFIG_PNP)
211
212struct pnp_dev * pnp_request_card_device(struct pnp_card_link *clink, const char * id, struct pnp_dev * from);
213void pnp_release_card_device(struct pnp_dev * dev);
214int pnp_register_card_driver(struct pnp_card_driver * drv);
215void pnp_unregister_card_driver(struct pnp_card_driver * drv);
216int pnp_register_driver(struct pnp_driver *drv);
217void pnp_unregister_driver(struct pnp_driver *drv);
218void pnp_init_resource_table(struct pnp_resource_table *table);
219int pnp_manual_config_dev(struct pnp_dev *dev, struct pnp_resource_table *res, int mode);
220int pnp_activate_dev(struct pnp_dev *dev);
221static inline int pnp_is_active(struct pnp_dev *dev) { return dev->p.active; }
222int pnp_disable_dev(struct pnp_dev *dev);
223
224#else
225
226static inline struct pnp_dev * pnp_request_card_device(struct pnp_card_link *clink, const char * id, struct pnp_dev * from) { return NULL; }
227static inline void pnp_release_card_device(struct pnp_dev * dev) { ; }
228static inline int pnp_register_card_driver(struct pnp_card_driver * drv) { return 0; }
229static inline void pnp_unregister_card_driver(struct pnp_card_driver * drv) { ; }
230static inline int pnp_register_driver(struct pnp_driver *drv) { return 0; }
231static inline void pnp_unregister_driver(struct pnp_driver *drv) { ; }
232static inline void pnp_init_resource_table(struct pnp_resource_table *table) { ; }
233static inline int pnp_manual_config_dev(struct pnp_dev *dev, struct pnp_resource_table *res, int mode) { return -ENODEV; }
234static inline int pnp_activate_dev(struct pnp_dev *dev) { return -ENODEV; }
235static inline int pnp_is_active(struct pnp_dev * dev) { return -ENODEV; }
236static inline int pnp_disable_dev(struct pnp_dev *dev) { return -ENODEV; }
237
238#endif
239
240
241#endif /* __KERNEL__ */
242
243#endif /* _LINUX_PNP_H */
Note: See TracBrowser for help on using the repository browser.