Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/include/pcmcia/ds.h
10814 views
1
/*
2
* ds.h -- 16-bit PCMCIA core support
3
*
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License version 2 as
6
* published by the Free Software Foundation.
7
*
8
* The initial developer of the original code is David A. Hinds
9
* <[email protected]>. Portions created by David A. Hinds
10
* are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
11
*
12
* (C) 1999 David A. Hinds
13
* (C) 2003 - 2008 Dominik Brodowski
14
*/
15
16
#ifndef _LINUX_DS_H
17
#define _LINUX_DS_H
18
19
#ifdef __KERNEL__
20
#include <linux/mod_devicetable.h>
21
#endif
22
23
#include <pcmcia/device_id.h>
24
25
#ifdef __KERNEL__
26
#include <linux/device.h>
27
#include <linux/interrupt.h>
28
#include <pcmcia/ss.h>
29
#include <asm/atomic.h>
30
31
32
/*
33
* PCMCIA device drivers (16-bit cards only; 32-bit cards require CardBus
34
* a.k.a. PCI drivers
35
*/
36
struct pcmcia_socket;
37
struct pcmcia_device;
38
struct config_t;
39
struct net_device;
40
41
/* dynamic device IDs for PCMCIA device drivers. See
42
* Documentation/pcmcia/driver.txt for details.
43
*/
44
struct pcmcia_dynids {
45
struct mutex lock;
46
struct list_head list;
47
};
48
49
struct pcmcia_driver {
50
const char *name;
51
52
int (*probe) (struct pcmcia_device *dev);
53
void (*remove) (struct pcmcia_device *dev);
54
55
int (*suspend) (struct pcmcia_device *dev);
56
int (*resume) (struct pcmcia_device *dev);
57
58
struct module *owner;
59
const struct pcmcia_device_id *id_table;
60
struct device_driver drv;
61
struct pcmcia_dynids dynids;
62
};
63
64
/* driver registration */
65
int pcmcia_register_driver(struct pcmcia_driver *driver);
66
void pcmcia_unregister_driver(struct pcmcia_driver *driver);
67
68
/* for struct resource * array embedded in struct pcmcia_device */
69
enum {
70
PCMCIA_IOPORT_0,
71
PCMCIA_IOPORT_1,
72
PCMCIA_IOMEM_0,
73
PCMCIA_IOMEM_1,
74
PCMCIA_IOMEM_2,
75
PCMCIA_IOMEM_3,
76
PCMCIA_NUM_RESOURCES,
77
};
78
79
struct pcmcia_device {
80
/* the socket and the device_no [for multifunction devices]
81
uniquely define a pcmcia_device */
82
struct pcmcia_socket *socket;
83
84
char *devname;
85
86
u8 device_no;
87
88
/* the hardware "function" device; certain subdevices can
89
* share one hardware "function" device. */
90
u8 func;
91
struct config_t *function_config;
92
93
struct list_head socket_device_list;
94
95
/* device setup */
96
unsigned int irq;
97
struct resource *resource[PCMCIA_NUM_RESOURCES];
98
resource_size_t card_addr; /* for the 1st IOMEM resource */
99
unsigned int vpp;
100
101
unsigned int config_flags; /* CONF_ENABLE_ flags below */
102
unsigned int config_base;
103
unsigned int config_index;
104
unsigned int config_regs; /* PRESENT_ flags below */
105
unsigned int io_lines; /* number of I/O lines */
106
107
/* Is the device suspended? */
108
u16 suspended:1;
109
110
/* Flags whether io, irq, win configurations were
111
* requested, and whether the configuration is "locked" */
112
u16 _irq:1;
113
u16 _io:1;
114
u16 _win:4;
115
u16 _locked:1;
116
117
/* Flag whether a "fuzzy" func_id based match is
118
* allowed. */
119
u16 allow_func_id_match:1;
120
121
/* information about this device */
122
u16 has_manf_id:1;
123
u16 has_card_id:1;
124
u16 has_func_id:1;
125
126
u16 reserved:4;
127
128
u8 func_id;
129
u16 manf_id;
130
u16 card_id;
131
132
char *prod_id[4];
133
134
u64 dma_mask;
135
struct device dev;
136
137
/* data private to drivers */
138
void *priv;
139
unsigned int open;
140
};
141
142
#define to_pcmcia_dev(n) container_of(n, struct pcmcia_device, dev)
143
#define to_pcmcia_drv(n) container_of(n, struct pcmcia_driver, drv)
144
145
146
/*
147
* CIS access.
148
*
149
* Please use the following functions to access CIS tuples:
150
* - pcmcia_get_tuple()
151
* - pcmcia_loop_tuple()
152
* - pcmcia_get_mac_from_cis()
153
*
154
* To parse a tuple_t, pcmcia_parse_tuple() exists. Its interface
155
* might change in future.
156
*/
157
158
/* get the very first CIS entry of type @code. Note that buf is pointer
159
* to u8 *buf; and that you need to kfree(buf) afterwards. */
160
size_t pcmcia_get_tuple(struct pcmcia_device *p_dev, cisdata_t code,
161
u8 **buf);
162
163
/* loop over CIS entries */
164
int pcmcia_loop_tuple(struct pcmcia_device *p_dev, cisdata_t code,
165
int (*loop_tuple) (struct pcmcia_device *p_dev,
166
tuple_t *tuple,
167
void *priv_data),
168
void *priv_data);
169
170
/* get the MAC address from CISTPL_FUNCE */
171
int pcmcia_get_mac_from_cis(struct pcmcia_device *p_dev,
172
struct net_device *dev);
173
174
175
/* parse a tuple_t */
176
int pcmcia_parse_tuple(tuple_t *tuple, cisparse_t *parse);
177
178
/* loop CIS entries for valid configuration */
179
int pcmcia_loop_config(struct pcmcia_device *p_dev,
180
int (*conf_check) (struct pcmcia_device *p_dev,
181
void *priv_data),
182
void *priv_data);
183
184
/* is the device still there? */
185
struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *p_dev);
186
187
/* low-level interface reset */
188
int pcmcia_reset_card(struct pcmcia_socket *skt);
189
190
/* CIS config */
191
int pcmcia_read_config_byte(struct pcmcia_device *p_dev, off_t where, u8 *val);
192
int pcmcia_write_config_byte(struct pcmcia_device *p_dev, off_t where, u8 val);
193
194
/* device configuration */
195
int pcmcia_request_io(struct pcmcia_device *p_dev);
196
197
int __must_check
198
__pcmcia_request_exclusive_irq(struct pcmcia_device *p_dev,
199
irq_handler_t handler);
200
static inline __must_check __deprecated int
201
pcmcia_request_exclusive_irq(struct pcmcia_device *p_dev,
202
irq_handler_t handler)
203
{
204
return __pcmcia_request_exclusive_irq(p_dev, handler);
205
}
206
207
int __must_check pcmcia_request_irq(struct pcmcia_device *p_dev,
208
irq_handler_t handler);
209
210
int pcmcia_enable_device(struct pcmcia_device *p_dev);
211
212
int pcmcia_request_window(struct pcmcia_device *p_dev, struct resource *res,
213
unsigned int speed);
214
int pcmcia_release_window(struct pcmcia_device *p_dev, struct resource *res);
215
int pcmcia_map_mem_page(struct pcmcia_device *p_dev, struct resource *res,
216
unsigned int offset);
217
218
int pcmcia_fixup_vpp(struct pcmcia_device *p_dev, unsigned char new_vpp);
219
int pcmcia_fixup_iowidth(struct pcmcia_device *p_dev);
220
221
void pcmcia_disable_device(struct pcmcia_device *p_dev);
222
223
/* IO ports */
224
#define IO_DATA_PATH_WIDTH 0x18
225
#define IO_DATA_PATH_WIDTH_8 0x00
226
#define IO_DATA_PATH_WIDTH_16 0x08
227
#define IO_DATA_PATH_WIDTH_AUTO 0x10
228
229
/* IO memory */
230
#define WIN_MEMORY_TYPE_CM 0x00 /* default */
231
#define WIN_MEMORY_TYPE_AM 0x20 /* MAP_ATTRIB */
232
#define WIN_DATA_WIDTH_8 0x00 /* default */
233
#define WIN_DATA_WIDTH_16 0x02 /* MAP_16BIT */
234
#define WIN_ENABLE 0x01 /* MAP_ACTIVE */
235
#define WIN_USE_WAIT 0x40 /* MAP_USE_WAIT */
236
237
#define WIN_FLAGS_MAP 0x63 /* MAP_ATTRIB | MAP_16BIT | MAP_ACTIVE |
238
MAP_USE_WAIT */
239
#define WIN_FLAGS_REQ 0x1c /* mapping to socket->win[i]:
240
0x04 -> 0
241
0x08 -> 1
242
0x0c -> 2
243
0x10 -> 3 */
244
245
/* config_reg{ister}s present for this PCMCIA device */
246
#define PRESENT_OPTION 0x001
247
#define PRESENT_STATUS 0x002
248
#define PRESENT_PIN_REPLACE 0x004
249
#define PRESENT_COPY 0x008
250
#define PRESENT_EXT_STATUS 0x010
251
#define PRESENT_IOBASE_0 0x020
252
#define PRESENT_IOBASE_1 0x040
253
#define PRESENT_IOBASE_2 0x080
254
#define PRESENT_IOBASE_3 0x100
255
#define PRESENT_IOSIZE 0x200
256
257
/* flags to be passed to pcmcia_enable_device() */
258
#define CONF_ENABLE_IRQ 0x0001
259
#define CONF_ENABLE_SPKR 0x0002
260
#define CONF_ENABLE_PULSE_IRQ 0x0004
261
#define CONF_ENABLE_ESR 0x0008
262
#define CONF_ENABLE_IOCARD 0x0010 /* auto-enabled if IO resources or IRQ
263
* (CONF_ENABLE_IRQ) in use */
264
#define CONF_ENABLE_ZVCARD 0x0020
265
266
/* flags used by pcmcia_loop_config() autoconfiguration */
267
#define CONF_AUTO_CHECK_VCC 0x0100 /* check for matching Vcc? */
268
#define CONF_AUTO_SET_VPP 0x0200 /* set Vpp? */
269
#define CONF_AUTO_AUDIO 0x0400 /* enable audio line? */
270
#define CONF_AUTO_SET_IO 0x0800 /* set ->resource[0,1] */
271
#define CONF_AUTO_SET_IOMEM 0x1000 /* set ->resource[2] */
272
273
#endif /* __KERNEL__ */
274
275
#endif /* _LINUX_DS_H */
276
277