powerpc/44x: Fix address decoding setup of PCI 2.x cells
[deliverable/linux.git] / include / pcmcia / ds.h
CommitLineData
1da177e4
LT
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
a5835786 13 * (C) 2003 - 2008 Dominik Brodowski
1da177e4
LT
14 */
15
16#ifndef _LINUX_DS_H
17#define _LINUX_DS_H
18
8e2f3b70
DB
19#ifdef __KERNEL__
20#include <linux/mod_devicetable.h>
21#endif
22
1da177e4 23#include <pcmcia/cs_types.h>
1ad275e3 24#include <pcmcia/device_id.h>
1da177e4 25
1da177e4
LT
26#ifdef __KERNEL__
27#include <linux/device.h>
e2d40963 28#include <pcmcia/ss.h>
1da177e4 29
a5835786
DB
30/*
31 * PCMCIA device drivers (16-bit cards only; 32-bit cards require CardBus
32 * a.k.a. PCI drivers
33 */
1da177e4 34struct pcmcia_socket;
a5835786 35struct pcmcia_device;
dbb22f0d 36struct config_t;
1da177e4 37
a5835786
DB
38/* dynamic device IDs for PCMCIA device drivers. See
39 * Documentation/pcmcia/driver.txt for details.
40*/
6179b556
BW
41struct pcmcia_dynids {
42 spinlock_t lock;
43 struct list_head list;
44};
45
1da177e4 46struct pcmcia_driver {
f8cfa618 47 int (*probe) (struct pcmcia_device *dev);
cc3b4866
DB
48 void (*remove) (struct pcmcia_device *dev);
49
98e4c28b
DB
50 int (*suspend) (struct pcmcia_device *dev);
51 int (*resume) (struct pcmcia_device *dev);
52
1da177e4 53 struct module *owner;
1ad275e3 54 struct pcmcia_device_id *id_table;
1da177e4 55 struct device_driver drv;
6179b556 56 struct pcmcia_dynids dynids;
1da177e4
LT
57};
58
59/* driver registration */
60int pcmcia_register_driver(struct pcmcia_driver *driver);
61void pcmcia_unregister_driver(struct pcmcia_driver *driver);
62
a5835786
DB
63/* Some drivers use dev_node_t to store char or block device information.
64 * Don't use this in new drivers, though.
65 */
66typedef 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;
e2d40963 71
1da177e4
LT
72struct pcmcia_device {
73 /* the socket and the device_no [for multifunction devices]
74 uniquely define a pcmcia_device */
75 struct pcmcia_socket *socket;
76
bd65a685
BG
77 char *devname;
78
1da177e4
LT
79 u8 device_no;
80
81 /* the hardware "function" device; certain subdevices can
82 * share one hardware "function" device. */
83 u8 func;
dbb22f0d 84 struct config_t* function_config;
1da177e4
LT
85
86 struct list_head socket_device_list;
87
fd238232
DB
88 /* deprecated, will be cleaned up soon */
89 dev_node_t *dev_node;
fd238232 90 u_int open;
fd238232
DB
91 io_req_t io;
92 irq_req_t irq;
93 config_req_t conf;
94 window_handle_t win;
fd238232 95
9940ec36
DB
96 /* Is the device suspended, or in the process of
97 * being removed? */
e2d40963 98 u16 suspended:1;
9940ec36 99 u16 _removed:1;
e2d40963
DB
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;
1da177e4 107
e2d40963
DB
108 /* Flag whether a "fuzzy" func_id based match is
109 * allowed. */
110 u16 allow_func_id_match:1;
f6fbe01a 111
1da177e4 112 /* information about this device */
e2d40963
DB
113 u16 has_manf_id:1;
114 u16 has_card_id:1;
115 u16 has_func_id:1;
1ad275e3 116
9940ec36 117 u16 reserved:3;
1da177e4
LT
118
119 u8 func_id;
120 u16 manf_id;
121 u16 card_id;
122
123 char * prod_id[4];
124
43d9f7fd 125 u64 dma_mask;
0e0fad8f
DB
126 struct device dev;
127
128#ifdef CONFIG_PCMCIA_IOCTL
1da177e4
LT
129 /* device driver wanted by cardmgr */
130 struct pcmcia_driver * cardmgr;
0e0fad8f 131#endif
e2d40963
DB
132
133 /* data private to drivers */
134 void *priv;
1da177e4
LT
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
a5835786 140/* deprecated -- don't use! */
e12a9a93 141#define handle_to_dev(handle) (handle->dev)
1da177e4 142
a5835786
DB
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 */
994917f8
DB
148enum 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};
79ba6757
DB
168const char *pcmcia_error_func(int func);
169const 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
272433e0
DB
179/* CIS access.
180 * Use the pcmcia_* versions in PCMCIA drivers
181 */
182int pcmcia_parse_tuple(tuple_t *tuple, cisparse_t *parse);
183
184int 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
189int 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
194int 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 */
200int 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);
1da177e4 207
994917f8
DB
208/* is the device still there? */
209struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *p_dev);
210
211/* low-level interface reset */
212int pcmcia_reset_card(struct pcmcia_socket *skt);
213
214/* CIS config */
215int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
216 conf_reg_t *reg);
217
218/* device configuration */
219int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req);
220int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req);
221int pcmcia_request_configuration(struct pcmcia_device *p_dev,
222 config_req_t *req);
223
224int pcmcia_request_window(struct pcmcia_device **p_dev, win_req_t *req,
225 window_handle_t *wh);
226int pcmcia_release_window(window_handle_t win);
227
228int pcmcia_get_mem_page(window_handle_t win, memreq_t *req);
229int pcmcia_map_mem_page(window_handle_t win, memreq_t *req);
230
231int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod);
232void pcmcia_disable_device(struct pcmcia_device *p_dev);
233
1da177e4 234#endif /* __KERNEL__ */
a5835786
DB
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
d39bd564
DB
247#if defined(__arm__) || defined(__mips__) || defined(__avr32__) || \
248 defined(__bfin__)
249/* This (ioaddr_t) is exposed to userspace & hence cannot be changed. */
250typedef u_int ioaddr_t;
251#else
252typedef u_short ioaddr_t;
253#endif
254
a5835786
DB
255/* for AdjustResourceInfo */
256typedef 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
297typedef struct tuple_parse_t {
298 tuple_t tuple;
299 cisdata_t data[255];
300 cisparse_t parse;
301} tuple_parse_t;
302
303typedef struct win_info_t {
304 window_handle_t handle;
305 win_req_t window;
306 memreq_t map;
307} win_info_t;
308
309typedef 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
318typedef struct mtd_info_t {
319 dev_info_t dev_info;
320 u_int Attributes;
321 u_int CardOffset;
322} mtd_info_t;
323
324typedef 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 */
344typedef struct cisdump_t {
345 u_int Length;
346 cisdata_t Data[CISTPL_MAX_CIS_SIZE];
347} cisdump_t;
348
349/* for GetConfigurationInfo */
350typedef 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;
a45b3fb1
DB
369
370/* For ValidateCIS */
371typedef struct cisinfo_t {
372 u_int Chains;
373} cisinfo_t;
374
375typedef struct cs_status_t {
376 u_char Function;
377 event_t CardState;
378 event_t SocketState;
379} cs_status_t;
a5835786
DB
380
381typedef union ds_ioctl_arg_t {
382 adjust_t adjust;
383 config_info_t config;
384 tuple_t tuple;
385 tuple_parse_t tuple_parse;
386 client_req_t client_req;
387 cs_status_t status;
388 conf_reg_t conf_reg;
389 cisinfo_t cisinfo;
390 region_info_t region;
391 bind_info_t bind_info;
392 mtd_info_t mtd_info;
393 win_info_t win_info;
394 cisdump_t cisdump;
395} ds_ioctl_arg_t;
396
397#define DS_ADJUST_RESOURCE_INFO _IOWR('d', 2, adjust_t)
398#define DS_GET_CONFIGURATION_INFO _IOWR('d', 3, config_info_t)
399#define DS_GET_FIRST_TUPLE _IOWR('d', 4, tuple_t)
400#define DS_GET_NEXT_TUPLE _IOWR('d', 5, tuple_t)
401#define DS_GET_TUPLE_DATA _IOWR('d', 6, tuple_parse_t)
402#define DS_PARSE_TUPLE _IOWR('d', 7, tuple_parse_t)
403#define DS_RESET_CARD _IO ('d', 8)
404#define DS_GET_STATUS _IOWR('d', 9, cs_status_t)
405#define DS_ACCESS_CONFIGURATION_REGISTER _IOWR('d', 10, conf_reg_t)
406#define DS_VALIDATE_CIS _IOR ('d', 11, cisinfo_t)
407#define DS_SUSPEND_CARD _IO ('d', 12)
408#define DS_RESUME_CARD _IO ('d', 13)
409#define DS_EJECT_CARD _IO ('d', 14)
410#define DS_INSERT_CARD _IO ('d', 15)
411#define DS_GET_FIRST_REGION _IOWR('d', 16, region_info_t)
412#define DS_GET_NEXT_REGION _IOWR('d', 17, region_info_t)
413#define DS_REPLACE_CIS _IOWR('d', 18, cisdump_t)
414#define DS_GET_FIRST_WINDOW _IOR ('d', 19, win_info_t)
415#define DS_GET_NEXT_WINDOW _IOWR('d', 20, win_info_t)
416#define DS_GET_MEM_PAGE _IOWR('d', 21, win_info_t)
417
418#define DS_BIND_REQUEST _IOWR('d', 60, bind_info_t)
419#define DS_GET_DEVICE_INFO _IOWR('d', 61, bind_info_t)
420#define DS_GET_NEXT_DEVICE _IOWR('d', 62, bind_info_t)
421#define DS_UNBIND_REQUEST _IOW ('d', 63, bind_info_t)
422#define DS_BIND_MTD _IOWR('d', 64, mtd_info_t)
423
424
425/* used in userspace only */
426#define CS_IN_USE 0x1e
427
994917f8
DB
428#define INFO_MASTER_CLIENT 0x01
429#define INFO_IO_CLIENT 0x02
430#define INFO_MTD_CLIENT 0x04
431#define INFO_MEM_CLIENT 0x08
432#define MAX_NUM_CLIENTS 3
433
434#define INFO_CARD_SHARE 0x10
435#define INFO_CARD_EXCL 0x20
436
a5835786
DB
437
438#endif /* !defined(__KERNEL__) || defined(CONFIG_PCMCIA_IOCTL) */
439
1da177e4 440#endif /* _LINUX_DS_H */
This page took 0.373047 seconds and 5 git commands to generate.