xref: /OK3568_Linux_fs/kernel/drivers/pcmcia/cs_internal.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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