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