11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * ds.h -- 16-bit PCMCIA core support 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * This program is free software; you can redistribute it and/or modify 51da177e4SLinus Torvalds * it under the terms of the GNU General Public License version 2 as 61da177e4SLinus Torvalds * published by the Free Software Foundation. 71da177e4SLinus Torvalds * 81da177e4SLinus Torvalds * The initial developer of the original code is David A. Hinds 91da177e4SLinus Torvalds * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds 101da177e4SLinus Torvalds * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. 111da177e4SLinus Torvalds * 121da177e4SLinus Torvalds * (C) 1999 David A. Hinds 13*a5835786SDominik Brodowski * (C) 2003 - 2008 Dominik Brodowski 141da177e4SLinus Torvalds */ 151da177e4SLinus Torvalds 161da177e4SLinus Torvalds #ifndef _LINUX_DS_H 171da177e4SLinus Torvalds #define _LINUX_DS_H 181da177e4SLinus Torvalds 198e2f3b70SDominik Brodowski #ifdef __KERNEL__ 208e2f3b70SDominik Brodowski #include <linux/mod_devicetable.h> 218e2f3b70SDominik Brodowski #endif 228e2f3b70SDominik Brodowski 231da177e4SLinus Torvalds #include <pcmcia/cs_types.h> 241ad275e3SDominik Brodowski #include <pcmcia/device_id.h> 251da177e4SLinus Torvalds 26*a5835786SDominik Brodowski #ifdef __KERNEL__ 27*a5835786SDominik Brodowski #include <linux/device.h> 28*a5835786SDominik Brodowski #include <pcmcia/ss.h> 29*a5835786SDominik Brodowski 30*a5835786SDominik Brodowski /* 31*a5835786SDominik Brodowski * PCMCIA device drivers (16-bit cards only; 32-bit cards require CardBus 32*a5835786SDominik Brodowski * a.k.a. PCI drivers 33*a5835786SDominik Brodowski */ 34*a5835786SDominik Brodowski struct pcmcia_socket; 35*a5835786SDominik Brodowski struct pcmcia_device; 36*a5835786SDominik Brodowski struct config_t; 37*a5835786SDominik Brodowski 38*a5835786SDominik Brodowski /* dynamic device IDs for PCMCIA device drivers. See 39*a5835786SDominik Brodowski * Documentation/pcmcia/driver.txt for details. 40*a5835786SDominik Brodowski */ 41*a5835786SDominik Brodowski struct pcmcia_dynids { 42*a5835786SDominik Brodowski spinlock_t lock; 43*a5835786SDominik Brodowski struct list_head list; 44*a5835786SDominik Brodowski }; 45*a5835786SDominik Brodowski 46*a5835786SDominik Brodowski struct pcmcia_driver { 47*a5835786SDominik Brodowski int (*probe) (struct pcmcia_device *dev); 48*a5835786SDominik Brodowski void (*remove) (struct pcmcia_device *dev); 49*a5835786SDominik Brodowski 50*a5835786SDominik Brodowski int (*suspend) (struct pcmcia_device *dev); 51*a5835786SDominik Brodowski int (*resume) (struct pcmcia_device *dev); 52*a5835786SDominik Brodowski 53*a5835786SDominik Brodowski struct module *owner; 54*a5835786SDominik Brodowski struct pcmcia_device_id *id_table; 55*a5835786SDominik Brodowski struct device_driver drv; 56*a5835786SDominik Brodowski struct pcmcia_dynids dynids; 57*a5835786SDominik Brodowski }; 58*a5835786SDominik Brodowski 59*a5835786SDominik Brodowski /* driver registration */ 60*a5835786SDominik Brodowski int pcmcia_register_driver(struct pcmcia_driver *driver); 61*a5835786SDominik Brodowski void pcmcia_unregister_driver(struct pcmcia_driver *driver); 62*a5835786SDominik Brodowski 63*a5835786SDominik Brodowski /* Some drivers use dev_node_t to store char or block device information. 64*a5835786SDominik Brodowski * Don't use this in new drivers, though. 65*a5835786SDominik Brodowski */ 66*a5835786SDominik Brodowski typedef struct dev_node_t { 67*a5835786SDominik Brodowski char dev_name[DEV_NAME_LEN]; 68*a5835786SDominik Brodowski u_short major, minor; 69*a5835786SDominik Brodowski struct dev_node_t *next; 70*a5835786SDominik Brodowski } dev_node_t; 71*a5835786SDominik Brodowski 72*a5835786SDominik Brodowski struct pcmcia_device { 73*a5835786SDominik Brodowski /* the socket and the device_no [for multifunction devices] 74*a5835786SDominik Brodowski uniquely define a pcmcia_device */ 75*a5835786SDominik Brodowski struct pcmcia_socket *socket; 76*a5835786SDominik Brodowski 77*a5835786SDominik Brodowski char *devname; 78*a5835786SDominik Brodowski 79*a5835786SDominik Brodowski u8 device_no; 80*a5835786SDominik Brodowski 81*a5835786SDominik Brodowski /* the hardware "function" device; certain subdevices can 82*a5835786SDominik Brodowski * share one hardware "function" device. */ 83*a5835786SDominik Brodowski u8 func; 84*a5835786SDominik Brodowski struct config_t* function_config; 85*a5835786SDominik Brodowski 86*a5835786SDominik Brodowski struct list_head socket_device_list; 87*a5835786SDominik Brodowski 88*a5835786SDominik Brodowski /* deprecated, will be cleaned up soon */ 89*a5835786SDominik Brodowski dev_node_t *dev_node; 90*a5835786SDominik Brodowski u_int open; 91*a5835786SDominik Brodowski io_req_t io; 92*a5835786SDominik Brodowski irq_req_t irq; 93*a5835786SDominik Brodowski config_req_t conf; 94*a5835786SDominik Brodowski window_handle_t win; 95*a5835786SDominik Brodowski 96*a5835786SDominik Brodowski /* Is the device suspended, or in the process of 97*a5835786SDominik Brodowski * being removed? */ 98*a5835786SDominik Brodowski u16 suspended:1; 99*a5835786SDominik Brodowski u16 _removed:1; 100*a5835786SDominik Brodowski 101*a5835786SDominik Brodowski /* Flags whether io, irq, win configurations were 102*a5835786SDominik Brodowski * requested, and whether the configuration is "locked" */ 103*a5835786SDominik Brodowski u16 _irq:1; 104*a5835786SDominik Brodowski u16 _io:1; 105*a5835786SDominik Brodowski u16 _win:4; 106*a5835786SDominik Brodowski u16 _locked:1; 107*a5835786SDominik Brodowski 108*a5835786SDominik Brodowski /* Flag whether a "fuzzy" func_id based match is 109*a5835786SDominik Brodowski * allowed. */ 110*a5835786SDominik Brodowski u16 allow_func_id_match:1; 111*a5835786SDominik Brodowski 112*a5835786SDominik Brodowski /* information about this device */ 113*a5835786SDominik Brodowski u16 has_manf_id:1; 114*a5835786SDominik Brodowski u16 has_card_id:1; 115*a5835786SDominik Brodowski u16 has_func_id:1; 116*a5835786SDominik Brodowski 117*a5835786SDominik Brodowski u16 reserved:3; 118*a5835786SDominik Brodowski 119*a5835786SDominik Brodowski u8 func_id; 120*a5835786SDominik Brodowski u16 manf_id; 121*a5835786SDominik Brodowski u16 card_id; 122*a5835786SDominik Brodowski 123*a5835786SDominik Brodowski char * prod_id[4]; 124*a5835786SDominik Brodowski 125*a5835786SDominik Brodowski u64 dma_mask; 126*a5835786SDominik Brodowski struct device dev; 127*a5835786SDominik Brodowski 128*a5835786SDominik Brodowski #ifdef CONFIG_PCMCIA_IOCTL 129*a5835786SDominik Brodowski /* device driver wanted by cardmgr */ 130*a5835786SDominik Brodowski struct pcmcia_driver * cardmgr; 131*a5835786SDominik Brodowski #endif 132*a5835786SDominik Brodowski 133*a5835786SDominik Brodowski /* data private to drivers */ 134*a5835786SDominik Brodowski void *priv; 135*a5835786SDominik Brodowski }; 136*a5835786SDominik Brodowski 137*a5835786SDominik Brodowski #define to_pcmcia_dev(n) container_of(n, struct pcmcia_device, dev) 138*a5835786SDominik Brodowski #define to_pcmcia_drv(n) container_of(n, struct pcmcia_driver, drv) 139*a5835786SDominik Brodowski 140*a5835786SDominik Brodowski /* deprecated -- don't use! */ 141*a5835786SDominik Brodowski #define handle_to_dev(handle) (handle->dev) 142*a5835786SDominik Brodowski 143*a5835786SDominik Brodowski 144*a5835786SDominik Brodowski /* (deprecated) error reporting by PCMCIA devices. Use dev_printk() 145*a5835786SDominik Brodowski * or dev_dbg() directly in the driver, without referring to pcmcia_error_func() 146*a5835786SDominik Brodowski * and/or pcmcia_error_ret() for those functions will go away soon. 147*a5835786SDominik Brodowski */ 148*a5835786SDominik Brodowski 149*a5835786SDominik Brodowski const char *pcmcia_error_func(int func); 150*a5835786SDominik Brodowski const char *pcmcia_error_ret(int ret); 151*a5835786SDominik Brodowski 152*a5835786SDominik Brodowski #define cs_error(p_dev, func, ret) \ 153*a5835786SDominik Brodowski { \ 154*a5835786SDominik Brodowski dev_printk(KERN_NOTICE, &p_dev->dev, \ 155*a5835786SDominik Brodowski "%s : %s\n", \ 156*a5835786SDominik Brodowski pcmcia_error_func(func), \ 157*a5835786SDominik Brodowski pcmcia_error_ret(ret)); \ 158*a5835786SDominik Brodowski } 159*a5835786SDominik Brodowski 160*a5835786SDominik Brodowski 161*a5835786SDominik Brodowski #endif /* __KERNEL__ */ 162*a5835786SDominik Brodowski 163*a5835786SDominik Brodowski 164*a5835786SDominik Brodowski 165*a5835786SDominik Brodowski /* Below, there are only definitions which are used by 166*a5835786SDominik Brodowski * - the PCMCIA ioctl 167*a5835786SDominik Brodowski * - deprecated PCMCIA userspace tools only 168*a5835786SDominik Brodowski * 169*a5835786SDominik Brodowski * here be dragons ... here be dragons ... here be dragons ... here be drag 170*a5835786SDominik Brodowski */ 171*a5835786SDominik Brodowski 172*a5835786SDominik Brodowski #if defined(CONFIG_PCMCIA_IOCTL) || !defined(__KERNEL__) 173*a5835786SDominik Brodowski 174*a5835786SDominik Brodowski /* for AdjustResourceInfo */ 175*a5835786SDominik Brodowski typedef struct adjust_t { 176*a5835786SDominik Brodowski u_int Action; 177*a5835786SDominik Brodowski u_int Resource; 178*a5835786SDominik Brodowski u_int Attributes; 179*a5835786SDominik Brodowski union { 180*a5835786SDominik Brodowski struct memory { 181*a5835786SDominik Brodowski u_long Base; 182*a5835786SDominik Brodowski u_long Size; 183*a5835786SDominik Brodowski } memory; 184*a5835786SDominik Brodowski struct io { 185*a5835786SDominik Brodowski ioaddr_t BasePort; 186*a5835786SDominik Brodowski ioaddr_t NumPorts; 187*a5835786SDominik Brodowski u_int IOAddrLines; 188*a5835786SDominik Brodowski } io; 189*a5835786SDominik Brodowski struct irq { 190*a5835786SDominik Brodowski u_int IRQ; 191*a5835786SDominik Brodowski } irq; 192*a5835786SDominik Brodowski } resource; 193*a5835786SDominik Brodowski } adjust_t; 194*a5835786SDominik Brodowski 195*a5835786SDominik Brodowski /* Action field */ 196*a5835786SDominik Brodowski #define REMOVE_MANAGED_RESOURCE 1 197*a5835786SDominik Brodowski #define ADD_MANAGED_RESOURCE 2 198*a5835786SDominik Brodowski #define GET_FIRST_MANAGED_RESOURCE 3 199*a5835786SDominik Brodowski #define GET_NEXT_MANAGED_RESOURCE 4 200*a5835786SDominik Brodowski /* Resource field */ 201*a5835786SDominik Brodowski #define RES_MEMORY_RANGE 1 202*a5835786SDominik Brodowski #define RES_IO_RANGE 2 203*a5835786SDominik Brodowski #define RES_IRQ 3 204*a5835786SDominik Brodowski /* Attribute field */ 205*a5835786SDominik Brodowski #define RES_IRQ_TYPE 0x03 206*a5835786SDominik Brodowski #define RES_IRQ_TYPE_EXCLUSIVE 0 207*a5835786SDominik Brodowski #define RES_IRQ_TYPE_TIME 1 208*a5835786SDominik Brodowski #define RES_IRQ_TYPE_DYNAMIC 2 209*a5835786SDominik Brodowski #define RES_IRQ_CSC 0x04 210*a5835786SDominik Brodowski #define RES_SHARED 0x08 211*a5835786SDominik Brodowski #define RES_RESERVED 0x10 212*a5835786SDominik Brodowski #define RES_ALLOCATED 0x20 213*a5835786SDominik Brodowski #define RES_REMOVED 0x40 214*a5835786SDominik Brodowski 215*a5835786SDominik Brodowski 2161da177e4SLinus Torvalds typedef struct tuple_parse_t { 2171da177e4SLinus Torvalds tuple_t tuple; 2181da177e4SLinus Torvalds cisdata_t data[255]; 2191da177e4SLinus Torvalds cisparse_t parse; 2201da177e4SLinus Torvalds } tuple_parse_t; 2211da177e4SLinus Torvalds 2221da177e4SLinus Torvalds typedef struct win_info_t { 2231da177e4SLinus Torvalds window_handle_t handle; 2241da177e4SLinus Torvalds win_req_t window; 2251da177e4SLinus Torvalds memreq_t map; 2261da177e4SLinus Torvalds } win_info_t; 2271da177e4SLinus Torvalds 2281da177e4SLinus Torvalds typedef struct bind_info_t { 2291da177e4SLinus Torvalds dev_info_t dev_info; 2301da177e4SLinus Torvalds u_char function; 231fd238232SDominik Brodowski struct pcmcia_device *instance; 2321da177e4SLinus Torvalds char name[DEV_NAME_LEN]; 2331da177e4SLinus Torvalds u_short major, minor; 2341da177e4SLinus Torvalds void *next; 2351da177e4SLinus Torvalds } bind_info_t; 2361da177e4SLinus Torvalds 2371da177e4SLinus Torvalds typedef struct mtd_info_t { 2381da177e4SLinus Torvalds dev_info_t dev_info; 2391da177e4SLinus Torvalds u_int Attributes; 2401da177e4SLinus Torvalds u_int CardOffset; 2411da177e4SLinus Torvalds } mtd_info_t; 2421da177e4SLinus Torvalds 243ae49ec92SMagnus Damm typedef struct region_info_t { 244ae49ec92SMagnus Damm u_int Attributes; 245ae49ec92SMagnus Damm u_int CardOffset; 246ae49ec92SMagnus Damm u_int RegionSize; 247ae49ec92SMagnus Damm u_int AccessSpeed; 248ae49ec92SMagnus Damm u_int BlockSize; 249ae49ec92SMagnus Damm u_int PartMultiple; 250ae49ec92SMagnus Damm u_char JedecMfr, JedecInfo; 251ae49ec92SMagnus Damm memory_handle_t next; 252ae49ec92SMagnus Damm } region_info_t; 253*a5835786SDominik Brodowski 254ae49ec92SMagnus Damm #define REGION_TYPE 0x0001 255ae49ec92SMagnus Damm #define REGION_TYPE_CM 0x0000 256ae49ec92SMagnus Damm #define REGION_TYPE_AM 0x0001 257ae49ec92SMagnus Damm #define REGION_PREFETCH 0x0008 258ae49ec92SMagnus Damm #define REGION_CACHEABLE 0x0010 259ae49ec92SMagnus Damm #define REGION_BAR_MASK 0xe000 260ae49ec92SMagnus Damm #define REGION_BAR_SHIFT 13 261ae49ec92SMagnus Damm 26253efec95SDominik Brodowski /* For ReplaceCIS */ 26353efec95SDominik Brodowski typedef struct cisdump_t { 26453efec95SDominik Brodowski u_int Length; 26553efec95SDominik Brodowski cisdata_t Data[CISTPL_MAX_CIS_SIZE]; 26653efec95SDominik Brodowski } cisdump_t; 26753efec95SDominik Brodowski 2681a53088cSDominik Brodowski /* for GetConfigurationInfo */ 2691a53088cSDominik Brodowski typedef struct config_info_t { 2701a53088cSDominik Brodowski u_char Function; 2711a53088cSDominik Brodowski u_int Attributes; 2721a53088cSDominik Brodowski u_int Vcc, Vpp1, Vpp2; 2731a53088cSDominik Brodowski u_int IntType; 2741a53088cSDominik Brodowski u_int ConfigBase; 2751a53088cSDominik Brodowski u_char Status, Pin, Copy, Option, ExtStatus; 2761a53088cSDominik Brodowski u_int Present; 2771a53088cSDominik Brodowski u_int CardValues; 2781a53088cSDominik Brodowski u_int AssignedIRQ; 2791a53088cSDominik Brodowski u_int IRQAttributes; 2801a53088cSDominik Brodowski ioaddr_t BasePort1; 2811a53088cSDominik Brodowski ioaddr_t NumPorts1; 2821a53088cSDominik Brodowski u_int Attributes1; 2831a53088cSDominik Brodowski ioaddr_t BasePort2; 2841a53088cSDominik Brodowski ioaddr_t NumPorts2; 2851a53088cSDominik Brodowski u_int Attributes2; 2861a53088cSDominik Brodowski u_int IOAddrLines; 2871a53088cSDominik Brodowski } config_info_t; 2881a53088cSDominik Brodowski 2891da177e4SLinus Torvalds typedef union ds_ioctl_arg_t { 2901da177e4SLinus Torvalds adjust_t adjust; 2911da177e4SLinus Torvalds config_info_t config; 2921da177e4SLinus Torvalds tuple_t tuple; 2931da177e4SLinus Torvalds tuple_parse_t tuple_parse; 2941da177e4SLinus Torvalds client_req_t client_req; 2951da177e4SLinus Torvalds cs_status_t status; 2961da177e4SLinus Torvalds conf_reg_t conf_reg; 2971da177e4SLinus Torvalds cisinfo_t cisinfo; 2981da177e4SLinus Torvalds region_info_t region; 2991da177e4SLinus Torvalds bind_info_t bind_info; 3001da177e4SLinus Torvalds mtd_info_t mtd_info; 3011da177e4SLinus Torvalds win_info_t win_info; 3021da177e4SLinus Torvalds cisdump_t cisdump; 3031da177e4SLinus Torvalds } ds_ioctl_arg_t; 3041da177e4SLinus Torvalds 3051da177e4SLinus Torvalds #define DS_ADJUST_RESOURCE_INFO _IOWR('d', 2, adjust_t) 3061da177e4SLinus Torvalds #define DS_GET_CONFIGURATION_INFO _IOWR('d', 3, config_info_t) 3071da177e4SLinus Torvalds #define DS_GET_FIRST_TUPLE _IOWR('d', 4, tuple_t) 3081da177e4SLinus Torvalds #define DS_GET_NEXT_TUPLE _IOWR('d', 5, tuple_t) 3091da177e4SLinus Torvalds #define DS_GET_TUPLE_DATA _IOWR('d', 6, tuple_parse_t) 3101da177e4SLinus Torvalds #define DS_PARSE_TUPLE _IOWR('d', 7, tuple_parse_t) 3111da177e4SLinus Torvalds #define DS_RESET_CARD _IO ('d', 8) 3121da177e4SLinus Torvalds #define DS_GET_STATUS _IOWR('d', 9, cs_status_t) 3131da177e4SLinus Torvalds #define DS_ACCESS_CONFIGURATION_REGISTER _IOWR('d', 10, conf_reg_t) 3141da177e4SLinus Torvalds #define DS_VALIDATE_CIS _IOR ('d', 11, cisinfo_t) 3151da177e4SLinus Torvalds #define DS_SUSPEND_CARD _IO ('d', 12) 3161da177e4SLinus Torvalds #define DS_RESUME_CARD _IO ('d', 13) 3171da177e4SLinus Torvalds #define DS_EJECT_CARD _IO ('d', 14) 3181da177e4SLinus Torvalds #define DS_INSERT_CARD _IO ('d', 15) 3191da177e4SLinus Torvalds #define DS_GET_FIRST_REGION _IOWR('d', 16, region_info_t) 3201da177e4SLinus Torvalds #define DS_GET_NEXT_REGION _IOWR('d', 17, region_info_t) 3211da177e4SLinus Torvalds #define DS_REPLACE_CIS _IOWR('d', 18, cisdump_t) 3221da177e4SLinus Torvalds #define DS_GET_FIRST_WINDOW _IOR ('d', 19, win_info_t) 3231da177e4SLinus Torvalds #define DS_GET_NEXT_WINDOW _IOWR('d', 20, win_info_t) 3241da177e4SLinus Torvalds #define DS_GET_MEM_PAGE _IOWR('d', 21, win_info_t) 3251da177e4SLinus Torvalds 3261da177e4SLinus Torvalds #define DS_BIND_REQUEST _IOWR('d', 60, bind_info_t) 3271da177e4SLinus Torvalds #define DS_GET_DEVICE_INFO _IOWR('d', 61, bind_info_t) 3281da177e4SLinus Torvalds #define DS_GET_NEXT_DEVICE _IOWR('d', 62, bind_info_t) 3291da177e4SLinus Torvalds #define DS_UNBIND_REQUEST _IOW ('d', 63, bind_info_t) 3301da177e4SLinus Torvalds #define DS_BIND_MTD _IOWR('d', 64, mtd_info_t) 3311da177e4SLinus Torvalds 332*a5835786SDominik Brodowski 3339c8b7965SDominik Brodowski /* used in userspace only */ 3349c8b7965SDominik Brodowski #define CS_IN_USE 0x1e 3359c8b7965SDominik Brodowski 3361da177e4SLinus Torvalds 337*a5835786SDominik Brodowski #endif /* !defined(__KERNEL__) || defined(CONFIG_PCMCIA_IOCTL) */ 3381da177e4SLinus Torvalds 3391da177e4SLinus Torvalds #endif /* _LINUX_DS_H */ 340