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 131da177e4SLinus Torvalds * (C) 2003 - 2004 Dominik Brodowski 141da177e4SLinus Torvalds */ 151da177e4SLinus Torvalds 161da177e4SLinus Torvalds #ifndef _LINUX_DS_H 171da177e4SLinus Torvalds #define _LINUX_DS_H 181da177e4SLinus Torvalds 19*8e2f3b70SDominik Brodowski #ifdef __KERNEL__ 20*8e2f3b70SDominik Brodowski #include <linux/mod_devicetable.h> 21*8e2f3b70SDominik Brodowski #endif 22*8e2f3b70SDominik Brodowski 231da177e4SLinus Torvalds #include <pcmcia/bulkmem.h> 241da177e4SLinus Torvalds #include <pcmcia/cs_types.h> 251ad275e3SDominik Brodowski #include <pcmcia/device_id.h> 261da177e4SLinus Torvalds 271da177e4SLinus Torvalds typedef struct tuple_parse_t { 281da177e4SLinus Torvalds tuple_t tuple; 291da177e4SLinus Torvalds cisdata_t data[255]; 301da177e4SLinus Torvalds cisparse_t parse; 311da177e4SLinus Torvalds } tuple_parse_t; 321da177e4SLinus Torvalds 331da177e4SLinus Torvalds typedef struct win_info_t { 341da177e4SLinus Torvalds window_handle_t handle; 351da177e4SLinus Torvalds win_req_t window; 361da177e4SLinus Torvalds memreq_t map; 371da177e4SLinus Torvalds } win_info_t; 381da177e4SLinus Torvalds 391da177e4SLinus Torvalds typedef struct bind_info_t { 401da177e4SLinus Torvalds dev_info_t dev_info; 411da177e4SLinus Torvalds u_char function; 421da177e4SLinus Torvalds struct dev_link_t *instance; 431da177e4SLinus Torvalds char name[DEV_NAME_LEN]; 441da177e4SLinus Torvalds u_short major, minor; 451da177e4SLinus Torvalds void *next; 461da177e4SLinus Torvalds } bind_info_t; 471da177e4SLinus Torvalds 481da177e4SLinus Torvalds typedef struct mtd_info_t { 491da177e4SLinus Torvalds dev_info_t dev_info; 501da177e4SLinus Torvalds u_int Attributes; 511da177e4SLinus Torvalds u_int CardOffset; 521da177e4SLinus Torvalds } mtd_info_t; 531da177e4SLinus Torvalds 541da177e4SLinus Torvalds typedef union ds_ioctl_arg_t { 551da177e4SLinus Torvalds adjust_t adjust; 561da177e4SLinus Torvalds config_info_t config; 571da177e4SLinus Torvalds tuple_t tuple; 581da177e4SLinus Torvalds tuple_parse_t tuple_parse; 591da177e4SLinus Torvalds client_req_t client_req; 601da177e4SLinus Torvalds cs_status_t status; 611da177e4SLinus Torvalds conf_reg_t conf_reg; 621da177e4SLinus Torvalds cisinfo_t cisinfo; 631da177e4SLinus Torvalds region_info_t region; 641da177e4SLinus Torvalds bind_info_t bind_info; 651da177e4SLinus Torvalds mtd_info_t mtd_info; 661da177e4SLinus Torvalds win_info_t win_info; 671da177e4SLinus Torvalds cisdump_t cisdump; 681da177e4SLinus Torvalds } ds_ioctl_arg_t; 691da177e4SLinus Torvalds 701da177e4SLinus Torvalds #define DS_ADJUST_RESOURCE_INFO _IOWR('d', 2, adjust_t) 711da177e4SLinus Torvalds #define DS_GET_CONFIGURATION_INFO _IOWR('d', 3, config_info_t) 721da177e4SLinus Torvalds #define DS_GET_FIRST_TUPLE _IOWR('d', 4, tuple_t) 731da177e4SLinus Torvalds #define DS_GET_NEXT_TUPLE _IOWR('d', 5, tuple_t) 741da177e4SLinus Torvalds #define DS_GET_TUPLE_DATA _IOWR('d', 6, tuple_parse_t) 751da177e4SLinus Torvalds #define DS_PARSE_TUPLE _IOWR('d', 7, tuple_parse_t) 761da177e4SLinus Torvalds #define DS_RESET_CARD _IO ('d', 8) 771da177e4SLinus Torvalds #define DS_GET_STATUS _IOWR('d', 9, cs_status_t) 781da177e4SLinus Torvalds #define DS_ACCESS_CONFIGURATION_REGISTER _IOWR('d', 10, conf_reg_t) 791da177e4SLinus Torvalds #define DS_VALIDATE_CIS _IOR ('d', 11, cisinfo_t) 801da177e4SLinus Torvalds #define DS_SUSPEND_CARD _IO ('d', 12) 811da177e4SLinus Torvalds #define DS_RESUME_CARD _IO ('d', 13) 821da177e4SLinus Torvalds #define DS_EJECT_CARD _IO ('d', 14) 831da177e4SLinus Torvalds #define DS_INSERT_CARD _IO ('d', 15) 841da177e4SLinus Torvalds #define DS_GET_FIRST_REGION _IOWR('d', 16, region_info_t) 851da177e4SLinus Torvalds #define DS_GET_NEXT_REGION _IOWR('d', 17, region_info_t) 861da177e4SLinus Torvalds #define DS_REPLACE_CIS _IOWR('d', 18, cisdump_t) 871da177e4SLinus Torvalds #define DS_GET_FIRST_WINDOW _IOR ('d', 19, win_info_t) 881da177e4SLinus Torvalds #define DS_GET_NEXT_WINDOW _IOWR('d', 20, win_info_t) 891da177e4SLinus Torvalds #define DS_GET_MEM_PAGE _IOWR('d', 21, win_info_t) 901da177e4SLinus Torvalds 911da177e4SLinus Torvalds #define DS_BIND_REQUEST _IOWR('d', 60, bind_info_t) 921da177e4SLinus Torvalds #define DS_GET_DEVICE_INFO _IOWR('d', 61, bind_info_t) 931da177e4SLinus Torvalds #define DS_GET_NEXT_DEVICE _IOWR('d', 62, bind_info_t) 941da177e4SLinus Torvalds #define DS_UNBIND_REQUEST _IOW ('d', 63, bind_info_t) 951da177e4SLinus Torvalds #define DS_BIND_MTD _IOWR('d', 64, mtd_info_t) 961da177e4SLinus Torvalds 971da177e4SLinus Torvalds #ifdef __KERNEL__ 981da177e4SLinus Torvalds #include <linux/device.h> 991da177e4SLinus Torvalds 1001da177e4SLinus Torvalds typedef struct dev_node_t { 1011da177e4SLinus Torvalds char dev_name[DEV_NAME_LEN]; 1021da177e4SLinus Torvalds u_short major, minor; 1031da177e4SLinus Torvalds struct dev_node_t *next; 1041da177e4SLinus Torvalds } dev_node_t; 1051da177e4SLinus Torvalds 1061da177e4SLinus Torvalds typedef struct dev_link_t { 1071da177e4SLinus Torvalds dev_node_t *dev; 1081da177e4SLinus Torvalds u_int state, open; 1091da177e4SLinus Torvalds wait_queue_head_t pending; 1101da177e4SLinus Torvalds client_handle_t handle; 1111da177e4SLinus Torvalds io_req_t io; 1121da177e4SLinus Torvalds irq_req_t irq; 1131da177e4SLinus Torvalds config_req_t conf; 1141da177e4SLinus Torvalds window_handle_t win; 1151da177e4SLinus Torvalds void *priv; 1161da177e4SLinus Torvalds struct dev_link_t *next; 1171da177e4SLinus Torvalds } dev_link_t; 1181da177e4SLinus Torvalds 1191da177e4SLinus Torvalds /* Flags for device state */ 1201da177e4SLinus Torvalds #define DEV_PRESENT 0x01 1211da177e4SLinus Torvalds #define DEV_CONFIG 0x02 1221da177e4SLinus Torvalds #define DEV_STALE_CONFIG 0x04 /* release on close */ 1231da177e4SLinus Torvalds #define DEV_STALE_LINK 0x08 /* detach on release */ 1241da177e4SLinus Torvalds #define DEV_CONFIG_PENDING 0x10 1251da177e4SLinus Torvalds #define DEV_RELEASE_PENDING 0x20 1261da177e4SLinus Torvalds #define DEV_SUSPEND 0x40 1271da177e4SLinus Torvalds #define DEV_BUSY 0x80 1281da177e4SLinus Torvalds 1291da177e4SLinus Torvalds #define DEV_OK(l) \ 1301da177e4SLinus Torvalds ((l) && ((l->state & ~DEV_BUSY) == (DEV_CONFIG|DEV_PRESENT))) 1311da177e4SLinus Torvalds 1321da177e4SLinus Torvalds 1331da177e4SLinus Torvalds struct pcmcia_socket; 1341da177e4SLinus Torvalds 1351da177e4SLinus Torvalds struct pcmcia_driver { 1361da177e4SLinus Torvalds dev_link_t *(*attach)(void); 1371e212f36SDominik Brodowski int (*event) (event_t event, int priority, 1381e212f36SDominik Brodowski event_callback_args_t *); 1391da177e4SLinus Torvalds void (*detach)(dev_link_t *); 1401da177e4SLinus Torvalds struct module *owner; 1411ad275e3SDominik Brodowski struct pcmcia_device_id *id_table; 1421da177e4SLinus Torvalds struct device_driver drv; 1431da177e4SLinus Torvalds }; 1441da177e4SLinus Torvalds 1451da177e4SLinus Torvalds /* driver registration */ 1461da177e4SLinus Torvalds int pcmcia_register_driver(struct pcmcia_driver *driver); 1471da177e4SLinus Torvalds void pcmcia_unregister_driver(struct pcmcia_driver *driver); 1481da177e4SLinus Torvalds 1491da177e4SLinus Torvalds struct pcmcia_device { 1501da177e4SLinus Torvalds /* the socket and the device_no [for multifunction devices] 1511da177e4SLinus Torvalds uniquely define a pcmcia_device */ 1521da177e4SLinus Torvalds struct pcmcia_socket *socket; 1531da177e4SLinus Torvalds 1541da177e4SLinus Torvalds u8 device_no; 1551da177e4SLinus Torvalds 1561da177e4SLinus Torvalds /* the hardware "function" device; certain subdevices can 1571da177e4SLinus Torvalds * share one hardware "function" device. */ 1581da177e4SLinus Torvalds u8 func; 1591da177e4SLinus Torvalds 1601da177e4SLinus Torvalds struct list_head socket_device_list; 1611da177e4SLinus Torvalds 1621da177e4SLinus Torvalds /* deprecated, a cleaned up version will be moved into this 1631da177e4SLinus Torvalds struct soon */ 1641da177e4SLinus Torvalds dev_link_t *instance; 1651e212f36SDominik Brodowski event_callback_args_t event_callback_args; 1661da177e4SLinus Torvalds u_int state; 1671da177e4SLinus Torvalds 1681da177e4SLinus Torvalds /* information about this device */ 1691da177e4SLinus Torvalds u8 has_manf_id:1; 1701da177e4SLinus Torvalds u8 has_card_id:1; 1711da177e4SLinus Torvalds u8 has_func_id:1; 1721ad275e3SDominik Brodowski 1731ad275e3SDominik Brodowski u8 allow_func_id_match:1; 1741ad275e3SDominik Brodowski u8 reserved:4; 1751da177e4SLinus Torvalds 1761da177e4SLinus Torvalds u8 func_id; 1771da177e4SLinus Torvalds u16 manf_id; 1781da177e4SLinus Torvalds u16 card_id; 1791da177e4SLinus Torvalds 1801da177e4SLinus Torvalds char * prod_id[4]; 1811da177e4SLinus Torvalds 1821da177e4SLinus Torvalds /* device driver wanted by cardmgr */ 1831da177e4SLinus Torvalds struct pcmcia_driver * cardmgr; 1841da177e4SLinus Torvalds 1851da177e4SLinus Torvalds struct device dev; 1861da177e4SLinus Torvalds }; 1871da177e4SLinus Torvalds 1881da177e4SLinus Torvalds #define to_pcmcia_dev(n) container_of(n, struct pcmcia_device, dev) 1891da177e4SLinus Torvalds #define to_pcmcia_drv(n) container_of(n, struct pcmcia_driver, drv) 1901da177e4SLinus Torvalds 191e12a9a93SDominik Brodowski #define handle_to_pdev(handle) (handle) 192e12a9a93SDominik Brodowski #define handle_to_dev(handle) (handle->dev) 1931da177e4SLinus Torvalds 1941da177e4SLinus Torvalds /* error reporting */ 1951da177e4SLinus Torvalds void cs_error(client_handle_t handle, int func, int ret); 1961da177e4SLinus Torvalds 1971da177e4SLinus Torvalds #endif /* __KERNEL__ */ 1981da177e4SLinus Torvalds #endif /* _LINUX_DS_H */ 199