xref: /linux/include/pcmcia/ds.h (revision cdb138080b78146d1cdadba9f5dadbeb97445b91)
1 /*
2  * ds.h -- 16-bit PCMCIA core support
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * The initial developer of the original code is David A. Hinds
9  * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
10  * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
11  *
12  * (C) 1999		David A. Hinds
13  * (C) 2003 - 2008	Dominik Brodowski
14  */
15 
16 #ifndef _LINUX_DS_H
17 #define _LINUX_DS_H
18 
19 #ifdef __KERNEL__
20 #include <linux/mod_devicetable.h>
21 #endif
22 
23 #include <pcmcia/device_id.h>
24 
25 #ifdef __KERNEL__
26 #include <linux/device.h>
27 #include <pcmcia/ss.h>
28 #include <asm/atomic.h>
29 
30 /*
31  * PCMCIA device drivers (16-bit cards only; 32-bit cards require CardBus
32  * a.k.a. PCI drivers
33  */
34 struct pcmcia_socket;
35 struct pcmcia_device;
36 struct config_t;
37 struct net_device;
38 
39 /* dynamic device IDs for PCMCIA device drivers. See
40  * Documentation/pcmcia/driver.txt for details.
41 */
42 struct pcmcia_dynids {
43 	struct mutex		lock;
44 	struct list_head	list;
45 };
46 
47 struct pcmcia_driver {
48 	int (*probe)		(struct pcmcia_device *dev);
49 	void (*remove)		(struct pcmcia_device *dev);
50 
51 	int (*suspend)		(struct pcmcia_device *dev);
52 	int (*resume)		(struct pcmcia_device *dev);
53 
54 	struct module		*owner;
55 	struct pcmcia_device_id	*id_table;
56 	struct device_driver	drv;
57 	struct pcmcia_dynids	dynids;
58 };
59 
60 /* driver registration */
61 int pcmcia_register_driver(struct pcmcia_driver *driver);
62 void pcmcia_unregister_driver(struct pcmcia_driver *driver);
63 
64 /* for struct resource * array embedded in struct pcmcia_device */
65 enum {
66 	PCMCIA_IOPORT_0,
67 	PCMCIA_IOPORT_1,
68 	PCMCIA_IOMEM_0,
69 	PCMCIA_IOMEM_1,
70 	PCMCIA_IOMEM_2,
71 	PCMCIA_IOMEM_3,
72 	PCMCIA_NUM_RESOURCES,
73 };
74 
75 struct pcmcia_device {
76 	/* the socket and the device_no [for multifunction devices]
77 	   uniquely define a pcmcia_device */
78 	struct pcmcia_socket	*socket;
79 
80 	char			*devname;
81 
82 	u8			device_no;
83 
84 	/* the hardware "function" device; certain subdevices can
85 	 * share one hardware "function" device. */
86 	u8			func;
87 	struct config_t		*function_config;
88 
89 	struct list_head	socket_device_list;
90 
91 	/* deprecated, will be cleaned up soon */
92 	config_req_t		conf;
93 
94 	/* device setup */
95 	unsigned int		irq;
96 	struct resource		*resource[PCMCIA_NUM_RESOURCES];
97 
98 	unsigned int		io_lines; /* number of I/O lines */
99 
100 	/* Is the device suspended? */
101 	u16			suspended:1;
102 
103 	/* Flags whether io, irq, win configurations were
104 	 * requested, and whether the configuration is "locked" */
105 	u16			_irq:1;
106 	u16			_io:1;
107 	u16			_win:4;
108 	u16			_locked:1;
109 
110 	/* Flag whether a "fuzzy" func_id based match is
111 	 * allowed. */
112 	u16			allow_func_id_match:1;
113 
114 	/* information about this device */
115 	u16			has_manf_id:1;
116 	u16			has_card_id:1;
117 	u16			has_func_id:1;
118 
119 	u16			reserved:4;
120 
121 	u8			func_id;
122 	u16			manf_id;
123 	u16			card_id;
124 
125 	char			*prod_id[4];
126 
127 	u64			dma_mask;
128 	struct device		dev;
129 
130 	/* data private to drivers */
131 	void			*priv;
132 	unsigned int		open;
133 };
134 
135 #define to_pcmcia_dev(n) container_of(n, struct pcmcia_device, dev)
136 #define to_pcmcia_drv(n) container_of(n, struct pcmcia_driver, drv)
137 
138 
139 /*
140  * CIS access.
141  *
142  * Please use the following functions to access CIS tuples:
143  * - pcmcia_get_tuple()
144  * - pcmcia_loop_tuple()
145  * - pcmcia_get_mac_from_cis()
146  *
147  * To parse a tuple_t, pcmcia_parse_tuple() exists. Its interface
148  * might change in future.
149  */
150 
151 /* get the very first CIS entry of type @code. Note that buf is pointer
152  * to u8 *buf; and that you need to kfree(buf) afterwards. */
153 size_t pcmcia_get_tuple(struct pcmcia_device *p_dev, cisdata_t code,
154 			u8 **buf);
155 
156 /* loop over CIS entries */
157 int pcmcia_loop_tuple(struct pcmcia_device *p_dev, cisdata_t code,
158 		      int (*loop_tuple) (struct pcmcia_device *p_dev,
159 					 tuple_t *tuple,
160 					 void *priv_data),
161 		      void *priv_data);
162 
163 /* get the MAC address from CISTPL_FUNCE */
164 int pcmcia_get_mac_from_cis(struct pcmcia_device *p_dev,
165 			    struct net_device *dev);
166 
167 
168 /* parse a tuple_t */
169 int pcmcia_parse_tuple(tuple_t *tuple, cisparse_t *parse);
170 
171 /* loop CIS entries for valid configuration */
172 int pcmcia_loop_config(struct pcmcia_device *p_dev,
173 		       int	(*conf_check)	(struct pcmcia_device *p_dev,
174 						 cistpl_cftable_entry_t *cf,
175 						 cistpl_cftable_entry_t *dflt,
176 						 unsigned int vcc,
177 						 void *priv_data),
178 		       void *priv_data);
179 
180 /* is the device still there? */
181 struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *p_dev);
182 
183 /* low-level interface reset */
184 int pcmcia_reset_card(struct pcmcia_socket *skt);
185 
186 /* CIS config */
187 int pcmcia_read_config_byte(struct pcmcia_device *p_dev, off_t where, u8 *val);
188 int pcmcia_write_config_byte(struct pcmcia_device *p_dev, off_t where, u8 val);
189 
190 /* device configuration */
191 int pcmcia_request_io(struct pcmcia_device *p_dev);
192 
193 int __must_check
194 __pcmcia_request_exclusive_irq(struct pcmcia_device *p_dev,
195 				irq_handler_t handler);
196 static inline __must_check __deprecated int
197 pcmcia_request_exclusive_irq(struct pcmcia_device *p_dev,
198 				irq_handler_t handler)
199 {
200 	return __pcmcia_request_exclusive_irq(p_dev, handler);
201 }
202 
203 int __must_check pcmcia_request_irq(struct pcmcia_device *p_dev,
204 				irq_handler_t handler);
205 
206 int pcmcia_request_configuration(struct pcmcia_device *p_dev,
207 				 config_req_t *req);
208 
209 int pcmcia_request_window(struct pcmcia_device *p_dev, struct resource *res,
210 			unsigned int speed);
211 int pcmcia_release_window(struct pcmcia_device *p_dev, struct resource *res);
212 int pcmcia_map_mem_page(struct pcmcia_device *p_dev, struct resource *res,
213 			unsigned int offset);
214 
215 int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod);
216 void pcmcia_disable_device(struct pcmcia_device *p_dev);
217 
218 /* IO ports */
219 #define IO_DATA_PATH_WIDTH	0x18
220 #define IO_DATA_PATH_WIDTH_8	0x00
221 #define IO_DATA_PATH_WIDTH_16	0x08
222 #define IO_DATA_PATH_WIDTH_AUTO	0x10
223 
224 /* convert flag found in cfgtable to data path width parameter */
225 static inline int pcmcia_io_cfg_data_width(unsigned int flags)
226 {
227 	if (!(flags & CISTPL_IO_8BIT))
228 		return IO_DATA_PATH_WIDTH_16;
229 	if (!(flags & CISTPL_IO_16BIT))
230 		return IO_DATA_PATH_WIDTH_8;
231 	return IO_DATA_PATH_WIDTH_AUTO;
232 }
233 
234 /* IO memory */
235 #define WIN_MEMORY_TYPE_CM	0x00 /* default */
236 #define WIN_MEMORY_TYPE_AM	0x20 /* MAP_ATTRIB */
237 #define WIN_DATA_WIDTH_8	0x00 /* default */
238 #define WIN_DATA_WIDTH_16	0x02 /* MAP_16BIT */
239 #define WIN_ENABLE		0x01 /* MAP_ACTIVE */
240 #define WIN_USE_WAIT		0x40 /* MAP_USE_WAIT */
241 
242 #define WIN_FLAGS_MAP		0x63 /* MAP_ATTRIB | MAP_16BIT | MAP_ACTIVE |
243 					MAP_USE_WAIT */
244 #define WIN_FLAGS_REQ		0x1c /* mapping to socket->win[i]:
245 					0x04 -> 0
246 					0x08 -> 1
247 					0x0c -> 2
248 					0x10 -> 3 */
249 
250 
251 #endif /* __KERNEL__ */
252 
253 #endif /* _LINUX_DS_H */
254