5fb61952bce82515623fb654533150b5382dac51
[linux-2.6.git] / include / pcmcia / ds.h
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  * <dahinds@users.sourceforge.net>.  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/cs_types.h>
24 #include <pcmcia/device_id.h>
25
26 #ifdef __KERNEL__
27 #include <linux/device.h>
28 #include <pcmcia/ss.h>
29
30 /*
31  * PCMCIA device drivers (16-bit cards only; 32-bit cards require CardBus
32  * a.k.a. PCI drivers
33  */
34 struct pcmcia_socket;
35 struct pcmcia_device;
36 struct config_t;
37
38 /* dynamic device IDs for PCMCIA device drivers. See
39  * Documentation/pcmcia/driver.txt for details.
40 */
41 struct pcmcia_dynids {
42         spinlock_t              lock;
43         struct list_head        list;
44 };
45
46 struct pcmcia_driver {
47         int (*probe)            (struct pcmcia_device *dev);
48         void (*remove)          (struct pcmcia_device *dev);
49
50         int (*suspend)          (struct pcmcia_device *dev);
51         int (*resume)           (struct pcmcia_device *dev);
52
53         struct module           *owner;
54         struct pcmcia_device_id *id_table;
55         struct device_driver    drv;
56         struct pcmcia_dynids    dynids;
57 };
58
59 /* driver registration */
60 int pcmcia_register_driver(struct pcmcia_driver *driver);
61 void pcmcia_unregister_driver(struct pcmcia_driver *driver);
62
63 /* Some drivers use dev_node_t to store char or block device information.
64  * Don't use this in new drivers, though.
65  */
66 typedef struct dev_node_t {
67         char                    dev_name[DEV_NAME_LEN];
68         u_short                 major, minor;
69         struct dev_node_t       *next;
70 } dev_node_t;
71
72 struct pcmcia_device {
73         /* the socket and the device_no [for multifunction devices]
74            uniquely define a pcmcia_device */
75         struct pcmcia_socket    *socket;
76
77         char                    *devname;
78
79         u8                      device_no;
80
81         /* the hardware "function" device; certain subdevices can
82          * share one hardware "function" device. */
83         u8                      func;
84         struct config_t*        function_config;
85
86         struct list_head        socket_device_list;
87
88         /* deprecated, will be cleaned up soon */
89         dev_node_t              *dev_node;
90         u_int                   open;
91         io_req_t                io;
92         irq_req_t               irq;
93         config_req_t            conf;
94         window_handle_t         win;
95
96         /* Is the device suspended, or in the process of
97          * being removed? */
98         u16                     suspended:1;
99         u16                     _removed:1;
100
101         /* Flags whether io, irq, win configurations were
102          * requested, and whether the configuration is "locked" */
103         u16                     _irq:1;
104         u16                     _io:1;
105         u16                     _win:4;
106         u16                     _locked:1;
107
108         /* Flag whether a "fuzzy" func_id based match is
109          * allowed. */
110         u16                     allow_func_id_match:1;
111
112         /* information about this device */
113         u16                     has_manf_id:1;
114         u16                     has_card_id:1;
115         u16                     has_func_id:1;
116
117         u16                     reserved:3;
118
119         u8                      func_id;
120         u16                     manf_id;
121         u16                     card_id;
122
123         char *                  prod_id[4];
124
125         u64                     dma_mask;
126         struct device           dev;
127
128 #ifdef CONFIG_PCMCIA_IOCTL
129         /* device driver wanted by cardmgr */
130         struct pcmcia_driver *  cardmgr;
131 #endif
132
133         /* data private to drivers */
134         void                    *priv;
135 };
136
137 #define to_pcmcia_dev(n) container_of(n, struct pcmcia_device, dev)
138 #define to_pcmcia_drv(n) container_of(n, struct pcmcia_driver, drv)
139
140 /* deprecated -- don't use! */
141 #define handle_to_dev(handle) (handle->dev)
142
143
144 /* (deprecated) error reporting by PCMCIA devices. Use dev_printk()
145  * or dev_dbg() directly in the driver, without referring to pcmcia_error_func()
146  * and/or pcmcia_error_ret() for those functions will go away soon.
147  */
148 enum service {
149     AccessConfigurationRegister, AddSocketServices,
150     AdjustResourceInfo, CheckEraseQueue, CloseMemory, CopyMemory,
151     DeregisterClient, DeregisterEraseQueue, GetCardServicesInfo,
152     GetClientInfo, GetConfigurationInfo, GetEventMask,
153     GetFirstClient, GetFirstPartion, GetFirstRegion, GetFirstTuple,
154     GetNextClient, GetNextPartition, GetNextRegion, GetNextTuple,
155     GetStatus, GetTupleData, MapLogSocket, MapLogWindow, MapMemPage,
156     MapPhySocket, MapPhyWindow, ModifyConfiguration, ModifyWindow,
157     OpenMemory, ParseTuple, ReadMemory, RegisterClient,
158     RegisterEraseQueue, RegisterMTD, RegisterTimer,
159     ReleaseConfiguration, ReleaseExclusive, ReleaseIO, ReleaseIRQ,
160     ReleaseSocketMask, ReleaseWindow, ReplaceSocketServices,
161     RequestConfiguration, RequestExclusive, RequestIO, RequestIRQ,
162     RequestSocketMask, RequestWindow, ResetCard, ReturnSSEntry,
163     SetEventMask, SetRegion, ValidateCIS, VendorSpecific,
164     WriteMemory, BindDevice, BindMTD, ReportError,
165     SuspendCard, ResumeCard, EjectCard, InsertCard, ReplaceCIS,
166     GetFirstWindow, GetNextWindow, GetMemPage
167 };
168 const char *pcmcia_error_func(int func);
169 const char *pcmcia_error_ret(int ret);
170
171 #define cs_error(p_dev, func, ret)                      \
172         {                                               \
173                 dev_printk(KERN_NOTICE, &p_dev->dev,    \
174                            "%s : %s\n",                 \
175                            pcmcia_error_func(func),     \
176                            pcmcia_error_ret(ret));      \
177         }
178
179 /* CIS access.
180  * Use the pcmcia_* versions in PCMCIA drivers
181  */
182 int pcmcia_parse_tuple(tuple_t *tuple, cisparse_t *parse);
183
184 int pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function,
185                            tuple_t *tuple);
186 #define pcmcia_get_first_tuple(p_dev, tuple) \
187                 pccard_get_first_tuple(p_dev->socket, p_dev->func, tuple)
188
189 int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function,
190                           tuple_t *tuple);
191 #define pcmcia_get_next_tuple(p_dev, tuple) \
192                 pccard_get_next_tuple(p_dev->socket, p_dev->func, tuple)
193
194 int pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple);
195 #define pcmcia_get_tuple_data(p_dev, tuple) \
196                 pccard_get_tuple_data(p_dev->socket, tuple)
197
198
199 /* loop CIS entries for valid configuration */
200 int pcmcia_loop_config(struct pcmcia_device *p_dev,
201                        int      (*conf_check)   (struct pcmcia_device *p_dev,
202                                                  cistpl_cftable_entry_t *cf,
203                                                  cistpl_cftable_entry_t *dflt,
204                                                  unsigned int vcc,
205                                                  void *priv_data),
206                        void *priv_data);
207
208 /* is the device still there? */
209 struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *p_dev);
210
211 /* low-level interface reset */
212 int pcmcia_reset_card(struct pcmcia_socket *skt);
213
214 /* CIS config */
215 int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
216                                          conf_reg_t *reg);
217
218 /* device configuration */
219 int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req);
220 int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req);
221 int pcmcia_request_configuration(struct pcmcia_device *p_dev,
222                                  config_req_t *req);
223
224 int pcmcia_request_window(struct pcmcia_device **p_dev, win_req_t *req,
225                           window_handle_t *wh);
226 int pcmcia_release_window(window_handle_t win);
227
228 int pcmcia_get_mem_page(window_handle_t win, memreq_t *req);
229 int pcmcia_map_mem_page(window_handle_t win, memreq_t *req);
230
231 int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod);
232 void pcmcia_disable_device(struct pcmcia_device *p_dev);
233
234 #endif /* __KERNEL__ */
235
236
237
238 /* Below, there are only definitions which are used by
239  * - the PCMCIA ioctl
240  * - deprecated PCMCIA userspace tools only
241  *
242  * here be dragons ... here be dragons ... here be dragons ... here be drag
243  */
244
245 #if defined(CONFIG_PCMCIA_IOCTL) || !defined(__KERNEL__)
246
247 #if defined(__arm__) || defined(__mips__) || defined(__avr32__) || \
248         defined(__bfin__)
249 /* This (ioaddr_t) is exposed to userspace & hence cannot be changed. */
250 typedef u_int   ioaddr_t;
251 #else
252 typedef u_short ioaddr_t;
253 #endif
254
255 /* for AdjustResourceInfo */
256 typedef struct adjust_t {
257         u_int                   Action;
258         u_int                   Resource;
259         u_int                   Attributes;
260         union {
261                 struct memory {
262                         u_long          Base;
263                         u_long          Size;
264                 } memory;
265                 struct io {
266                         ioaddr_t        BasePort;
267                         ioaddr_t        NumPorts;
268                         u_int           IOAddrLines;
269                 } io;
270                 struct irq {
271                         u_int           IRQ;
272                 } irq;
273         } resource;
274 } adjust_t;
275
276 /* Action field */
277 #define REMOVE_MANAGED_RESOURCE         1
278 #define ADD_MANAGED_RESOURCE            2
279 #define GET_FIRST_MANAGED_RESOURCE      3
280 #define GET_NEXT_MANAGED_RESOURCE       4
281 /* Resource field */
282 #define RES_MEMORY_RANGE                1
283 #define RES_IO_RANGE                    2
284 #define RES_IRQ                         3
285 /* Attribute field */
286 #define RES_IRQ_TYPE                    0x03
287 #define RES_IRQ_TYPE_EXCLUSIVE          0
288 #define RES_IRQ_TYPE_TIME               1
289 #define RES_IRQ_TYPE_DYNAMIC            2
290 #define RES_IRQ_CSC                     0x04
291 #define RES_SHARED                      0x08
292 #define RES_RESERVED                    0x10
293 #define RES_ALLOCATED                   0x20
294 #define RES_REMOVED                     0x40
295
296
297 typedef struct tuple_parse_t {
298         tuple_t                 tuple;
299         cisdata_t               data[255];
300         cisparse_t              parse;
301 } tuple_parse_t;
302
303 typedef struct win_info_t {
304         window_handle_t         handle;
305         win_req_t               window;
306         memreq_t                map;
307 } win_info_t;
308
309 typedef struct bind_info_t {
310         dev_info_t              dev_info;
311         u_char                  function;
312         struct pcmcia_device    *instance;
313         char                    name[DEV_NAME_LEN];
314         u_short                 major, minor;
315         void                    *next;
316 } bind_info_t;
317
318 typedef struct mtd_info_t {
319         dev_info_t              dev_info;
320         u_int                   Attributes;
321         u_int                   CardOffset;
322 } mtd_info_t;
323
324 typedef struct region_info_t {
325         u_int                   Attributes;
326         u_int                   CardOffset;
327         u_int                   RegionSize;
328         u_int                   AccessSpeed;
329         u_int                   BlockSize;
330         u_int                   PartMultiple;
331         u_char                  JedecMfr, JedecInfo;
332         memory_handle_t         next;
333 } region_info_t;
334
335 #define REGION_TYPE             0x0001
336 #define REGION_TYPE_CM          0x0000
337 #define REGION_TYPE_AM          0x0001
338 #define REGION_PREFETCH         0x0008
339 #define REGION_CACHEABLE        0x0010
340 #define REGION_BAR_MASK         0xe000
341 #define REGION_BAR_SHIFT        13
342
343 /* For ReplaceCIS */
344 typedef struct cisdump_t {
345         u_int                   Length;
346         cisdata_t               Data[CISTPL_MAX_CIS_SIZE];
347 } cisdump_t;
348
349 /* for GetConfigurationInfo */
350 typedef struct config_info_t {
351         u_char                  Function;
352         u_int                   Attributes;
353         u_int                   Vcc, Vpp1, Vpp2;
354         u_int                   IntType;
355         u_int                   ConfigBase;
356         u_char                  Status, Pin, Copy, Option, ExtStatus;
357         u_int                   Present;
358         u_int                   CardValues;
359         u_int                   AssignedIRQ;
360         u_int                   IRQAttributes;
361         ioaddr_t                BasePort1;
362         ioaddr_t                NumPorts1;
363         u_int                   Attributes1;
364         ioaddr_t                BasePort2;
365         ioaddr_t                NumPorts2;
366         u_int                   Attributes2;
367         u_int                   IOAddrLines;
368 } config_info_t;
369
370 typedef union ds_ioctl_arg_t {
371         adjust_t                adjust;
372         config_info_t           config;
373         tuple_t                 tuple;
374         tuple_parse_t           tuple_parse;
375         client_req_t            client_req;
376         cs_status_t             status;
377         conf_reg_t              conf_reg;
378         cisinfo_t               cisinfo;
379         region_info_t           region;
380         bind_info_t             bind_info;
381         mtd_info_t              mtd_info;
382         win_info_t              win_info;
383         cisdump_t               cisdump;
384 } ds_ioctl_arg_t;
385
386 #define DS_ADJUST_RESOURCE_INFO                 _IOWR('d',  2, adjust_t)
387 #define DS_GET_CONFIGURATION_INFO               _IOWR('d',  3, config_info_t)
388 #define DS_GET_FIRST_TUPLE                      _IOWR('d',  4, tuple_t)
389 #define DS_GET_NEXT_TUPLE                       _IOWR('d',  5, tuple_t)
390 #define DS_GET_TUPLE_DATA                       _IOWR('d',  6, tuple_parse_t)
391 #define DS_PARSE_TUPLE                          _IOWR('d',  7, tuple_parse_t)
392 #define DS_RESET_CARD                           _IO  ('d',  8)
393 #define DS_GET_STATUS                           _IOWR('d',  9, cs_status_t)
394 #define DS_ACCESS_CONFIGURATION_REGISTER        _IOWR('d', 10, conf_reg_t)
395 #define DS_VALIDATE_CIS                         _IOR ('d', 11, cisinfo_t)
396 #define DS_SUSPEND_CARD                         _IO  ('d', 12)
397 #define DS_RESUME_CARD                          _IO  ('d', 13)
398 #define DS_EJECT_CARD                           _IO  ('d', 14)
399 #define DS_INSERT_CARD                          _IO  ('d', 15)
400 #define DS_GET_FIRST_REGION                     _IOWR('d', 16, region_info_t)
401 #define DS_GET_NEXT_REGION                      _IOWR('d', 17, region_info_t)
402 #define DS_REPLACE_CIS                          _IOWR('d', 18, cisdump_t)
403 #define DS_GET_FIRST_WINDOW                     _IOR ('d', 19, win_info_t)
404 #define DS_GET_NEXT_WINDOW                      _IOWR('d', 20, win_info_t)
405 #define DS_GET_MEM_PAGE                         _IOWR('d', 21, win_info_t)
406
407 #define DS_BIND_REQUEST                         _IOWR('d', 60, bind_info_t)
408 #define DS_GET_DEVICE_INFO                      _IOWR('d', 61, bind_info_t)
409 #define DS_GET_NEXT_DEVICE                      _IOWR('d', 62, bind_info_t)
410 #define DS_UNBIND_REQUEST                       _IOW ('d', 63, bind_info_t)
411 #define DS_BIND_MTD                             _IOWR('d', 64, mtd_info_t)
412
413
414 /* used in userspace only */
415 #define CS_IN_USE                       0x1e
416
417 #define INFO_MASTER_CLIENT      0x01
418 #define INFO_IO_CLIENT          0x02
419 #define INFO_MTD_CLIENT         0x04
420 #define INFO_MEM_CLIENT         0x08
421 #define MAX_NUM_CLIENTS         3
422
423 #define INFO_CARD_SHARE         0x10
424 #define INFO_CARD_EXCL          0x20
425
426
427 #endif /* !defined(__KERNEL__) || defined(CONFIG_PCMCIA_IOCTL) */
428
429 #endif /* _LINUX_DS_H */