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 /* deprecated -- don't use! */ 142 #define handle_to_dev(handle) (handle->dev) 143 144 145 /* 146 * CIS access. 147 * 148 * Please use the following functions to access CIS tuples: 149 * - pcmcia_get_tuple() 150 * - pcmcia_loop_tuple() 151 * - pcmcia_get_mac_from_cis() 152 * 153 * To parse a tuple_t, pcmcia_parse_tuple() exists. Its interface 154 * might change in future. 155 */ 156 157 /* get the very first CIS entry of type @code. Note that buf is pointer 158 * to u8 *buf; and that you need to kfree(buf) afterwards. */ 159 size_t pcmcia_get_tuple(struct pcmcia_device *p_dev, cisdata_t code, 160 u8 **buf); 161 162 /* loop over CIS entries */ 163 int pcmcia_loop_tuple(struct pcmcia_device *p_dev, cisdata_t code, 164 int (*loop_tuple) (struct pcmcia_device *p_dev, 165 tuple_t *tuple, 166 void *priv_data), 167 void *priv_data); 168 169 /* get the MAC address from CISTPL_FUNCE */ 170 int pcmcia_get_mac_from_cis(struct pcmcia_device *p_dev, 171 struct net_device *dev); 172 173 174 /* parse a tuple_t */ 175 int pcmcia_parse_tuple(tuple_t *tuple, cisparse_t *parse); 176 177 /* loop CIS entries for valid configuration */ 178 int pcmcia_loop_config(struct pcmcia_device *p_dev, 179 int (*conf_check) (struct pcmcia_device *p_dev, 180 cistpl_cftable_entry_t *cf, 181 cistpl_cftable_entry_t *dflt, 182 unsigned int vcc, 183 void *priv_data), 184 void *priv_data); 185 186 /* is the device still there? */ 187 struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *p_dev); 188 189 /* low-level interface reset */ 190 int pcmcia_reset_card(struct pcmcia_socket *skt); 191 192 /* CIS config */ 193 int pcmcia_access_configuration_register(struct pcmcia_device *p_dev, 194 conf_reg_t *reg); 195 196 /* device configuration */ 197 int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req); 198 int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req); 199 int pcmcia_request_configuration(struct pcmcia_device *p_dev, 200 config_req_t *req); 201 202 int pcmcia_request_window(struct pcmcia_device **p_dev, win_req_t *req, 203 window_handle_t *wh); 204 int pcmcia_release_window(window_handle_t win); 205 206 int pcmcia_get_mem_page(window_handle_t win, memreq_t *req); 207 int pcmcia_map_mem_page(window_handle_t win, 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