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