18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * cs_internal.h -- definitions internal to the PCMCIA core modules 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * The initial developer of the original code is David A. Hinds 68c2ecf20Sopenharmony_ci * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds 78c2ecf20Sopenharmony_ci * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * (C) 1999 David A. Hinds 108c2ecf20Sopenharmony_ci * (C) 2003 - 2010 Dominik Brodowski 118c2ecf20Sopenharmony_ci * 128c2ecf20Sopenharmony_ci * This file contains definitions _only_ needed by the PCMCIA core modules. 138c2ecf20Sopenharmony_ci * It must not be included by PCMCIA socket drivers or by PCMCIA device 148c2ecf20Sopenharmony_ci * drivers. 158c2ecf20Sopenharmony_ci */ 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#ifndef _LINUX_CS_INTERNAL_H 188c2ecf20Sopenharmony_ci#define _LINUX_CS_INTERNAL_H 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#include <linux/kref.h> 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci/* Flags in client state */ 238c2ecf20Sopenharmony_ci#define CLIENT_WIN_REQ(i) (0x1<<(i)) 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci/* Flag to access all functions */ 268c2ecf20Sopenharmony_ci#define BIND_FN_ALL 0xff 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci/* Each card function gets one of these guys */ 298c2ecf20Sopenharmony_citypedef struct config_t { 308c2ecf20Sopenharmony_ci struct kref ref; 318c2ecf20Sopenharmony_ci unsigned int state; 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci struct resource io[MAX_IO_WIN]; /* io ports */ 348c2ecf20Sopenharmony_ci struct resource mem[MAX_WIN]; /* mem areas */ 358c2ecf20Sopenharmony_ci} config_t; 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_cistruct cis_cache_entry { 398c2ecf20Sopenharmony_ci struct list_head node; 408c2ecf20Sopenharmony_ci unsigned int addr; 418c2ecf20Sopenharmony_ci unsigned int len; 428c2ecf20Sopenharmony_ci unsigned int attr; 438c2ecf20Sopenharmony_ci unsigned char cache[]; 448c2ecf20Sopenharmony_ci}; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_cistruct pccard_resource_ops { 478c2ecf20Sopenharmony_ci int (*validate_mem) (struct pcmcia_socket *s); 488c2ecf20Sopenharmony_ci int (*find_io) (struct pcmcia_socket *s, 498c2ecf20Sopenharmony_ci unsigned int attr, 508c2ecf20Sopenharmony_ci unsigned int *base, 518c2ecf20Sopenharmony_ci unsigned int num, 528c2ecf20Sopenharmony_ci unsigned int align, 538c2ecf20Sopenharmony_ci struct resource **parent); 548c2ecf20Sopenharmony_ci struct resource* (*find_mem) (unsigned long base, unsigned long num, 558c2ecf20Sopenharmony_ci unsigned long align, int low, 568c2ecf20Sopenharmony_ci struct pcmcia_socket *s); 578c2ecf20Sopenharmony_ci int (*init) (struct pcmcia_socket *s); 588c2ecf20Sopenharmony_ci void (*exit) (struct pcmcia_socket *s); 598c2ecf20Sopenharmony_ci}; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci/* Flags in config state */ 628c2ecf20Sopenharmony_ci#define CONFIG_LOCKED 0x01 638c2ecf20Sopenharmony_ci#define CONFIG_IRQ_REQ 0x02 648c2ecf20Sopenharmony_ci#define CONFIG_IO_REQ 0x04 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci/* Flags in socket state */ 678c2ecf20Sopenharmony_ci#define SOCKET_PRESENT 0x0008 688c2ecf20Sopenharmony_ci#define SOCKET_INUSE 0x0010 698c2ecf20Sopenharmony_ci#define SOCKET_IN_RESUME 0x0040 708c2ecf20Sopenharmony_ci#define SOCKET_SUSPEND 0x0080 718c2ecf20Sopenharmony_ci#define SOCKET_WIN_REQ(i) (0x0100<<(i)) 728c2ecf20Sopenharmony_ci#define SOCKET_CARDBUS 0x8000 738c2ecf20Sopenharmony_ci#define SOCKET_CARDBUS_CONFIG 0x10000 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci/* 778c2ecf20Sopenharmony_ci * Stuff internal to module "pcmcia_rsrc": 788c2ecf20Sopenharmony_ci */ 798c2ecf20Sopenharmony_ciextern int static_init(struct pcmcia_socket *s); 808c2ecf20Sopenharmony_ciextern struct resource *pcmcia_make_resource(resource_size_t start, 818c2ecf20Sopenharmony_ci resource_size_t end, 828c2ecf20Sopenharmony_ci unsigned long flags, const char *name); 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci/* 858c2ecf20Sopenharmony_ci * Stuff internal to module "pcmcia_core": 868c2ecf20Sopenharmony_ci */ 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci/* socket_sysfs.c */ 898c2ecf20Sopenharmony_ciextern int pccard_sysfs_add_socket(struct device *dev); 908c2ecf20Sopenharmony_ciextern void pccard_sysfs_remove_socket(struct device *dev); 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci/* cardbus.c */ 938c2ecf20Sopenharmony_ciint cb_alloc(struct pcmcia_socket *s); 948c2ecf20Sopenharmony_civoid cb_free(struct pcmcia_socket *s); 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci/* 998c2ecf20Sopenharmony_ci * Stuff exported by module "pcmcia_core" to module "pcmcia" 1008c2ecf20Sopenharmony_ci */ 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_cistruct pcmcia_callback{ 1038c2ecf20Sopenharmony_ci struct module *owner; 1048c2ecf20Sopenharmony_ci int (*add) (struct pcmcia_socket *s); 1058c2ecf20Sopenharmony_ci int (*remove) (struct pcmcia_socket *s); 1068c2ecf20Sopenharmony_ci void (*requery) (struct pcmcia_socket *s); 1078c2ecf20Sopenharmony_ci int (*validate) (struct pcmcia_socket *s, unsigned int *i); 1088c2ecf20Sopenharmony_ci int (*suspend) (struct pcmcia_socket *s); 1098c2ecf20Sopenharmony_ci int (*early_resume) (struct pcmcia_socket *s); 1108c2ecf20Sopenharmony_ci int (*resume) (struct pcmcia_socket *s); 1118c2ecf20Sopenharmony_ci}; 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci/* cs.c */ 1148c2ecf20Sopenharmony_ciextern struct rw_semaphore pcmcia_socket_list_rwsem; 1158c2ecf20Sopenharmony_ciextern struct list_head pcmcia_socket_list; 1168c2ecf20Sopenharmony_ciextern struct class pcmcia_socket_class; 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ciint pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c); 1198c2ecf20Sopenharmony_cistruct pcmcia_socket *pcmcia_get_socket_by_nr(unsigned int nr); 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_civoid pcmcia_parse_uevents(struct pcmcia_socket *socket, unsigned int events); 1228c2ecf20Sopenharmony_ci#define PCMCIA_UEVENT_EJECT 0x0001 1238c2ecf20Sopenharmony_ci#define PCMCIA_UEVENT_INSERT 0x0002 1248c2ecf20Sopenharmony_ci#define PCMCIA_UEVENT_SUSPEND 0x0004 1258c2ecf20Sopenharmony_ci#define PCMCIA_UEVENT_RESUME 0x0008 1268c2ecf20Sopenharmony_ci#define PCMCIA_UEVENT_REQUERY 0x0010 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_cistruct pcmcia_socket *pcmcia_get_socket(struct pcmcia_socket *skt); 1298c2ecf20Sopenharmony_civoid pcmcia_put_socket(struct pcmcia_socket *skt); 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_ci/* 1328c2ecf20Sopenharmony_ci * Stuff internal to module "pcmcia". 1338c2ecf20Sopenharmony_ci */ 1348c2ecf20Sopenharmony_ci/* ds.c */ 1358c2ecf20Sopenharmony_ciextern struct bus_type pcmcia_bus_type; 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_cistruct pcmcia_device; 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ci/* pcmcia_resource.c */ 1408c2ecf20Sopenharmony_ciextern int pcmcia_release_configuration(struct pcmcia_device *p_dev); 1418c2ecf20Sopenharmony_ciextern int pcmcia_validate_mem(struct pcmcia_socket *s); 1428c2ecf20Sopenharmony_ciextern struct resource *pcmcia_find_mem_region(u_long base, 1438c2ecf20Sopenharmony_ci u_long num, 1448c2ecf20Sopenharmony_ci u_long align, 1458c2ecf20Sopenharmony_ci int low, 1468c2ecf20Sopenharmony_ci struct pcmcia_socket *s); 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_civoid pcmcia_cleanup_irq(struct pcmcia_socket *s); 1498c2ecf20Sopenharmony_ciint pcmcia_setup_irq(struct pcmcia_device *p_dev); 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ci/* cistpl.c */ 1528c2ecf20Sopenharmony_ciextern const struct bin_attribute pccard_cis_attr; 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_ciint pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr, 1558c2ecf20Sopenharmony_ci u_int addr, u_int len, void *ptr); 1568c2ecf20Sopenharmony_ciint pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, 1578c2ecf20Sopenharmony_ci u_int addr, u_int len, void *ptr); 1588c2ecf20Sopenharmony_civoid release_cis_mem(struct pcmcia_socket *s); 1598c2ecf20Sopenharmony_civoid destroy_cis_cache(struct pcmcia_socket *s); 1608c2ecf20Sopenharmony_ciint pccard_read_tuple(struct pcmcia_socket *s, unsigned int function, 1618c2ecf20Sopenharmony_ci cisdata_t code, void *parse); 1628c2ecf20Sopenharmony_ciint pcmcia_replace_cis(struct pcmcia_socket *s, 1638c2ecf20Sopenharmony_ci const u8 *data, const size_t len); 1648c2ecf20Sopenharmony_ciint pccard_validate_cis(struct pcmcia_socket *s, unsigned int *count); 1658c2ecf20Sopenharmony_ciint verify_cis_cache(struct pcmcia_socket *s); 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_ciint pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function, 1688c2ecf20Sopenharmony_ci tuple_t *tuple); 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ciint pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function, 1718c2ecf20Sopenharmony_ci tuple_t *tuple); 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_ciint pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple); 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_ci#endif /* _LINUX_CS_INTERNAL_H */ 176