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/device_id.h> 24 25 #ifdef __KERNEL__ 26 #include <linux/device.h> 27 #include <pcmcia/ss.h> 28 #include <asm/atomic.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 typedef unsigned long window_handle_t; 40 41 /* dynamic device IDs for PCMCIA device drivers. See 42 * Documentation/pcmcia/driver.txt for details. 43 */ 44 struct pcmcia_dynids { 45 struct mutex lock; 46 struct list_head list; 47 }; 48 49 struct pcmcia_driver { 50 int (*probe) (struct pcmcia_device *dev); 51 void (*remove) (struct pcmcia_device *dev); 52 53 int (*suspend) (struct pcmcia_device *dev); 54 int (*resume) (struct pcmcia_device *dev); 55 56 struct module *owner; 57 struct pcmcia_device_id *id_table; 58 struct device_driver drv; 59 struct pcmcia_dynids dynids; 60 }; 61 62 /* driver registration */ 63 int pcmcia_register_driver(struct pcmcia_driver *driver); 64 void pcmcia_unregister_driver(struct pcmcia_driver *driver); 65 66 struct pcmcia_device { 67 /* the socket and the device_no [for multifunction devices] 68 uniquely define a pcmcia_device */ 69 struct pcmcia_socket *socket; 70 71 char *devname; 72 73 u8 device_no; 74 75 /* the hardware "function" device; certain subdevices can 76 * share one hardware "function" device. */ 77 u8 func; 78 struct config_t *function_config; 79 80 struct list_head socket_device_list; 81 82 /* deprecated, will be cleaned up soon */ 83 u_int open; 84 io_req_t io; 85 config_req_t conf; 86 window_handle_t win; 87 88 /* device setup */ 89 unsigned int irq; 90 91 /* Is the device suspended? */ 92 u16 suspended:1; 93 94 /* Flags whether io, irq, win configurations were 95 * requested, and whether the configuration is "locked" */ 96 u16 _irq:1; 97 u16 _io:1; 98 u16 _win:4; 99 u16 _locked:1; 100 101 /* Flag whether a "fuzzy" func_id based match is 102 * allowed. */ 103 u16 allow_func_id_match:1; 104 105 /* information about this device */ 106 u16 has_manf_id:1; 107 u16 has_card_id:1; 108 u16 has_func_id:1; 109 110 u16 reserved:4; 111 112 u8 func_id; 113 u16 manf_id; 114 u16 card_id; 115 116 char *prod_id[4]; 117 118 u64 dma_mask; 119 struct device dev; 120 121 /* data private to drivers */ 122 void *priv; 123 }; 124 125 #define to_pcmcia_dev(n) container_of(n, struct pcmcia_device, dev) 126 #define to_pcmcia_drv(n) container_of(n, struct pcmcia_driver, drv) 127 128 129 /* 130 * CIS access. 131 * 132 * Please use the following functions to access CIS tuples: 133 * - pcmcia_get_tuple() 134 * - pcmcia_loop_tuple() 135 * - pcmcia_get_mac_from_cis() 136 * 137 * To parse a tuple_t, pcmcia_parse_tuple() exists. Its interface 138 * might change in future. 139 */ 140 141 /* get the very first CIS entry of type @code. Note that buf is pointer 142 * to u8 *buf; and that you need to kfree(buf) afterwards. */ 143 size_t pcmcia_get_tuple(struct pcmcia_device *p_dev, cisdata_t code, 144 u8 **buf); 145 146 /* loop over CIS entries */ 147 int pcmcia_loop_tuple(struct pcmcia_device *p_dev, cisdata_t code, 148 int (*loop_tuple) (struct pcmcia_device *p_dev, 149 tuple_t *tuple, 150 void *priv_data), 151 void *priv_data); 152 153 /* get the MAC address from CISTPL_FUNCE */ 154 int pcmcia_get_mac_from_cis(struct pcmcia_device *p_dev, 155 struct net_device *dev); 156 157 158 /* parse a tuple_t */ 159 int pcmcia_parse_tuple(tuple_t *tuple, cisparse_t *parse); 160 161 /* loop CIS entries for valid configuration */ 162 int pcmcia_loop_config(struct pcmcia_device *p_dev, 163 int (*conf_check) (struct pcmcia_device *p_dev, 164 cistpl_cftable_entry_t *cf, 165 cistpl_cftable_entry_t *dflt, 166 unsigned int vcc, 167 void *priv_data), 168 void *priv_data); 169 170 /* is the device still there? */ 171 struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *p_dev); 172 173 /* low-level interface reset */ 174 int pcmcia_reset_card(struct pcmcia_socket *skt); 175 176 /* CIS config */ 177 int pcmcia_access_configuration_register(struct pcmcia_device *p_dev, 178 conf_reg_t *reg); 179 180 /* device configuration */ 181 int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req); 182 183 int __must_check 184 __pcmcia_request_exclusive_irq(struct pcmcia_device *p_dev, 185 irq_handler_t handler); 186 static inline __must_check __deprecated int 187 pcmcia_request_exclusive_irq(struct pcmcia_device *p_dev, 188 irq_handler_t handler) 189 { 190 return __pcmcia_request_exclusive_irq(p_dev, handler); 191 } 192 193 int __must_check pcmcia_request_irq(struct pcmcia_device *p_dev, 194 irq_handler_t handler); 195 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 #endif /* _LINUX_DS_H */ 211