blob: 29e40323089965368ab66d95a41725967c7bce26 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
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
Dominik Brodowskia5835782008-08-28 00:41:16 +020013 * (C) 2003 - 2008 Dominik Brodowski
Linus Torvalds1da177e2005-04-16 15:20:36 -070014 */
15
16#ifndef _LINUX_DS_H
17#define _LINUX_DS_H
18
Dominik Brodowski8e2f3b72005-07-12 13:58:14 -070019#ifdef __KERNEL__
20#include <linux/mod_devicetable.h>
21#endif
22
Linus Torvalds1da177e2005-04-16 15:20:36 -070023#include <pcmcia/cs_types.h>
Dominik Brodowski1ad275e2005-06-27 16:28:06 -070024#include <pcmcia/device_id.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070025
Linus Torvalds1da177e2005-04-16 15:20:36 -070026#ifdef __KERNEL__
27#include <linux/device.h>
Dominik Brodowskie2d40962006-03-02 00:09:29 +010028#include <pcmcia/ss.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070029
Dominik Brodowskia5835782008-08-28 00:41:16 +020030/*
31 * PCMCIA device drivers (16-bit cards only; 32-bit cards require CardBus
32 * a.k.a. PCI drivers
33 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070034struct pcmcia_socket;
Dominik Brodowskia5835782008-08-28 00:41:16 +020035struct pcmcia_device;
Dominik Brodowskidbb22f02006-01-10 20:41:27 +010036struct config_t;
Linus Torvalds1da177e2005-04-16 15:20:36 -070037
Dominik Brodowskia5835782008-08-28 00:41:16 +020038/* dynamic device IDs for PCMCIA device drivers. See
39 * Documentation/pcmcia/driver.txt for details.
40*/
Bernhard Walle6179b552007-05-06 14:48:44 -070041struct pcmcia_dynids {
42 spinlock_t lock;
43 struct list_head list;
44};
45
Linus Torvalds1da177e2005-04-16 15:20:36 -070046struct pcmcia_driver {
Dominik Brodowskif8cfa612005-11-14 21:25:51 +010047 int (*probe) (struct pcmcia_device *dev);
Dominik Brodowskicc3b4862005-11-14 21:23:14 +010048 void (*remove) (struct pcmcia_device *dev);
49
Dominik Brodowski98e4c282005-11-14 21:21:18 +010050 int (*suspend) (struct pcmcia_device *dev);
51 int (*resume) (struct pcmcia_device *dev);
52
Linus Torvalds1da177e2005-04-16 15:20:36 -070053 struct module *owner;
Dominik Brodowski1ad275e2005-06-27 16:28:06 -070054 struct pcmcia_device_id *id_table;
Linus Torvalds1da177e2005-04-16 15:20:36 -070055 struct device_driver drv;
Bernhard Walle6179b552007-05-06 14:48:44 -070056 struct pcmcia_dynids dynids;
Linus Torvalds1da177e2005-04-16 15:20:36 -070057};
58
59/* driver registration */
60int pcmcia_register_driver(struct pcmcia_driver *driver);
61void pcmcia_unregister_driver(struct pcmcia_driver *driver);
62
Dominik Brodowskia5835782008-08-28 00:41:16 +020063/* 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;
Dominik Brodowskie2d40962006-03-02 00:09:29 +010071
Linus Torvalds1da177e2005-04-16 15:20:36 -070072struct pcmcia_device {
73 /* the socket and the device_no [for multifunction devices]
74 uniquely define a pcmcia_device */
75 struct pcmcia_socket *socket;
76
Brice Goglinbd65a682005-09-09 13:03:29 -070077 char *devname;
78
Linus Torvalds1da177e2005-04-16 15:20:36 -070079 u8 device_no;
80
81 /* the hardware "function" device; certain subdevices can
82 * share one hardware "function" device. */
83 u8 func;
Dominik Brodowskidbb22f02006-01-10 20:41:27 +010084 struct config_t* function_config;
Linus Torvalds1da177e2005-04-16 15:20:36 -070085
86 struct list_head socket_device_list;
87
Dominik Brodowskifd238232006-03-05 10:45:09 +010088 /* deprecated, will be cleaned up soon */
89 dev_node_t *dev_node;
Dominik Brodowskifd238232006-03-05 10:45:09 +010090 u_int open;
Dominik Brodowskifd238232006-03-05 10:45:09 +010091 io_req_t io;
92 irq_req_t irq;
93 config_req_t conf;
94 window_handle_t win;
Dominik Brodowskifd238232006-03-05 10:45:09 +010095
Dominik Brodowski9940ec32006-03-05 11:04:33 +010096 /* Is the device suspended, or in the process of
97 * being removed? */
Dominik Brodowskie2d40962006-03-02 00:09:29 +010098 u16 suspended:1;
Dominik Brodowski9940ec32006-03-05 11:04:33 +010099 u16 _removed:1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700100
Dominik Brodowskie2d40962006-03-02 00:09:29 +0100101 /* 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;
Dominik Brodowskif6fbe012006-01-20 15:10:23 +0100111
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112 /* information about this device */
Dominik Brodowskie2d40962006-03-02 00:09:29 +0100113 u16 has_manf_id:1;
114 u16 has_card_id:1;
115 u16 has_func_id:1;
Dominik Brodowski1ad275e2005-06-27 16:28:06 -0700116
Dominik Brodowski9940ec32006-03-05 11:04:33 +0100117 u16 reserved:3;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700118
119 u8 func_id;
120 u16 manf_id;
121 u16 card_id;
122
123 char * prod_id[4];
124
James Bottomley43d9f7f2007-10-16 01:23:58 -0700125 u64 dma_mask;
Dominik Brodowski0e0fad82006-01-15 01:14:31 +0100126 struct device dev;
127
128#ifdef CONFIG_PCMCIA_IOCTL
Linus Torvalds1da177e2005-04-16 15:20:36 -0700129 /* device driver wanted by cardmgr */
130 struct pcmcia_driver * cardmgr;
Dominik Brodowski0e0fad82006-01-15 01:14:31 +0100131#endif
Dominik Brodowskie2d40962006-03-02 00:09:29 +0100132
133 /* data private to drivers */
134 void *priv;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700135};
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
Dominik Brodowskia5835782008-08-28 00:41:16 +0200140/* deprecated -- don't use! */
Dominik Brodowskie12a9a92005-07-07 17:59:01 -0700141#define handle_to_dev(handle) (handle->dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700142
Dominik Brodowskia5835782008-08-28 00:41:16 +0200143
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 */
Dominik Brodowski994917f2008-08-31 15:20:26 +0200148enum 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};
Dominik Brodowski79ba6752008-08-03 14:03:07 +0200168const 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
Linus Torvalds1da177e2005-04-16 15:20:36 -0700179
Dominik Brodowski994917f2008-08-31 15:20:26 +0200180/* is the device still there? */
181struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *p_dev);
182
183/* low-level interface reset */
184int pcmcia_reset_card(struct pcmcia_socket *skt);
185
186/* CIS config */
187int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
188 conf_reg_t *reg);
189
190/* device configuration */
191int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req);
192int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req);
193int pcmcia_request_configuration(struct pcmcia_device *p_dev,
194 config_req_t *req);
195
196int pcmcia_request_window(struct pcmcia_device **p_dev, win_req_t *req,
197 window_handle_t *wh);
198int pcmcia_release_window(window_handle_t win);
199
200int pcmcia_get_mem_page(window_handle_t win, memreq_t *req);
201int pcmcia_map_mem_page(window_handle_t win, memreq_t *req);
202
203int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod);
204void pcmcia_disable_device(struct pcmcia_device *p_dev);
205
Linus Torvalds1da177e2005-04-16 15:20:36 -0700206#endif /* __KERNEL__ */
Dominik Brodowskia5835782008-08-28 00:41:16 +0200207
208
209
210/* Below, there are only definitions which are used by
211 * - the PCMCIA ioctl
212 * - deprecated PCMCIA userspace tools only
213 *
214 * here be dragons ... here be dragons ... here be dragons ... here be drag
215 */
216
217#if defined(CONFIG_PCMCIA_IOCTL) || !defined(__KERNEL__)
218
Dominik Brodowskid39bd562008-08-28 01:05:34 +0200219#if defined(__arm__) || defined(__mips__) || defined(__avr32__) || \
220 defined(__bfin__)
221/* This (ioaddr_t) is exposed to userspace & hence cannot be changed. */
222typedef u_int ioaddr_t;
223#else
224typedef u_short ioaddr_t;
225#endif
226
Dominik Brodowskia5835782008-08-28 00:41:16 +0200227/* for AdjustResourceInfo */
228typedef struct adjust_t {
229 u_int Action;
230 u_int Resource;
231 u_int Attributes;
232 union {
233 struct memory {
234 u_long Base;
235 u_long Size;
236 } memory;
237 struct io {
238 ioaddr_t BasePort;
239 ioaddr_t NumPorts;
240 u_int IOAddrLines;
241 } io;
242 struct irq {
243 u_int IRQ;
244 } irq;
245 } resource;
246} adjust_t;
247
248/* Action field */
249#define REMOVE_MANAGED_RESOURCE 1
250#define ADD_MANAGED_RESOURCE 2
251#define GET_FIRST_MANAGED_RESOURCE 3
252#define GET_NEXT_MANAGED_RESOURCE 4
253/* Resource field */
254#define RES_MEMORY_RANGE 1
255#define RES_IO_RANGE 2
256#define RES_IRQ 3
257/* Attribute field */
258#define RES_IRQ_TYPE 0x03
259#define RES_IRQ_TYPE_EXCLUSIVE 0
260#define RES_IRQ_TYPE_TIME 1
261#define RES_IRQ_TYPE_DYNAMIC 2
262#define RES_IRQ_CSC 0x04
263#define RES_SHARED 0x08
264#define RES_RESERVED 0x10
265#define RES_ALLOCATED 0x20
266#define RES_REMOVED 0x40
267
268
269typedef struct tuple_parse_t {
270 tuple_t tuple;
271 cisdata_t data[255];
272 cisparse_t parse;
273} tuple_parse_t;
274
275typedef struct win_info_t {
276 window_handle_t handle;
277 win_req_t window;
278 memreq_t map;
279} win_info_t;
280
281typedef struct bind_info_t {
282 dev_info_t dev_info;
283 u_char function;
284 struct pcmcia_device *instance;
285 char name[DEV_NAME_LEN];
286 u_short major, minor;
287 void *next;
288} bind_info_t;
289
290typedef struct mtd_info_t {
291 dev_info_t dev_info;
292 u_int Attributes;
293 u_int CardOffset;
294} mtd_info_t;
295
296typedef struct region_info_t {
297 u_int Attributes;
298 u_int CardOffset;
299 u_int RegionSize;
300 u_int AccessSpeed;
301 u_int BlockSize;
302 u_int PartMultiple;
303 u_char JedecMfr, JedecInfo;
304 memory_handle_t next;
305} region_info_t;
306
307#define REGION_TYPE 0x0001
308#define REGION_TYPE_CM 0x0000
309#define REGION_TYPE_AM 0x0001
310#define REGION_PREFETCH 0x0008
311#define REGION_CACHEABLE 0x0010
312#define REGION_BAR_MASK 0xe000
313#define REGION_BAR_SHIFT 13
314
315/* For ReplaceCIS */
316typedef struct cisdump_t {
317 u_int Length;
318 cisdata_t Data[CISTPL_MAX_CIS_SIZE];
319} cisdump_t;
320
321/* for GetConfigurationInfo */
322typedef struct config_info_t {
323 u_char Function;
324 u_int Attributes;
325 u_int Vcc, Vpp1, Vpp2;
326 u_int IntType;
327 u_int ConfigBase;
328 u_char Status, Pin, Copy, Option, ExtStatus;
329 u_int Present;
330 u_int CardValues;
331 u_int AssignedIRQ;
332 u_int IRQAttributes;
333 ioaddr_t BasePort1;
334 ioaddr_t NumPorts1;
335 u_int Attributes1;
336 ioaddr_t BasePort2;
337 ioaddr_t NumPorts2;
338 u_int Attributes2;
339 u_int IOAddrLines;
340} config_info_t;
341
342typedef union ds_ioctl_arg_t {
343 adjust_t adjust;
344 config_info_t config;
345 tuple_t tuple;
346 tuple_parse_t tuple_parse;
347 client_req_t client_req;
348 cs_status_t status;
349 conf_reg_t conf_reg;
350 cisinfo_t cisinfo;
351 region_info_t region;
352 bind_info_t bind_info;
353 mtd_info_t mtd_info;
354 win_info_t win_info;
355 cisdump_t cisdump;
356} ds_ioctl_arg_t;
357
358#define DS_ADJUST_RESOURCE_INFO _IOWR('d', 2, adjust_t)
359#define DS_GET_CONFIGURATION_INFO _IOWR('d', 3, config_info_t)
360#define DS_GET_FIRST_TUPLE _IOWR('d', 4, tuple_t)
361#define DS_GET_NEXT_TUPLE _IOWR('d', 5, tuple_t)
362#define DS_GET_TUPLE_DATA _IOWR('d', 6, tuple_parse_t)
363#define DS_PARSE_TUPLE _IOWR('d', 7, tuple_parse_t)
364#define DS_RESET_CARD _IO ('d', 8)
365#define DS_GET_STATUS _IOWR('d', 9, cs_status_t)
366#define DS_ACCESS_CONFIGURATION_REGISTER _IOWR('d', 10, conf_reg_t)
367#define DS_VALIDATE_CIS _IOR ('d', 11, cisinfo_t)
368#define DS_SUSPEND_CARD _IO ('d', 12)
369#define DS_RESUME_CARD _IO ('d', 13)
370#define DS_EJECT_CARD _IO ('d', 14)
371#define DS_INSERT_CARD _IO ('d', 15)
372#define DS_GET_FIRST_REGION _IOWR('d', 16, region_info_t)
373#define DS_GET_NEXT_REGION _IOWR('d', 17, region_info_t)
374#define DS_REPLACE_CIS _IOWR('d', 18, cisdump_t)
375#define DS_GET_FIRST_WINDOW _IOR ('d', 19, win_info_t)
376#define DS_GET_NEXT_WINDOW _IOWR('d', 20, win_info_t)
377#define DS_GET_MEM_PAGE _IOWR('d', 21, win_info_t)
378
379#define DS_BIND_REQUEST _IOWR('d', 60, bind_info_t)
380#define DS_GET_DEVICE_INFO _IOWR('d', 61, bind_info_t)
381#define DS_GET_NEXT_DEVICE _IOWR('d', 62, bind_info_t)
382#define DS_UNBIND_REQUEST _IOW ('d', 63, bind_info_t)
383#define DS_BIND_MTD _IOWR('d', 64, mtd_info_t)
384
385
386/* used in userspace only */
387#define CS_IN_USE 0x1e
388
Dominik Brodowski994917f2008-08-31 15:20:26 +0200389#define INFO_MASTER_CLIENT 0x01
390#define INFO_IO_CLIENT 0x02
391#define INFO_MTD_CLIENT 0x04
392#define INFO_MEM_CLIENT 0x08
393#define MAX_NUM_CLIENTS 3
394
395#define INFO_CARD_SHARE 0x10
396#define INFO_CARD_EXCL 0x20
397
Dominik Brodowskia5835782008-08-28 00:41:16 +0200398
399#endif /* !defined(__KERNEL__) || defined(CONFIG_PCMCIA_IOCTL) */
400
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401#endif /* _LINUX_DS_H */