1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * cs_internal.h -- definitions internal to the PCMCIA core modules 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * The initial developer of the original code is David A. Hinds 6*4882a593Smuzhiyun * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds 7*4882a593Smuzhiyun * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * (C) 1999 David A. Hinds 10*4882a593Smuzhiyun * (C) 2003 - 2010 Dominik Brodowski 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * This file contains definitions _only_ needed by the PCMCIA core modules. 13*4882a593Smuzhiyun * It must not be included by PCMCIA socket drivers or by PCMCIA device 14*4882a593Smuzhiyun * drivers. 15*4882a593Smuzhiyun */ 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #ifndef _LINUX_CS_INTERNAL_H 18*4882a593Smuzhiyun #define _LINUX_CS_INTERNAL_H 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #include <linux/kref.h> 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* Flags in client state */ 23*4882a593Smuzhiyun #define CLIENT_WIN_REQ(i) (0x1<<(i)) 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /* Flag to access all functions */ 26*4882a593Smuzhiyun #define BIND_FN_ALL 0xff 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun /* Each card function gets one of these guys */ 29*4882a593Smuzhiyun typedef struct config_t { 30*4882a593Smuzhiyun struct kref ref; 31*4882a593Smuzhiyun unsigned int state; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun struct resource io[MAX_IO_WIN]; /* io ports */ 34*4882a593Smuzhiyun struct resource mem[MAX_WIN]; /* mem areas */ 35*4882a593Smuzhiyun } config_t; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun struct cis_cache_entry { 39*4882a593Smuzhiyun struct list_head node; 40*4882a593Smuzhiyun unsigned int addr; 41*4882a593Smuzhiyun unsigned int len; 42*4882a593Smuzhiyun unsigned int attr; 43*4882a593Smuzhiyun unsigned char cache[]; 44*4882a593Smuzhiyun }; 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun struct pccard_resource_ops { 47*4882a593Smuzhiyun int (*validate_mem) (struct pcmcia_socket *s); 48*4882a593Smuzhiyun int (*find_io) (struct pcmcia_socket *s, 49*4882a593Smuzhiyun unsigned int attr, 50*4882a593Smuzhiyun unsigned int *base, 51*4882a593Smuzhiyun unsigned int num, 52*4882a593Smuzhiyun unsigned int align, 53*4882a593Smuzhiyun struct resource **parent); 54*4882a593Smuzhiyun struct resource* (*find_mem) (unsigned long base, unsigned long num, 55*4882a593Smuzhiyun unsigned long align, int low, 56*4882a593Smuzhiyun struct pcmcia_socket *s); 57*4882a593Smuzhiyun int (*init) (struct pcmcia_socket *s); 58*4882a593Smuzhiyun void (*exit) (struct pcmcia_socket *s); 59*4882a593Smuzhiyun }; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /* Flags in config state */ 62*4882a593Smuzhiyun #define CONFIG_LOCKED 0x01 63*4882a593Smuzhiyun #define CONFIG_IRQ_REQ 0x02 64*4882a593Smuzhiyun #define CONFIG_IO_REQ 0x04 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* Flags in socket state */ 67*4882a593Smuzhiyun #define SOCKET_PRESENT 0x0008 68*4882a593Smuzhiyun #define SOCKET_INUSE 0x0010 69*4882a593Smuzhiyun #define SOCKET_IN_RESUME 0x0040 70*4882a593Smuzhiyun #define SOCKET_SUSPEND 0x0080 71*4882a593Smuzhiyun #define SOCKET_WIN_REQ(i) (0x0100<<(i)) 72*4882a593Smuzhiyun #define SOCKET_CARDBUS 0x8000 73*4882a593Smuzhiyun #define SOCKET_CARDBUS_CONFIG 0x10000 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* 77*4882a593Smuzhiyun * Stuff internal to module "pcmcia_rsrc": 78*4882a593Smuzhiyun */ 79*4882a593Smuzhiyun extern int static_init(struct pcmcia_socket *s); 80*4882a593Smuzhiyun extern struct resource *pcmcia_make_resource(resource_size_t start, 81*4882a593Smuzhiyun resource_size_t end, 82*4882a593Smuzhiyun unsigned long flags, const char *name); 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun /* 85*4882a593Smuzhiyun * Stuff internal to module "pcmcia_core": 86*4882a593Smuzhiyun */ 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /* socket_sysfs.c */ 89*4882a593Smuzhiyun extern int pccard_sysfs_add_socket(struct device *dev); 90*4882a593Smuzhiyun extern void pccard_sysfs_remove_socket(struct device *dev); 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun /* cardbus.c */ 93*4882a593Smuzhiyun int cb_alloc(struct pcmcia_socket *s); 94*4882a593Smuzhiyun void cb_free(struct pcmcia_socket *s); 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun /* 99*4882a593Smuzhiyun * Stuff exported by module "pcmcia_core" to module "pcmcia" 100*4882a593Smuzhiyun */ 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun struct pcmcia_callback{ 103*4882a593Smuzhiyun struct module *owner; 104*4882a593Smuzhiyun int (*add) (struct pcmcia_socket *s); 105*4882a593Smuzhiyun int (*remove) (struct pcmcia_socket *s); 106*4882a593Smuzhiyun void (*requery) (struct pcmcia_socket *s); 107*4882a593Smuzhiyun int (*validate) (struct pcmcia_socket *s, unsigned int *i); 108*4882a593Smuzhiyun int (*suspend) (struct pcmcia_socket *s); 109*4882a593Smuzhiyun int (*early_resume) (struct pcmcia_socket *s); 110*4882a593Smuzhiyun int (*resume) (struct pcmcia_socket *s); 111*4882a593Smuzhiyun }; 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun /* cs.c */ 114*4882a593Smuzhiyun extern struct rw_semaphore pcmcia_socket_list_rwsem; 115*4882a593Smuzhiyun extern struct list_head pcmcia_socket_list; 116*4882a593Smuzhiyun extern struct class pcmcia_socket_class; 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun int pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c); 119*4882a593Smuzhiyun struct pcmcia_socket *pcmcia_get_socket_by_nr(unsigned int nr); 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun void pcmcia_parse_uevents(struct pcmcia_socket *socket, unsigned int events); 122*4882a593Smuzhiyun #define PCMCIA_UEVENT_EJECT 0x0001 123*4882a593Smuzhiyun #define PCMCIA_UEVENT_INSERT 0x0002 124*4882a593Smuzhiyun #define PCMCIA_UEVENT_SUSPEND 0x0004 125*4882a593Smuzhiyun #define PCMCIA_UEVENT_RESUME 0x0008 126*4882a593Smuzhiyun #define PCMCIA_UEVENT_REQUERY 0x0010 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun struct pcmcia_socket *pcmcia_get_socket(struct pcmcia_socket *skt); 129*4882a593Smuzhiyun void pcmcia_put_socket(struct pcmcia_socket *skt); 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /* 132*4882a593Smuzhiyun * Stuff internal to module "pcmcia". 133*4882a593Smuzhiyun */ 134*4882a593Smuzhiyun /* ds.c */ 135*4882a593Smuzhiyun extern struct bus_type pcmcia_bus_type; 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun struct pcmcia_device; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun /* pcmcia_resource.c */ 140*4882a593Smuzhiyun extern int pcmcia_release_configuration(struct pcmcia_device *p_dev); 141*4882a593Smuzhiyun extern int pcmcia_validate_mem(struct pcmcia_socket *s); 142*4882a593Smuzhiyun extern struct resource *pcmcia_find_mem_region(u_long base, 143*4882a593Smuzhiyun u_long num, 144*4882a593Smuzhiyun u_long align, 145*4882a593Smuzhiyun int low, 146*4882a593Smuzhiyun struct pcmcia_socket *s); 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun void pcmcia_cleanup_irq(struct pcmcia_socket *s); 149*4882a593Smuzhiyun int pcmcia_setup_irq(struct pcmcia_device *p_dev); 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun /* cistpl.c */ 152*4882a593Smuzhiyun extern const struct bin_attribute pccard_cis_attr; 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr, 155*4882a593Smuzhiyun u_int addr, u_int len, void *ptr); 156*4882a593Smuzhiyun int pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, 157*4882a593Smuzhiyun u_int addr, u_int len, void *ptr); 158*4882a593Smuzhiyun void release_cis_mem(struct pcmcia_socket *s); 159*4882a593Smuzhiyun void destroy_cis_cache(struct pcmcia_socket *s); 160*4882a593Smuzhiyun int pccard_read_tuple(struct pcmcia_socket *s, unsigned int function, 161*4882a593Smuzhiyun cisdata_t code, void *parse); 162*4882a593Smuzhiyun int pcmcia_replace_cis(struct pcmcia_socket *s, 163*4882a593Smuzhiyun const u8 *data, const size_t len); 164*4882a593Smuzhiyun int pccard_validate_cis(struct pcmcia_socket *s, unsigned int *count); 165*4882a593Smuzhiyun int verify_cis_cache(struct pcmcia_socket *s); 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun int pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function, 168*4882a593Smuzhiyun tuple_t *tuple); 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function, 171*4882a593Smuzhiyun tuple_t *tuple); 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun int pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple); 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun #endif /* _LINUX_CS_INTERNAL_H */ 176