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