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 - 2004 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 typedef struct tuple_parse_t { 27 tuple_t tuple; 28 cisdata_t data[255]; 29 cisparse_t parse; 30 } tuple_parse_t; 31 32 typedef struct win_info_t { 33 window_handle_t handle; 34 win_req_t window; 35 memreq_t map; 36 } win_info_t; 37 38 typedef struct bind_info_t { 39 dev_info_t dev_info; 40 u_char function; 41 struct pcmcia_device *instance; 42 char name[DEV_NAME_LEN]; 43 u_short major, minor; 44 void *next; 45 } bind_info_t; 46 47 typedef struct mtd_info_t { 48 dev_info_t dev_info; 49 u_int Attributes; 50 u_int CardOffset; 51 } mtd_info_t; 52 53 typedef struct region_info_t { 54 u_int Attributes; 55 u_int CardOffset; 56 u_int RegionSize; 57 u_int AccessSpeed; 58 u_int BlockSize; 59 u_int PartMultiple; 60 u_char JedecMfr, JedecInfo; 61 memory_handle_t next; 62 } region_info_t; 63 #define REGION_TYPE 0x0001 64 #define REGION_TYPE_CM 0x0000 65 #define REGION_TYPE_AM 0x0001 66 #define REGION_PREFETCH 0x0008 67 #define REGION_CACHEABLE 0x0010 68 #define REGION_BAR_MASK 0xe000 69 #define REGION_BAR_SHIFT 13 70 71 typedef union ds_ioctl_arg_t { 72 adjust_t adjust; 73 config_info_t config; 74 tuple_t tuple; 75 tuple_parse_t tuple_parse; 76 client_req_t client_req; 77 cs_status_t status; 78 conf_reg_t conf_reg; 79 cisinfo_t cisinfo; 80 region_info_t region; 81 bind_info_t bind_info; 82 mtd_info_t mtd_info; 83 win_info_t win_info; 84 cisdump_t cisdump; 85 } ds_ioctl_arg_t; 86 87 #define DS_ADJUST_RESOURCE_INFO _IOWR('d', 2, adjust_t) 88 #define DS_GET_CONFIGURATION_INFO _IOWR('d', 3, config_info_t) 89 #define DS_GET_FIRST_TUPLE _IOWR('d', 4, tuple_t) 90 #define DS_GET_NEXT_TUPLE _IOWR('d', 5, tuple_t) 91 #define DS_GET_TUPLE_DATA _IOWR('d', 6, tuple_parse_t) 92 #define DS_PARSE_TUPLE _IOWR('d', 7, tuple_parse_t) 93 #define DS_RESET_CARD _IO ('d', 8) 94 #define DS_GET_STATUS _IOWR('d', 9, cs_status_t) 95 #define DS_ACCESS_CONFIGURATION_REGISTER _IOWR('d', 10, conf_reg_t) 96 #define DS_VALIDATE_CIS _IOR ('d', 11, cisinfo_t) 97 #define DS_SUSPEND_CARD _IO ('d', 12) 98 #define DS_RESUME_CARD _IO ('d', 13) 99 #define DS_EJECT_CARD _IO ('d', 14) 100 #define DS_INSERT_CARD _IO ('d', 15) 101 #define DS_GET_FIRST_REGION _IOWR('d', 16, region_info_t) 102 #define DS_GET_NEXT_REGION _IOWR('d', 17, region_info_t) 103 #define DS_REPLACE_CIS _IOWR('d', 18, cisdump_t) 104 #define DS_GET_FIRST_WINDOW _IOR ('d', 19, win_info_t) 105 #define DS_GET_NEXT_WINDOW _IOWR('d', 20, win_info_t) 106 #define DS_GET_MEM_PAGE _IOWR('d', 21, win_info_t) 107 108 #define DS_BIND_REQUEST _IOWR('d', 60, bind_info_t) 109 #define DS_GET_DEVICE_INFO _IOWR('d', 61, bind_info_t) 110 #define DS_GET_NEXT_DEVICE _IOWR('d', 62, bind_info_t) 111 #define DS_UNBIND_REQUEST _IOW ('d', 63, bind_info_t) 112 #define DS_BIND_MTD _IOWR('d', 64, mtd_info_t) 113 114 #ifdef __KERNEL__ 115 #include <linux/device.h> 116 #include <pcmcia/ss.h> 117 118 typedef struct dev_node_t { 119 char dev_name[DEV_NAME_LEN]; 120 u_short major, minor; 121 struct dev_node_t *next; 122 } dev_node_t; 123 124 125 struct pcmcia_socket; 126 struct config_t; 127 128 struct pcmcia_dynids { 129 spinlock_t lock; 130 struct list_head list; 131 }; 132 133 struct pcmcia_driver { 134 int (*probe) (struct pcmcia_device *dev); 135 void (*remove) (struct pcmcia_device *dev); 136 137 int (*suspend) (struct pcmcia_device *dev); 138 int (*resume) (struct pcmcia_device *dev); 139 140 struct module *owner; 141 struct pcmcia_device_id *id_table; 142 struct device_driver drv; 143 struct pcmcia_dynids dynids; 144 }; 145 146 /* driver registration */ 147 int pcmcia_register_driver(struct pcmcia_driver *driver); 148 void pcmcia_unregister_driver(struct pcmcia_driver *driver); 149 150 151 struct pcmcia_device { 152 /* the socket and the device_no [for multifunction devices] 153 uniquely define a pcmcia_device */ 154 struct pcmcia_socket *socket; 155 156 char *devname; 157 158 u8 device_no; 159 160 /* the hardware "function" device; certain subdevices can 161 * share one hardware "function" device. */ 162 u8 func; 163 struct config_t* function_config; 164 165 struct list_head socket_device_list; 166 167 /* deprecated, will be cleaned up soon */ 168 dev_node_t *dev_node; 169 u_int open; 170 io_req_t io; 171 irq_req_t irq; 172 config_req_t conf; 173 window_handle_t win; 174 175 /* Is the device suspended, or in the process of 176 * being removed? */ 177 u16 suspended:1; 178 u16 _removed:1; 179 180 /* Flags whether io, irq, win configurations were 181 * requested, and whether the configuration is "locked" */ 182 u16 _irq:1; 183 u16 _io:1; 184 u16 _win:4; 185 u16 _locked:1; 186 187 /* Flag whether a "fuzzy" func_id based match is 188 * allowed. */ 189 u16 allow_func_id_match:1; 190 191 /* information about this device */ 192 u16 has_manf_id:1; 193 u16 has_card_id:1; 194 u16 has_func_id:1; 195 196 u16 reserved:3; 197 198 u8 func_id; 199 u16 manf_id; 200 u16 card_id; 201 202 char * prod_id[4]; 203 204 u64 dma_mask; 205 struct device dev; 206 207 #ifdef CONFIG_PCMCIA_IOCTL 208 /* device driver wanted by cardmgr */ 209 struct pcmcia_driver * cardmgr; 210 #endif 211 212 /* data private to drivers */ 213 void *priv; 214 }; 215 216 #define to_pcmcia_dev(n) container_of(n, struct pcmcia_device, dev) 217 #define to_pcmcia_drv(n) container_of(n, struct pcmcia_driver, drv) 218 219 #define handle_to_dev(handle) (handle->dev) 220 221 /* error reporting */ 222 void cs_error(struct pcmcia_device *handle, int func, int ret); 223 224 #endif /* __KERNEL__ */ 225 #endif /* _LINUX_DS_H */ 226