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