xref: /openbmc/linux/include/pcmcia/ds.h (revision b627b4ed)
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/cs_types.h>
24 #include <pcmcia/device_id.h>
25 
26 #ifdef __KERNEL__
27 #include <linux/device.h>
28 #include <pcmcia/ss.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 
38 /* dynamic device IDs for PCMCIA device drivers. See
39  * Documentation/pcmcia/driver.txt for details.
40 */
41 struct pcmcia_dynids {
42 	spinlock_t		lock;
43 	struct list_head	list;
44 };
45 
46 struct pcmcia_driver {
47 	int (*probe)		(struct pcmcia_device *dev);
48 	void (*remove)		(struct pcmcia_device *dev);
49 
50 	int (*suspend)		(struct pcmcia_device *dev);
51 	int (*resume)		(struct pcmcia_device *dev);
52 
53 	struct module		*owner;
54 	struct pcmcia_device_id	*id_table;
55 	struct device_driver	drv;
56 	struct pcmcia_dynids	dynids;
57 };
58 
59 /* driver registration */
60 int pcmcia_register_driver(struct pcmcia_driver *driver);
61 void pcmcia_unregister_driver(struct pcmcia_driver *driver);
62 
63 /* Some drivers use dev_node_t to store char or block device information.
64  * Don't use this in new drivers, though.
65  */
66 typedef struct dev_node_t {
67 	char			dev_name[DEV_NAME_LEN];
68 	u_short			major, minor;
69 	struct dev_node_t	*next;
70 } dev_node_t;
71 
72 struct pcmcia_device {
73 	/* the socket and the device_no [for multifunction devices]
74 	   uniquely define a pcmcia_device */
75 	struct pcmcia_socket	*socket;
76 
77 	char			*devname;
78 
79 	u8			device_no;
80 
81 	/* the hardware "function" device; certain subdevices can
82 	 * share one hardware "function" device. */
83 	u8			func;
84 	struct config_t*	function_config;
85 
86 	struct list_head	socket_device_list;
87 
88 	/* deprecated, will be cleaned up soon */
89 	dev_node_t		*dev_node;
90 	u_int			open;
91 	io_req_t		io;
92 	irq_req_t		irq;
93 	config_req_t		conf;
94 	window_handle_t		win;
95 
96 	/* Is the device suspended, or in the process of
97 	 * being removed? */
98 	u16			suspended:1;
99 	u16			_removed:1;
100 
101 	/* Flags whether io, irq, win configurations were
102 	 * requested, and whether the configuration is "locked" */
103 	u16			_irq:1;
104 	u16			_io:1;
105 	u16			_win:4;
106 	u16			_locked:1;
107 
108 	/* Flag whether a "fuzzy" func_id based match is
109 	 * allowed. */
110 	u16			allow_func_id_match:1;
111 
112 	/* information about this device */
113 	u16			has_manf_id:1;
114 	u16			has_card_id:1;
115 	u16			has_func_id:1;
116 
117 	u16			reserved:3;
118 
119 	u8			func_id;
120 	u16			manf_id;
121 	u16			card_id;
122 
123 	char *			prod_id[4];
124 
125 	u64			dma_mask;
126 	struct device		dev;
127 
128 #ifdef CONFIG_PCMCIA_IOCTL
129 	/* device driver wanted by cardmgr */
130 	struct pcmcia_driver *	cardmgr;
131 #endif
132 
133 	/* data private to drivers */
134 	void			*priv;
135 };
136 
137 #define to_pcmcia_dev(n) container_of(n, struct pcmcia_device, dev)
138 #define to_pcmcia_drv(n) container_of(n, struct pcmcia_driver, drv)
139 
140 /* deprecated -- don't use! */
141 #define handle_to_dev(handle) (handle->dev)
142 
143 
144 /* (deprecated) error reporting by PCMCIA devices. Use dev_printk()
145  * or dev_dbg() directly in the driver, without referring to pcmcia_error_func()
146  * and/or pcmcia_error_ret() for those functions will go away soon.
147  */
148 enum service {
149     AccessConfigurationRegister, AddSocketServices,
150     AdjustResourceInfo, CheckEraseQueue, CloseMemory, CopyMemory,
151     DeregisterClient, DeregisterEraseQueue, GetCardServicesInfo,
152     GetClientInfo, GetConfigurationInfo, GetEventMask,
153     GetFirstClient, GetFirstPartion, GetFirstRegion, GetFirstTuple,
154     GetNextClient, GetNextPartition, GetNextRegion, GetNextTuple,
155     GetStatus, GetTupleData, MapLogSocket, MapLogWindow, MapMemPage,
156     MapPhySocket, MapPhyWindow, ModifyConfiguration, ModifyWindow,
157     OpenMemory, ParseTuple, ReadMemory, RegisterClient,
158     RegisterEraseQueue, RegisterMTD, RegisterTimer,
159     ReleaseConfiguration, ReleaseExclusive, ReleaseIO, ReleaseIRQ,
160     ReleaseSocketMask, ReleaseWindow, ReplaceSocketServices,
161     RequestConfiguration, RequestExclusive, RequestIO, RequestIRQ,
162     RequestSocketMask, RequestWindow, ResetCard, ReturnSSEntry,
163     SetEventMask, SetRegion, ValidateCIS, VendorSpecific,
164     WriteMemory, BindDevice, BindMTD, ReportError,
165     SuspendCard, ResumeCard, EjectCard, InsertCard, ReplaceCIS,
166     GetFirstWindow, GetNextWindow, GetMemPage
167 };
168 const char *pcmcia_error_func(int func);
169 const char *pcmcia_error_ret(int ret);
170 
171 #define cs_error(p_dev, func, ret)			\
172 	{						\
173 		dev_printk(KERN_NOTICE, &p_dev->dev,	\
174 			   "%s : %s\n",			\
175 			   pcmcia_error_func(func),	\
176 			   pcmcia_error_ret(ret));	\
177 	}
178 
179 /* CIS access.
180  * Use the pcmcia_* versions in PCMCIA drivers
181  */
182 int pcmcia_parse_tuple(tuple_t *tuple, cisparse_t *parse);
183 
184 int pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function,
185 			   tuple_t *tuple);
186 #define pcmcia_get_first_tuple(p_dev, tuple) \
187 		pccard_get_first_tuple(p_dev->socket, p_dev->func, tuple)
188 
189 int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function,
190 			  tuple_t *tuple);
191 #define pcmcia_get_next_tuple(p_dev, tuple) \
192 		pccard_get_next_tuple(p_dev->socket, p_dev->func, tuple)
193 
194 int pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple);
195 #define pcmcia_get_tuple_data(p_dev, tuple) \
196 		pccard_get_tuple_data(p_dev->socket, tuple)
197 
198 
199 /* loop CIS entries for valid configuration */
200 int pcmcia_loop_config(struct pcmcia_device *p_dev,
201 		       int	(*conf_check)	(struct pcmcia_device *p_dev,
202 						 cistpl_cftable_entry_t *cf,
203 						 cistpl_cftable_entry_t *dflt,
204 						 unsigned int vcc,
205 						 void *priv_data),
206 		       void *priv_data);
207 
208 /* is the device still there? */
209 struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *p_dev);
210 
211 /* low-level interface reset */
212 int pcmcia_reset_card(struct pcmcia_socket *skt);
213 
214 /* CIS config */
215 int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
216 					 conf_reg_t *reg);
217 
218 /* device configuration */
219 int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req);
220 int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req);
221 int pcmcia_request_configuration(struct pcmcia_device *p_dev,
222 				 config_req_t *req);
223 
224 int pcmcia_request_window(struct pcmcia_device **p_dev, win_req_t *req,
225 			  window_handle_t *wh);
226 int pcmcia_release_window(window_handle_t win);
227 
228 int pcmcia_get_mem_page(window_handle_t win, memreq_t *req);
229 int pcmcia_map_mem_page(window_handle_t win, memreq_t *req);
230 
231 int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod);
232 void pcmcia_disable_device(struct pcmcia_device *p_dev);
233 
234 #endif /* __KERNEL__ */
235 
236 
237 
238 /* Below, there are only definitions which are used by
239  * - the PCMCIA ioctl
240  * - deprecated PCMCIA userspace tools only
241  *
242  * here be dragons ... here be dragons ... here be dragons ... here be drag
243  */
244 
245 #if defined(CONFIG_PCMCIA_IOCTL) || !defined(__KERNEL__)
246 
247 #if defined(__arm__) || defined(__mips__) || defined(__avr32__) || \
248 	defined(__bfin__)
249 /* This (ioaddr_t) is exposed to userspace & hence cannot be changed. */
250 typedef u_int   ioaddr_t;
251 #else
252 typedef u_short	ioaddr_t;
253 #endif
254 
255 /* for AdjustResourceInfo */
256 typedef struct adjust_t {
257 	u_int			Action;
258 	u_int			Resource;
259 	u_int			Attributes;
260 	union {
261 		struct memory {
262 			u_long		Base;
263 			u_long		Size;
264 		} memory;
265 		struct io {
266 			ioaddr_t	BasePort;
267 			ioaddr_t	NumPorts;
268 			u_int		IOAddrLines;
269 		} io;
270 		struct irq {
271 			u_int		IRQ;
272 		} irq;
273 	} resource;
274 } adjust_t;
275 
276 /* Action field */
277 #define REMOVE_MANAGED_RESOURCE		1
278 #define ADD_MANAGED_RESOURCE		2
279 #define GET_FIRST_MANAGED_RESOURCE	3
280 #define GET_NEXT_MANAGED_RESOURCE	4
281 /* Resource field */
282 #define RES_MEMORY_RANGE		1
283 #define RES_IO_RANGE			2
284 #define RES_IRQ				3
285 /* Attribute field */
286 #define RES_IRQ_TYPE			0x03
287 #define RES_IRQ_TYPE_EXCLUSIVE		0
288 #define RES_IRQ_TYPE_TIME		1
289 #define RES_IRQ_TYPE_DYNAMIC		2
290 #define RES_IRQ_CSC			0x04
291 #define RES_SHARED			0x08
292 #define RES_RESERVED			0x10
293 #define RES_ALLOCATED			0x20
294 #define RES_REMOVED			0x40
295 
296 
297 typedef struct tuple_parse_t {
298 	tuple_t			tuple;
299 	cisdata_t		data[255];
300 	cisparse_t		parse;
301 } tuple_parse_t;
302 
303 typedef struct win_info_t {
304 	window_handle_t		handle;
305 	win_req_t		window;
306 	memreq_t		map;
307 } win_info_t;
308 
309 typedef struct bind_info_t {
310 	dev_info_t		dev_info;
311 	u_char			function;
312 	struct pcmcia_device	*instance;
313 	char			name[DEV_NAME_LEN];
314 	u_short			major, minor;
315 	void			*next;
316 } bind_info_t;
317 
318 typedef struct mtd_info_t {
319 	dev_info_t     		dev_info;
320 	u_int			Attributes;
321 	u_int			CardOffset;
322 } mtd_info_t;
323 
324 typedef struct region_info_t {
325 	u_int			Attributes;
326 	u_int			CardOffset;
327 	u_int			RegionSize;
328 	u_int			AccessSpeed;
329 	u_int			BlockSize;
330 	u_int			PartMultiple;
331 	u_char			JedecMfr, JedecInfo;
332 	memory_handle_t		next;
333 } region_info_t;
334 
335 #define REGION_TYPE		0x0001
336 #define REGION_TYPE_CM		0x0000
337 #define REGION_TYPE_AM		0x0001
338 #define REGION_PREFETCH		0x0008
339 #define REGION_CACHEABLE	0x0010
340 #define REGION_BAR_MASK		0xe000
341 #define REGION_BAR_SHIFT	13
342 
343 /* For ReplaceCIS */
344 typedef struct cisdump_t {
345 	u_int			Length;
346 	cisdata_t		Data[CISTPL_MAX_CIS_SIZE];
347 } cisdump_t;
348 
349 /* for GetConfigurationInfo */
350 typedef struct config_info_t {
351 	u_char			Function;
352 	u_int			Attributes;
353 	u_int			Vcc, Vpp1, Vpp2;
354 	u_int			IntType;
355 	u_int			ConfigBase;
356 	u_char			Status, Pin, Copy, Option, ExtStatus;
357 	u_int			Present;
358 	u_int			CardValues;
359 	u_int			AssignedIRQ;
360 	u_int			IRQAttributes;
361 	ioaddr_t		BasePort1;
362 	ioaddr_t		NumPorts1;
363 	u_int			Attributes1;
364 	ioaddr_t		BasePort2;
365 	ioaddr_t		NumPorts2;
366 	u_int			Attributes2;
367 	u_int			IOAddrLines;
368 } config_info_t;
369 
370 /* For ValidateCIS */
371 typedef struct cisinfo_t {
372 	u_int			Chains;
373 } cisinfo_t;
374 
375 typedef struct cs_status_t {
376 	u_char			Function;
377 	event_t 		CardState;
378 	event_t			SocketState;
379 } cs_status_t;
380 
381 typedef union ds_ioctl_arg_t {
382 	adjust_t		adjust;
383 	config_info_t		config;
384 	tuple_t			tuple;
385 	tuple_parse_t		tuple_parse;
386 	client_req_t		client_req;
387 	cs_status_t		status;
388 	conf_reg_t		conf_reg;
389 	cisinfo_t		cisinfo;
390 	region_info_t		region;
391 	bind_info_t		bind_info;
392 	mtd_info_t		mtd_info;
393 	win_info_t		win_info;
394 	cisdump_t		cisdump;
395 } ds_ioctl_arg_t;
396 
397 #define DS_ADJUST_RESOURCE_INFO			_IOWR('d',  2, adjust_t)
398 #define DS_GET_CONFIGURATION_INFO		_IOWR('d',  3, config_info_t)
399 #define DS_GET_FIRST_TUPLE			_IOWR('d',  4, tuple_t)
400 #define DS_GET_NEXT_TUPLE			_IOWR('d',  5, tuple_t)
401 #define DS_GET_TUPLE_DATA			_IOWR('d',  6, tuple_parse_t)
402 #define DS_PARSE_TUPLE				_IOWR('d',  7, tuple_parse_t)
403 #define DS_RESET_CARD				_IO  ('d',  8)
404 #define DS_GET_STATUS				_IOWR('d',  9, cs_status_t)
405 #define DS_ACCESS_CONFIGURATION_REGISTER	_IOWR('d', 10, conf_reg_t)
406 #define DS_VALIDATE_CIS				_IOR ('d', 11, cisinfo_t)
407 #define DS_SUSPEND_CARD				_IO  ('d', 12)
408 #define DS_RESUME_CARD				_IO  ('d', 13)
409 #define DS_EJECT_CARD				_IO  ('d', 14)
410 #define DS_INSERT_CARD				_IO  ('d', 15)
411 #define DS_GET_FIRST_REGION			_IOWR('d', 16, region_info_t)
412 #define DS_GET_NEXT_REGION			_IOWR('d', 17, region_info_t)
413 #define DS_REPLACE_CIS				_IOWR('d', 18, cisdump_t)
414 #define DS_GET_FIRST_WINDOW			_IOR ('d', 19, win_info_t)
415 #define DS_GET_NEXT_WINDOW			_IOWR('d', 20, win_info_t)
416 #define DS_GET_MEM_PAGE				_IOWR('d', 21, win_info_t)
417 
418 #define DS_BIND_REQUEST				_IOWR('d', 60, bind_info_t)
419 #define DS_GET_DEVICE_INFO			_IOWR('d', 61, bind_info_t)
420 #define DS_GET_NEXT_DEVICE			_IOWR('d', 62, bind_info_t)
421 #define DS_UNBIND_REQUEST			_IOW ('d', 63, bind_info_t)
422 #define DS_BIND_MTD				_IOWR('d', 64, mtd_info_t)
423 
424 
425 /* used in userspace only */
426 #define CS_IN_USE			0x1e
427 
428 #define INFO_MASTER_CLIENT	0x01
429 #define INFO_IO_CLIENT		0x02
430 #define INFO_MTD_CLIENT		0x04
431 #define INFO_MEM_CLIENT		0x08
432 #define MAX_NUM_CLIENTS		3
433 
434 #define INFO_CARD_SHARE		0x10
435 #define INFO_CARD_EXCL		0x20
436 
437 
438 #endif /* !defined(__KERNEL__) || defined(CONFIG_PCMCIA_IOCTL) */
439 
440 #endif /* _LINUX_DS_H */
441