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 struct resource *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 /* for struct resource * array embedded in struct pcmcia_device */ 67 enum { 68 PCMCIA_IOPORT_0, 69 PCMCIA_IOPORT_1, 70 PCMCIA_IOMEM_0, 71 PCMCIA_IOMEM_1, 72 PCMCIA_IOMEM_2, 73 PCMCIA_IOMEM_3, 74 PCMCIA_NUM_RESOURCES, 75 }; 76 77 struct pcmcia_device { 78 /* the socket and the device_no [for multifunction devices] 79 uniquely define a pcmcia_device */ 80 struct pcmcia_socket *socket; 81 82 char *devname; 83 84 u8 device_no; 85 86 /* the hardware "function" device; certain subdevices can 87 * share one hardware "function" device. */ 88 u8 func; 89 struct config_t *function_config; 90 91 struct list_head socket_device_list; 92 93 /* deprecated, will be cleaned up soon */ 94 config_req_t conf; 95 window_handle_t win; 96 97 /* device setup */ 98 unsigned int irq; 99 struct resource *resource[PCMCIA_NUM_RESOURCES]; 100 101 unsigned int io_lines; /* number of I/O lines */ 102 103 /* Is the device suspended? */ 104 u16 suspended:1; 105 106 /* Flags whether io, irq, win configurations were 107 * requested, and whether the configuration is "locked" */ 108 u16 _irq:1; 109 u16 _io:1; 110 u16 _win:4; 111 u16 _locked:1; 112 113 /* Flag whether a "fuzzy" func_id based match is 114 * allowed. */ 115 u16 allow_func_id_match:1; 116 117 /* information about this device */ 118 u16 has_manf_id:1; 119 u16 has_card_id:1; 120 u16 has_func_id:1; 121 122 u16 reserved:4; 123 124 u8 func_id; 125 u16 manf_id; 126 u16 card_id; 127 128 char *prod_id[4]; 129 130 u64 dma_mask; 131 struct device dev; 132 133 /* data private to drivers */ 134 void *priv; 135 unsigned int open; 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_read_config_byte(struct pcmcia_device *p_dev, off_t where, u8 *val); 191 int pcmcia_write_config_byte(struct pcmcia_device *p_dev, off_t where, u8 val); 192 193 /* device configuration */ 194 int pcmcia_request_io(struct pcmcia_device *p_dev); 195 196 int __must_check 197 __pcmcia_request_exclusive_irq(struct pcmcia_device *p_dev, 198 irq_handler_t handler); 199 static inline __must_check __deprecated int 200 pcmcia_request_exclusive_irq(struct pcmcia_device *p_dev, 201 irq_handler_t handler) 202 { 203 return __pcmcia_request_exclusive_irq(p_dev, handler); 204 } 205 206 int __must_check pcmcia_request_irq(struct pcmcia_device *p_dev, 207 irq_handler_t handler); 208 209 int pcmcia_request_configuration(struct pcmcia_device *p_dev, 210 config_req_t *req); 211 212 int pcmcia_request_window(struct pcmcia_device *p_dev, win_req_t *req, 213 window_handle_t *wh); 214 int pcmcia_release_window(struct pcmcia_device *p_dev, window_handle_t win); 215 int pcmcia_map_mem_page(struct pcmcia_device *p_dev, window_handle_t win, 216 unsigned int offset); 217 218 int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod); 219 void pcmcia_disable_device(struct pcmcia_device *p_dev); 220 221 /* IO ports */ 222 #define IO_DATA_PATH_WIDTH 0x18 223 #define IO_DATA_PATH_WIDTH_8 0x00 224 #define IO_DATA_PATH_WIDTH_16 0x08 225 #define IO_DATA_PATH_WIDTH_AUTO 0x10 226 227 /* convert flag found in cfgtable to data path width parameter */ 228 static inline int pcmcia_io_cfg_data_width(unsigned int flags) 229 { 230 if (!(flags & CISTPL_IO_8BIT)) 231 return IO_DATA_PATH_WIDTH_16; 232 if (!(flags & CISTPL_IO_16BIT)) 233 return IO_DATA_PATH_WIDTH_8; 234 return IO_DATA_PATH_WIDTH_AUTO; 235 } 236 237 #endif /* __KERNEL__ */ 238 239 #endif /* _LINUX_DS_H */ 240