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 */ 34struct pcmcia_socket; 35struct pcmcia_device; 36struct config_t; 37struct net_device; 38 39typedef struct resource *window_handle_t; 40 41/* dynamic device IDs for PCMCIA device drivers. See 42 * Documentation/pcmcia/driver.txt for details. 43*/ 44struct pcmcia_dynids { 45 struct mutex lock; 46 struct list_head list; 47}; 48 49struct 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 */ 63int pcmcia_register_driver(struct pcmcia_driver *driver); 64void pcmcia_unregister_driver(struct pcmcia_driver *driver); 65 66/* for struct resource * array embedded in struct pcmcia_device */ 67enum { 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 77struct 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. */ 156size_t pcmcia_get_tuple(struct pcmcia_device *p_dev, cisdata_t code, 157 u8 **buf); 158 159/* loop over CIS entries */ 160int 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 */ 167int pcmcia_get_mac_from_cis(struct pcmcia_device *p_dev, 168 struct net_device *dev); 169 170 171/* parse a tuple_t */ 172int pcmcia_parse_tuple(tuple_t *tuple, cisparse_t *parse); 173 174/* loop CIS entries for valid configuration */ 175int 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? */ 184struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *p_dev); 185 186/* low-level interface reset */ 187int pcmcia_reset_card(struct pcmcia_socket *skt); 188 189/* CIS config */ 190int pcmcia_read_config_byte(struct pcmcia_device *p_dev, off_t where, u8 *val); 191int pcmcia_write_config_byte(struct pcmcia_device *p_dev, off_t where, u8 val); 192 193/* device configuration */ 194int pcmcia_request_io(struct pcmcia_device *p_dev); 195 196int __must_check 197__pcmcia_request_exclusive_irq(struct pcmcia_device *p_dev, 198 irq_handler_t handler); 199static inline __must_check __deprecated int 200pcmcia_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 206int __must_check pcmcia_request_irq(struct pcmcia_device *p_dev, 207 irq_handler_t handler); 208 209int pcmcia_request_configuration(struct pcmcia_device *p_dev, 210 config_req_t *req); 211 212int pcmcia_request_window(struct pcmcia_device *p_dev, win_req_t *req, 213 window_handle_t *wh); 214int pcmcia_release_window(struct pcmcia_device *p_dev, window_handle_t win); 215int pcmcia_map_mem_page(struct pcmcia_device *p_dev, window_handle_t win, 216 unsigned int offset); 217 218int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod); 219void 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 */ 228static 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