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

Last change on this file since 441 was 441, checked in by Paul Smedley, 16 years ago

Move functions out of config.h into appropriate linux header

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