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