/* * ds.h -- 16-bit PCMCIA core support * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * The initial developer of the original code is David A. Hinds * . Portions created by David A. Hinds * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. * * (C) 1999 David A. Hinds * (C) 2003 - 2008 Dominik Brodowski */ #ifndef _LINUX_DS_H #define _LINUX_DS_H #ifdef __KERNEL__ #include #endif #include #include #ifdef __KERNEL__ #include #include /* * PCMCIA device drivers (16-bit cards only; 32-bit cards require CardBus * a.k.a. PCI drivers */ struct pcmcia_socket; struct pcmcia_device; struct config_t; /* dynamic device IDs for PCMCIA device drivers. See * Documentation/pcmcia/driver.txt for details. */ struct pcmcia_dynids { spinlock_t lock; struct list_head list; }; struct pcmcia_driver { int (*probe) (struct pcmcia_device *dev); void (*remove) (struct pcmcia_device *dev); int (*suspend) (struct pcmcia_device *dev); int (*resume) (struct pcmcia_device *dev); struct module *owner; struct pcmcia_device_id *id_table; struct device_driver drv; struct pcmcia_dynids dynids; }; /* driver registration */ int pcmcia_register_driver(struct pcmcia_driver *driver); void pcmcia_unregister_driver(struct pcmcia_driver *driver); /* Some drivers use dev_node_t to store char or block device information. * Don't use this in new drivers, though. */ typedef struct dev_node_t { char dev_name[DEV_NAME_LEN]; u_short major, minor; struct dev_node_t *next; } dev_node_t; struct pcmcia_device { /* the socket and the device_no [for multifunction devices] uniquely define a pcmcia_device */ struct pcmcia_socket *socket; char *devname; u8 device_no; /* the hardware "function" device; certain subdevices can * share one hardware "function" device. */ u8 func; struct config_t* function_config; struct list_head socket_device_list; /* deprecated, will be cleaned up soon */ dev_node_t *dev_node; u_int open; io_req_t io; irq_req_t irq; config_req_t conf; window_handle_t win; /* Is the device suspended, or in the process of * being removed? */ u16 suspended:1; u16 _removed:1; /* Flags whether io, irq, win configurations were * requested, and whether the configuration is "locked" */ u16 _irq:1; u16 _io:1; u16 _win:4; u16 _locked:1; /* Flag whether a "fuzzy" func_id based match is * allowed. */ u16 allow_func_id_match:1; /* information about this device */ u16 has_manf_id:1; u16 has_card_id:1; u16 has_func_id:1; u16 reserved:3; u8 func_id; u16 manf_id; u16 card_id; char * prod_id[4]; u64 dma_mask; struct device dev; #ifdef CONFIG_PCMCIA_IOCTL /* device driver wanted by cardmgr */ struct pcmcia_driver * cardmgr; #endif /* data private to drivers */ void *priv; }; #define to_pcmcia_dev(n) container_of(n, struct pcmcia_device, dev) #define to_pcmcia_drv(n) container_of(n, struct pcmcia_driver, drv) /* deprecated -- don't use! */ #define handle_to_dev(handle) (handle->dev) /* (deprecated) error reporting by PCMCIA devices. Use dev_printk() * or dev_dbg() directly in the driver, without referring to pcmcia_error_func() * and/or pcmcia_error_ret() for those functions will go away soon. */ enum service { AccessConfigurationRegister, AddSocketServices, AdjustResourceInfo, CheckEraseQueue, CloseMemory, CopyMemory, DeregisterClient, DeregisterEraseQueue, GetCardServicesInfo, GetClientInfo, GetConfigurationInfo, GetEventMask, GetFirstClient, GetFirstPartion, GetFirstRegion, GetFirstTuple, GetNextClient, GetNextPartition, GetNextRegion, GetNextTuple, GetStatus, GetTupleData, MapLogSocket, MapLogWindow, MapMemPage, MapPhySocket, MapPhyWindow, ModifyConfiguration, ModifyWindow, OpenMemory, ParseTuple, ReadMemory, RegisterClient, RegisterEraseQueue, RegisterMTD, RegisterTimer, ReleaseConfiguration, ReleaseExclusive, ReleaseIO, ReleaseIRQ, ReleaseSocketMask, ReleaseWindow, ReplaceSocketServices, RequestConfiguration, RequestExclusive, RequestIO, RequestIRQ, RequestSocketMask, RequestWindow, ResetCard, ReturnSSEntry, SetEventMask, SetRegion, ValidateCIS, VendorSpecific, WriteMemory, BindDevice, BindMTD, ReportError, SuspendCard, ResumeCard, EjectCard, InsertCard, ReplaceCIS, GetFirstWindow, GetNextWindow, GetMemPage }; const char *pcmcia_error_func(int func); const char *pcmcia_error_ret(int ret); #define cs_error(p_dev, func, ret) \ { \ dev_printk(KERN_NOTICE, &p_dev->dev, \ "%s : %s\n", \ pcmcia_error_func(func), \ pcmcia_error_ret(ret)); \ } /* CIS access. * Use the pcmcia_* versions in PCMCIA drivers */ int pcmcia_parse_tuple(tuple_t *tuple, cisparse_t *parse); int pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function, tuple_t *tuple); #define pcmcia_get_first_tuple(p_dev, tuple) \ pccard_get_first_tuple(p_dev->socket, p_dev->func, tuple) int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function, tuple_t *tuple); #define pcmcia_get_next_tuple(p_dev, tuple) \ pccard_get_next_tuple(p_dev->socket, p_dev->func, tuple) int pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple); #define pcmcia_get_tuple_data(p_dev, tuple) \ pccard_get_tuple_data(p_dev->socket, tuple) /* loop CIS entries for valid configuration */ int pcmcia_loop_config(struct pcmcia_device *p_dev, int (*conf_check) (struct pcmcia_device *p_dev, cistpl_cftable_entry_t *cf, cistpl_cftable_entry_t *dflt, unsigned int vcc, void *priv_data), void *priv_data); /* is the device still there? */ struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *p_dev); /* low-level interface reset */ int pcmcia_reset_card(struct pcmcia_socket *skt); /* CIS config */ int pcmcia_access_configuration_register(struct pcmcia_device *p_dev, conf_reg_t *reg); /* device configuration */ int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req); int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req); int pcmcia_request_configuration(struct pcmcia_device *p_dev, config_req_t *req); int pcmcia_request_window(struct pcmcia_device **p_dev, win_req_t *req, window_handle_t *wh); int pcmcia_release_window(window_handle_t win); int pcmcia_get_mem_page(window_handle_t win, memreq_t *req); int pcmcia_map_mem_page(window_handle_t win, memreq_t *req); int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod); void pcmcia_disable_device(struct pcmcia_device *p_dev); #endif /* __KERNEL__ */ /* Below, there are only definitions which are used by * - the PCMCIA ioctl * - deprecated PCMCIA userspace tools only * * here be dragons ... here be dragons ... here be dragons ... here be drag */ #if defined(CONFIG_PCMCIA_IOCTL) || !defined(__KERNEL__) #if defined(__arm__) || defined(__mips__) || defined(__avr32__) || \ defined(__bfin__) /* This (ioaddr_t) is exposed to userspace & hence cannot be changed. */ typedef u_int ioaddr_t; #else typedef u_short ioaddr_t; #endif /* for AdjustResourceInfo */ typedef struct adjust_t { u_int Action; u_int Resource; u_int Attributes; union { struct memory { u_long Base; u_long Size; } memory; struct io { ioaddr_t BasePort; ioaddr_t NumPorts; u_int IOAddrLines; } io; struct irq { u_int IRQ; } irq; } resource; } adjust_t; /* Action field */ #define REMOVE_MANAGED_RESOURCE 1 #define ADD_MANAGED_RESOURCE 2 #define GET_FIRST_MANAGED_RESOURCE 3 #define GET_NEXT_MANAGED_RESOURCE 4 /* Resource field */ #define RES_MEMORY_RANGE 1 #define RES_IO_RANGE 2 #define RES_IRQ 3 /* Attribute field */ #define RES_IRQ_TYPE 0x03 #define RES_IRQ_TYPE_EXCLUSIVE 0 #define RES_IRQ_TYPE_TIME 1 #define RES_IRQ_TYPE_DYNAMIC 2 #define RES_IRQ_CSC 0x04 #define RES_SHARED 0x08 #define RES_RESERVED 0x10 #define RES_ALLOCATED 0x20 #define RES_REMOVED 0x40 typedef struct tuple_parse_t { tuple_t tuple; cisdata_t data[255]; cisparse_t parse; } tuple_parse_t; typedef struct win_info_t { window_handle_t handle; win_req_t window; memreq_t map; } win_info_t; typedef struct bind_info_t { dev_info_t dev_info; u_char function; struct pcmcia_device *instance; char name[DEV_NAME_LEN]; u_short major, minor; void *next; } bind_info_t; typedef struct mtd_info_t { dev_info_t dev_info; u_int Attributes; u_int CardOffset; } mtd_info_t; typedef struct region_info_t { u_int Attributes; u_int CardOffset; u_int RegionSize; u_int AccessSpeed; u_int BlockSize; u_int PartMultiple; u_char JedecMfr, JedecInfo; memory_handle_t next; } region_info_t; #define REGION_TYPE 0x0001 #define REGION_TYPE_CM 0x0000 #define REGION_TYPE_AM 0x0001 #define REGION_PREFETCH 0x0008 #define REGION_CACHEABLE 0x0010 #define REGION_BAR_MASK 0xe000 #define REGION_BAR_SHIFT 13 /* For ReplaceCIS */ typedef struct cisdump_t { u_int Length; cisdata_t Data[CISTPL_MAX_CIS_SIZE]; } cisdump_t; /* for GetConfigurationInfo */ typedef struct config_info_t { u_char Function; u_int Attributes; u_int Vcc, Vpp1, Vpp2; u_int IntType; u_int ConfigBase; u_char Status, Pin, Copy, Option, ExtStatus; u_int Present; u_int CardValues; u_int AssignedIRQ; u_int IRQAttributes; ioaddr_t BasePort1; ioaddr_t NumPorts1; u_int Attributes1; ioaddr_t BasePort2; ioaddr_t NumPorts2; u_int Attributes2; u_int IOAddrLines; } config_info_t; /* For ValidateCIS */ typedef struct cisinfo_t { u_int Chains; } cisinfo_t; typedef struct cs_status_t { u_char Function; event_t CardState; event_t SocketState; } cs_status_t; typedef union ds_ioctl_arg_t { adjust_t adjust; config_info_t config; tuple_t tuple; tuple_parse_t tuple_parse; client_req_t client_req; cs_status_t status; conf_reg_t conf_reg; cisinfo_t cisinfo; region_info_t region; bind_info_t bind_info; mtd_info_t mtd_info; win_info_t win_info; cisdump_t cisdump; } ds_ioctl_arg_t; #define DS_ADJUST_RESOURCE_INFO _IOWR('d', 2, adjust_t) #define DS_GET_CONFIGURATION_INFO _IOWR('d', 3, config_info_t) #define DS_GET_FIRST_TUPLE _IOWR('d', 4, tuple_t) #define DS_GET_NEXT_TUPLE _IOWR('d', 5, tuple_t) #define DS_GET_TUPLE_DATA _IOWR('d', 6, tuple_parse_t) #define DS_PARSE_TUPLE _IOWR('d', 7, tuple_parse_t) #define DS_RESET_CARD _IO ('d', 8) #define DS_GET_STATUS _IOWR('d', 9, cs_status_t) #define DS_ACCESS_CONFIGURATION_REGISTER _IOWR('d', 10, conf_reg_t) #define DS_VALIDATE_CIS _IOR ('d', 11, cisinfo_t) #define DS_SUSPEND_CARD _IO ('d', 12) #define DS_RESUME_CARD _IO ('d', 13) #define DS_EJECT_CARD _IO ('d', 14) #define DS_INSERT_CARD _IO ('d', 15) #define DS_GET_FIRST_REGION _IOWR('d', 16, region_info_t) #define DS_GET_NEXT_REGION _IOWR('d', 17, region_info_t) #define DS_REPLACE_CIS _IOWR('d', 18, cisdump_t) #define DS_GET_FIRST_WINDOW _IOR ('d', 19, win_info_t) #define DS_GET_NEXT_WINDOW _IOWR('d', 20, win_info_t) #define DS_GET_MEM_PAGE _IOWR('d', 21, win_info_t) #define DS_BIND_REQUEST _IOWR('d', 60, bind_info_t) #define DS_GET_DEVICE_INFO _IOWR('d', 61, bind_info_t) #define DS_GET_NEXT_DEVICE _IOWR('d', 62, bind_info_t) #define DS_UNBIND_REQUEST _IOW ('d', 63, bind_info_t) #define DS_BIND_MTD _IOWR('d', 64, mtd_info_t) /* used in userspace only */ #define CS_IN_USE 0x1e #define INFO_MASTER_CLIENT 0x01 #define INFO_IO_CLIENT 0x02 #define INFO_MTD_CLIENT 0x04 #define INFO_MEM_CLIENT 0x08 #define MAX_NUM_CLIENTS 3 #define INFO_CARD_SHARE 0x10 #define INFO_CARD_EXCL 0x20 #endif /* !defined(__KERNEL__) || defined(CONFIG_PCMCIA_IOCTL) */ #endif /* _LINUX_DS_H */