162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * cs_internal.h -- definitions internal to the PCMCIA core modules 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * The initial developer of the original code is David A. Hinds 662306a36Sopenharmony_ci * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds 762306a36Sopenharmony_ci * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * (C) 1999 David A. Hinds 1062306a36Sopenharmony_ci * (C) 2003 - 2010 Dominik Brodowski 1162306a36Sopenharmony_ci * 1262306a36Sopenharmony_ci * This file contains definitions _only_ needed by the PCMCIA core modules. 1362306a36Sopenharmony_ci * It must not be included by PCMCIA socket drivers or by PCMCIA device 1462306a36Sopenharmony_ci * drivers. 1562306a36Sopenharmony_ci */ 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#ifndef _LINUX_CS_INTERNAL_H 1862306a36Sopenharmony_ci#define _LINUX_CS_INTERNAL_H 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#include <linux/kref.h> 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* Flags in client state */ 2362306a36Sopenharmony_ci#define CLIENT_WIN_REQ(i) (0x1<<(i)) 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci/* Flag to access all functions */ 2662306a36Sopenharmony_ci#define BIND_FN_ALL 0xff 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/* Each card function gets one of these guys */ 2962306a36Sopenharmony_citypedef struct config_t { 3062306a36Sopenharmony_ci struct kref ref; 3162306a36Sopenharmony_ci unsigned int state; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci struct resource io[MAX_IO_WIN]; /* io ports */ 3462306a36Sopenharmony_ci struct resource mem[MAX_WIN]; /* mem areas */ 3562306a36Sopenharmony_ci} config_t; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistruct cis_cache_entry { 3962306a36Sopenharmony_ci struct list_head node; 4062306a36Sopenharmony_ci unsigned int addr; 4162306a36Sopenharmony_ci unsigned int len; 4262306a36Sopenharmony_ci unsigned int attr; 4362306a36Sopenharmony_ci unsigned char cache[]; 4462306a36Sopenharmony_ci}; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistruct pccard_resource_ops { 4762306a36Sopenharmony_ci int (*validate_mem) (struct pcmcia_socket *s); 4862306a36Sopenharmony_ci int (*find_io) (struct pcmcia_socket *s, 4962306a36Sopenharmony_ci unsigned int attr, 5062306a36Sopenharmony_ci unsigned int *base, 5162306a36Sopenharmony_ci unsigned int num, 5262306a36Sopenharmony_ci unsigned int align, 5362306a36Sopenharmony_ci struct resource **parent); 5462306a36Sopenharmony_ci struct resource* (*find_mem) (unsigned long base, unsigned long num, 5562306a36Sopenharmony_ci unsigned long align, int low, 5662306a36Sopenharmony_ci struct pcmcia_socket *s); 5762306a36Sopenharmony_ci int (*init) (struct pcmcia_socket *s); 5862306a36Sopenharmony_ci void (*exit) (struct pcmcia_socket *s); 5962306a36Sopenharmony_ci}; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci/* Flags in config state */ 6262306a36Sopenharmony_ci#define CONFIG_LOCKED 0x01 6362306a36Sopenharmony_ci#define CONFIG_IRQ_REQ 0x02 6462306a36Sopenharmony_ci#define CONFIG_IO_REQ 0x04 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci/* Flags in socket state */ 6762306a36Sopenharmony_ci#define SOCKET_PRESENT 0x0008 6862306a36Sopenharmony_ci#define SOCKET_INUSE 0x0010 6962306a36Sopenharmony_ci#define SOCKET_IN_RESUME 0x0040 7062306a36Sopenharmony_ci#define SOCKET_SUSPEND 0x0080 7162306a36Sopenharmony_ci#define SOCKET_WIN_REQ(i) (0x0100<<(i)) 7262306a36Sopenharmony_ci#define SOCKET_CARDBUS 0x8000 7362306a36Sopenharmony_ci#define SOCKET_CARDBUS_CONFIG 0x10000 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci/* 7762306a36Sopenharmony_ci * Stuff internal to module "pcmcia_rsrc": 7862306a36Sopenharmony_ci */ 7962306a36Sopenharmony_ciextern int static_init(struct pcmcia_socket *s); 8062306a36Sopenharmony_ciextern struct resource *pcmcia_make_resource(resource_size_t start, 8162306a36Sopenharmony_ci resource_size_t end, 8262306a36Sopenharmony_ci unsigned long flags, const char *name); 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci/* 8562306a36Sopenharmony_ci * Stuff internal to module "pcmcia_core": 8662306a36Sopenharmony_ci */ 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci/* socket_sysfs.c */ 8962306a36Sopenharmony_ciextern int pccard_sysfs_add_socket(struct device *dev); 9062306a36Sopenharmony_ciextern void pccard_sysfs_remove_socket(struct device *dev); 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci/* cardbus.c */ 9362306a36Sopenharmony_ciint cb_alloc(struct pcmcia_socket *s); 9462306a36Sopenharmony_civoid cb_free(struct pcmcia_socket *s); 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci/* 9962306a36Sopenharmony_ci * Stuff exported by module "pcmcia_core" to module "pcmcia" 10062306a36Sopenharmony_ci */ 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_cistruct pcmcia_callback{ 10362306a36Sopenharmony_ci struct module *owner; 10462306a36Sopenharmony_ci int (*add) (struct pcmcia_socket *s); 10562306a36Sopenharmony_ci int (*remove) (struct pcmcia_socket *s); 10662306a36Sopenharmony_ci void (*requery) (struct pcmcia_socket *s); 10762306a36Sopenharmony_ci int (*validate) (struct pcmcia_socket *s, unsigned int *i); 10862306a36Sopenharmony_ci int (*suspend) (struct pcmcia_socket *s); 10962306a36Sopenharmony_ci int (*early_resume) (struct pcmcia_socket *s); 11062306a36Sopenharmony_ci int (*resume) (struct pcmcia_socket *s); 11162306a36Sopenharmony_ci}; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci/* cs.c */ 11462306a36Sopenharmony_ciextern struct rw_semaphore pcmcia_socket_list_rwsem; 11562306a36Sopenharmony_ciextern struct list_head pcmcia_socket_list; 11662306a36Sopenharmony_ciextern struct class pcmcia_socket_class; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ciint pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c); 11962306a36Sopenharmony_cistruct pcmcia_socket *pcmcia_get_socket_by_nr(unsigned int nr); 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_civoid pcmcia_parse_uevents(struct pcmcia_socket *socket, unsigned int events); 12262306a36Sopenharmony_ci#define PCMCIA_UEVENT_EJECT 0x0001 12362306a36Sopenharmony_ci#define PCMCIA_UEVENT_INSERT 0x0002 12462306a36Sopenharmony_ci#define PCMCIA_UEVENT_SUSPEND 0x0004 12562306a36Sopenharmony_ci#define PCMCIA_UEVENT_RESUME 0x0008 12662306a36Sopenharmony_ci#define PCMCIA_UEVENT_REQUERY 0x0010 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_cistruct pcmcia_socket *pcmcia_get_socket(struct pcmcia_socket *skt); 12962306a36Sopenharmony_civoid pcmcia_put_socket(struct pcmcia_socket *skt); 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci/* 13262306a36Sopenharmony_ci * Stuff internal to module "pcmcia". 13362306a36Sopenharmony_ci */ 13462306a36Sopenharmony_ci/* ds.c */ 13562306a36Sopenharmony_ciextern struct bus_type pcmcia_bus_type; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cistruct pcmcia_device; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci/* pcmcia_resource.c */ 14062306a36Sopenharmony_ciextern int pcmcia_release_configuration(struct pcmcia_device *p_dev); 14162306a36Sopenharmony_ciextern int pcmcia_validate_mem(struct pcmcia_socket *s); 14262306a36Sopenharmony_ciextern struct resource *pcmcia_find_mem_region(u_long base, 14362306a36Sopenharmony_ci u_long num, 14462306a36Sopenharmony_ci u_long align, 14562306a36Sopenharmony_ci int low, 14662306a36Sopenharmony_ci struct pcmcia_socket *s); 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_civoid pcmcia_cleanup_irq(struct pcmcia_socket *s); 14962306a36Sopenharmony_ciint pcmcia_setup_irq(struct pcmcia_device *p_dev); 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci/* cistpl.c */ 15262306a36Sopenharmony_ciextern const struct bin_attribute pccard_cis_attr; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ciint pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr, 15562306a36Sopenharmony_ci u_int addr, u_int len, void *ptr); 15662306a36Sopenharmony_ciint pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, 15762306a36Sopenharmony_ci u_int addr, u_int len, void *ptr); 15862306a36Sopenharmony_civoid release_cis_mem(struct pcmcia_socket *s); 15962306a36Sopenharmony_civoid destroy_cis_cache(struct pcmcia_socket *s); 16062306a36Sopenharmony_ciint pccard_read_tuple(struct pcmcia_socket *s, unsigned int function, 16162306a36Sopenharmony_ci cisdata_t code, void *parse); 16262306a36Sopenharmony_ciint pcmcia_replace_cis(struct pcmcia_socket *s, 16362306a36Sopenharmony_ci const u8 *data, const size_t len); 16462306a36Sopenharmony_ciint pccard_validate_cis(struct pcmcia_socket *s, unsigned int *count); 16562306a36Sopenharmony_ciint verify_cis_cache(struct pcmcia_socket *s); 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ciint pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function, 16862306a36Sopenharmony_ci tuple_t *tuple); 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ciint pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function, 17162306a36Sopenharmony_ci tuple_t *tuple); 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ciint pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple); 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci#endif /* _LINUX_CS_INTERNAL_H */ 176