2 * ds.h -- 16-bit PCMCIA core support
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.
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.
12 * (C) 1999 David A. Hinds
13 * (C) 2003 - 2008 Dominik Brodowski
20 #include <linux/mod_devicetable.h>
23 #include <pcmcia/cs_types.h>
24 #include <pcmcia/device_id.h>
27 #include <linux/device.h>
28 #include <pcmcia/ss.h>
31 * PCMCIA device drivers (16-bit cards only; 32-bit cards require CardBus
39 /* dynamic device IDs for PCMCIA device drivers. See
40 * Documentation/pcmcia/driver.txt for details.
42 struct pcmcia_dynids {
44 struct list_head list;
47 struct pcmcia_driver {
48 int (*probe) (struct pcmcia_device *dev);
49 void (*remove) (struct pcmcia_device *dev);
51 int (*suspend) (struct pcmcia_device *dev);
52 int (*resume) (struct pcmcia_device *dev);
55 struct pcmcia_device_id *id_table;
56 struct device_driver drv;
57 struct pcmcia_dynids dynids;
60 /* driver registration */
61 int pcmcia_register_driver(struct pcmcia_driver *driver);
62 void pcmcia_unregister_driver(struct pcmcia_driver *driver);
64 /* Some drivers use dev_node_t to store char or block device information.
65 * Don't use this in new drivers, though.
67 typedef struct dev_node_t {
68 char dev_name[DEV_NAME_LEN];
70 struct dev_node_t *next;
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;
82 /* the hardware "function" device; certain subdevices can
83 * share one hardware "function" device. */
85 struct config_t* function_config;
87 struct list_head socket_device_list;
89 /* deprecated, will be cleaned up soon */
97 /* Is the device suspended, or in the process of
102 /* Flags whether io, irq, win configurations were
103 * requested, and whether the configuration is "locked" */
109 /* Flag whether a "fuzzy" func_id based match is
111 u16 allow_func_id_match:1;
113 /* information about this device */
129 #ifdef CONFIG_PCMCIA_IOCTL
130 /* device driver wanted by cardmgr */
131 struct pcmcia_driver * cardmgr;
134 /* data private to drivers */
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)
141 /* deprecated -- don't use! */
142 #define handle_to_dev(handle) (handle->dev)
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.
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
169 const char *pcmcia_error_func(int func);
170 const char *pcmcia_error_ret(int ret);
172 #define cs_error(p_dev, func, ret) \
174 dev_printk(KERN_NOTICE, &p_dev->dev, \
176 pcmcia_error_func(func), \
177 pcmcia_error_ret(ret)); \
184 * Please use the following functions to access CIS tuples:
185 * - pcmcia_get_tuple()
186 * - pcmcia_loop_tuple()
187 * - pcmcia_get_mac_from_cis()
189 * To parse a tuple_t, pcmcia_parse_tuple() exists. Its interface
190 * might change in future.
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,
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,
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);
210 /* parse a tuple_t */
211 int pcmcia_parse_tuple(tuple_t *tuple, cisparse_t *parse);
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,
222 /* is the device still there? */
223 struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *p_dev);
225 /* low-level interface reset */
226 int pcmcia_reset_card(struct pcmcia_socket *skt);
229 int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
232 /* deprecated -- do not use in drivers. */
233 int pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function,
235 #define pcmcia_get_first_tuple(p_dev, tuple) \
236 pccard_get_first_tuple(p_dev->socket, p_dev->func, tuple)
238 int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function,
240 #define pcmcia_get_next_tuple(p_dev, tuple) \
241 pccard_get_next_tuple(p_dev->socket, p_dev->func, tuple)
243 int pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple);
244 #define pcmcia_get_tuple_data(p_dev, tuple) \
245 pccard_get_tuple_data(p_dev->socket, tuple)
247 /* device configuration */
248 int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req);
249 int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req);
250 int pcmcia_request_configuration(struct pcmcia_device *p_dev,
253 int pcmcia_request_window(struct pcmcia_device **p_dev, win_req_t *req,
254 window_handle_t *wh);
255 int pcmcia_release_window(window_handle_t win);
257 int pcmcia_get_mem_page(window_handle_t win, memreq_t *req);
258 int pcmcia_map_mem_page(window_handle_t win, memreq_t *req);
260 int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod);
261 void pcmcia_disable_device(struct pcmcia_device *p_dev);
263 #endif /* __KERNEL__ */
267 /* Below, there are only definitions which are used by
269 * - deprecated PCMCIA userspace tools only
271 * here be dragons ... here be dragons ... here be dragons ... here be drag
274 #if defined(CONFIG_PCMCIA_IOCTL) || !defined(__KERNEL__)
276 #if defined(__arm__) || defined(__mips__) || defined(__avr32__) || \
278 /* This (ioaddr_t) is exposed to userspace & hence cannot be changed. */
279 typedef u_int ioaddr_t;
281 typedef u_short ioaddr_t;
284 /* for AdjustResourceInfo */
285 typedef struct adjust_t {
306 #define REMOVE_MANAGED_RESOURCE 1
307 #define ADD_MANAGED_RESOURCE 2
308 #define GET_FIRST_MANAGED_RESOURCE 3
309 #define GET_NEXT_MANAGED_RESOURCE 4
311 #define RES_MEMORY_RANGE 1
312 #define RES_IO_RANGE 2
314 /* Attribute field */
315 #define RES_IRQ_TYPE 0x03
316 #define RES_IRQ_TYPE_EXCLUSIVE 0
317 #define RES_IRQ_TYPE_TIME 1
318 #define RES_IRQ_TYPE_DYNAMIC 2
319 #define RES_IRQ_CSC 0x04
320 #define RES_SHARED 0x08
321 #define RES_RESERVED 0x10
322 #define RES_ALLOCATED 0x20
323 #define RES_REMOVED 0x40
326 typedef struct tuple_parse_t {
332 typedef struct win_info_t {
333 window_handle_t handle;
338 typedef struct bind_info_t {
341 struct pcmcia_device *instance;
342 char name[DEV_NAME_LEN];
343 u_short major, minor;
347 typedef struct mtd_info_t {
353 typedef struct region_info_t {
360 u_char JedecMfr, JedecInfo;
361 memory_handle_t next;
364 #define REGION_TYPE 0x0001
365 #define REGION_TYPE_CM 0x0000
366 #define REGION_TYPE_AM 0x0001
367 #define REGION_PREFETCH 0x0008
368 #define REGION_CACHEABLE 0x0010
369 #define REGION_BAR_MASK 0xe000
370 #define REGION_BAR_SHIFT 13
373 typedef struct cisdump_t {
375 cisdata_t Data[CISTPL_MAX_CIS_SIZE];
378 /* for GetConfigurationInfo */
379 typedef struct config_info_t {
382 u_int Vcc, Vpp1, Vpp2;
385 u_char Status, Pin, Copy, Option, ExtStatus;
399 /* For ValidateCIS */
400 typedef struct cisinfo_t {
404 typedef struct cs_status_t {
410 typedef union ds_ioctl_arg_t {
412 config_info_t config;
414 tuple_parse_t tuple_parse;
415 client_req_t client_req;
419 region_info_t region;
420 bind_info_t bind_info;
426 #define DS_ADJUST_RESOURCE_INFO _IOWR('d', 2, adjust_t)
427 #define DS_GET_CONFIGURATION_INFO _IOWR('d', 3, config_info_t)
428 #define DS_GET_FIRST_TUPLE _IOWR('d', 4, tuple_t)
429 #define DS_GET_NEXT_TUPLE _IOWR('d', 5, tuple_t)
430 #define DS_GET_TUPLE_DATA _IOWR('d', 6, tuple_parse_t)
431 #define DS_PARSE_TUPLE _IOWR('d', 7, tuple_parse_t)
432 #define DS_RESET_CARD _IO ('d', 8)
433 #define DS_GET_STATUS _IOWR('d', 9, cs_status_t)
434 #define DS_ACCESS_CONFIGURATION_REGISTER _IOWR('d', 10, conf_reg_t)
435 #define DS_VALIDATE_CIS _IOR ('d', 11, cisinfo_t)
436 #define DS_SUSPEND_CARD _IO ('d', 12)
437 #define DS_RESUME_CARD _IO ('d', 13)
438 #define DS_EJECT_CARD _IO ('d', 14)
439 #define DS_INSERT_CARD _IO ('d', 15)
440 #define DS_GET_FIRST_REGION _IOWR('d', 16, region_info_t)
441 #define DS_GET_NEXT_REGION _IOWR('d', 17, region_info_t)
442 #define DS_REPLACE_CIS _IOWR('d', 18, cisdump_t)
443 #define DS_GET_FIRST_WINDOW _IOR ('d', 19, win_info_t)
444 #define DS_GET_NEXT_WINDOW _IOWR('d', 20, win_info_t)
445 #define DS_GET_MEM_PAGE _IOWR('d', 21, win_info_t)
447 #define DS_BIND_REQUEST _IOWR('d', 60, bind_info_t)
448 #define DS_GET_DEVICE_INFO _IOWR('d', 61, bind_info_t)
449 #define DS_GET_NEXT_DEVICE _IOWR('d', 62, bind_info_t)
450 #define DS_UNBIND_REQUEST _IOW ('d', 63, bind_info_t)
451 #define DS_BIND_MTD _IOWR('d', 64, mtd_info_t)
454 /* used in userspace only */
455 #define CS_IN_USE 0x1e
457 #define INFO_MASTER_CLIENT 0x01
458 #define INFO_IO_CLIENT 0x02
459 #define INFO_MTD_CLIENT 0x04
460 #define INFO_MEM_CLIENT 0x08
461 #define MAX_NUM_CLIENTS 3
463 #define INFO_CARD_SHARE 0x10
464 #define INFO_CARD_EXCL 0x20
467 #endif /* !defined(__KERNEL__) || defined(CONFIG_PCMCIA_IOCTL) */
469 #endif /* _LINUX_DS_H */