Most non cardbus devices can't do dma, so flag them as such in the device creation routine. Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com> Cc: Andi Kleen <andi@firstfloor.org> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Cc: Tejun Heo <htejun@gmail.com> Cc: Natalie Protasevich <protasnb@gmail.com> Cc: Jeff Garzik <jgarzik@pobox.com> Cc: Dominik Brodowski <linux@dominikbrodowski.net> Cc: Russell King <rmk@arm.linux.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			208 lines
		
	
	
	
		
			5.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			208 lines
		
	
	
	
		
			5.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * ds.h -- 16-bit PCMCIA core support
 | 
						|
 *
 | 
						|
 * This program is free software; you can redistribute it and/or modify
 | 
						|
 * it under the terms of the GNU General Public License version 2 as
 | 
						|
 * published by the Free Software Foundation.
 | 
						|
 *
 | 
						|
 * The initial developer of the original code is David A. Hinds
 | 
						|
 * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
 | 
						|
 * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
 | 
						|
 *
 | 
						|
 * (C) 1999		David A. Hinds
 | 
						|
 * (C) 2003 - 2004	Dominik Brodowski
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef _LINUX_DS_H
 | 
						|
#define _LINUX_DS_H
 | 
						|
 | 
						|
#ifdef __KERNEL__
 | 
						|
#include <linux/mod_devicetable.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#include <pcmcia/bulkmem.h>
 | 
						|
#include <pcmcia/cs_types.h>
 | 
						|
#include <pcmcia/device_id.h>
 | 
						|
 | 
						|
typedef struct tuple_parse_t {
 | 
						|
    tuple_t		tuple;
 | 
						|
    cisdata_t		data[255];
 | 
						|
    cisparse_t		parse;
 | 
						|
} tuple_parse_t;
 | 
						|
 | 
						|
typedef struct win_info_t {
 | 
						|
    window_handle_t	handle;
 | 
						|
    win_req_t		window;
 | 
						|
    memreq_t		map;
 | 
						|
} win_info_t;
 | 
						|
    
 | 
						|
typedef struct bind_info_t {
 | 
						|
    dev_info_t		dev_info;
 | 
						|
    u_char		function;
 | 
						|
    struct pcmcia_device *instance;
 | 
						|
    char		name[DEV_NAME_LEN];
 | 
						|
    u_short		major, minor;
 | 
						|
    void		*next;
 | 
						|
} bind_info_t;
 | 
						|
 | 
						|
typedef struct mtd_info_t {
 | 
						|
    dev_info_t		dev_info;
 | 
						|
    u_int		Attributes;
 | 
						|
    u_int		CardOffset;
 | 
						|
} mtd_info_t;
 | 
						|
 | 
						|
typedef union ds_ioctl_arg_t {
 | 
						|
    adjust_t		adjust;
 | 
						|
    config_info_t	config;
 | 
						|
    tuple_t		tuple;
 | 
						|
    tuple_parse_t	tuple_parse;
 | 
						|
    client_req_t	client_req;
 | 
						|
    cs_status_t		status;
 | 
						|
    conf_reg_t		conf_reg;
 | 
						|
    cisinfo_t		cisinfo;
 | 
						|
    region_info_t	region;
 | 
						|
    bind_info_t		bind_info;
 | 
						|
    mtd_info_t		mtd_info;
 | 
						|
    win_info_t		win_info;
 | 
						|
    cisdump_t		cisdump;
 | 
						|
} ds_ioctl_arg_t;
 | 
						|
 | 
						|
#define DS_ADJUST_RESOURCE_INFO		_IOWR('d', 2, adjust_t)
 | 
						|
#define DS_GET_CONFIGURATION_INFO	_IOWR('d', 3, config_info_t)
 | 
						|
#define DS_GET_FIRST_TUPLE		_IOWR('d', 4, tuple_t)
 | 
						|
#define DS_GET_NEXT_TUPLE		_IOWR('d', 5, tuple_t)
 | 
						|
#define DS_GET_TUPLE_DATA		_IOWR('d', 6, tuple_parse_t)
 | 
						|
#define DS_PARSE_TUPLE			_IOWR('d', 7, tuple_parse_t)
 | 
						|
#define DS_RESET_CARD			_IO  ('d', 8)
 | 
						|
#define DS_GET_STATUS			_IOWR('d', 9, cs_status_t)
 | 
						|
#define DS_ACCESS_CONFIGURATION_REGISTER _IOWR('d', 10, conf_reg_t)
 | 
						|
#define DS_VALIDATE_CIS			_IOR ('d', 11, cisinfo_t)
 | 
						|
#define DS_SUSPEND_CARD			_IO  ('d', 12)
 | 
						|
#define DS_RESUME_CARD			_IO  ('d', 13)
 | 
						|
#define DS_EJECT_CARD			_IO  ('d', 14)
 | 
						|
#define DS_INSERT_CARD			_IO  ('d', 15)
 | 
						|
#define DS_GET_FIRST_REGION		_IOWR('d', 16, region_info_t)
 | 
						|
#define DS_GET_NEXT_REGION		_IOWR('d', 17, region_info_t)
 | 
						|
#define DS_REPLACE_CIS			_IOWR('d', 18, cisdump_t)
 | 
						|
#define DS_GET_FIRST_WINDOW		_IOR ('d', 19, win_info_t)
 | 
						|
#define DS_GET_NEXT_WINDOW		_IOWR('d', 20, win_info_t)
 | 
						|
#define DS_GET_MEM_PAGE			_IOWR('d', 21, win_info_t)
 | 
						|
 | 
						|
#define DS_BIND_REQUEST			_IOWR('d', 60, bind_info_t)
 | 
						|
#define DS_GET_DEVICE_INFO		_IOWR('d', 61, bind_info_t) 
 | 
						|
#define DS_GET_NEXT_DEVICE		_IOWR('d', 62, bind_info_t) 
 | 
						|
#define DS_UNBIND_REQUEST		_IOW ('d', 63, bind_info_t)
 | 
						|
#define DS_BIND_MTD			_IOWR('d', 64, mtd_info_t)
 | 
						|
 | 
						|
#ifdef __KERNEL__
 | 
						|
#include <linux/device.h>
 | 
						|
#include <pcmcia/ss.h>
 | 
						|
 | 
						|
typedef struct dev_node_t {
 | 
						|
    char		dev_name[DEV_NAME_LEN];
 | 
						|
    u_short		major, minor;
 | 
						|
    struct dev_node_t	*next;
 | 
						|
} dev_node_t;
 | 
						|
 | 
						|
 | 
						|
struct pcmcia_socket;
 | 
						|
struct config_t;
 | 
						|
 | 
						|
struct pcmcia_dynids {
 | 
						|
	spinlock_t		lock;
 | 
						|
	struct list_head	list;
 | 
						|
};
 | 
						|
 | 
						|
struct pcmcia_driver {
 | 
						|
	int (*probe)		(struct pcmcia_device *dev);
 | 
						|
	void (*remove)		(struct pcmcia_device *dev);
 | 
						|
 | 
						|
	int (*suspend)		(struct pcmcia_device *dev);
 | 
						|
	int (*resume)		(struct pcmcia_device *dev);
 | 
						|
 | 
						|
	struct module		*owner;
 | 
						|
	struct pcmcia_device_id	*id_table;
 | 
						|
	struct device_driver	drv;
 | 
						|
	struct pcmcia_dynids	dynids;
 | 
						|
};
 | 
						|
 | 
						|
/* driver registration */
 | 
						|
int pcmcia_register_driver(struct pcmcia_driver *driver);
 | 
						|
void pcmcia_unregister_driver(struct pcmcia_driver *driver);
 | 
						|
 | 
						|
 | 
						|
struct pcmcia_device {
 | 
						|
	/* the socket and the device_no [for multifunction devices]
 | 
						|
	   uniquely define a pcmcia_device */
 | 
						|
	struct pcmcia_socket	*socket;
 | 
						|
 | 
						|
	char			*devname;
 | 
						|
 | 
						|
	u8			device_no;
 | 
						|
 | 
						|
	/* the hardware "function" device; certain subdevices can
 | 
						|
	 * share one hardware "function" device. */
 | 
						|
	u8			func;
 | 
						|
	struct config_t*	function_config;
 | 
						|
 | 
						|
	struct list_head	socket_device_list;
 | 
						|
 | 
						|
	/* deprecated, will be cleaned up soon */
 | 
						|
	dev_node_t		*dev_node;
 | 
						|
	u_int			open;
 | 
						|
	io_req_t		io;
 | 
						|
	irq_req_t		irq;
 | 
						|
	config_req_t		conf;
 | 
						|
	window_handle_t		win;
 | 
						|
 | 
						|
	/* Is the device suspended, or in the process of
 | 
						|
	 * being removed? */
 | 
						|
	u16			suspended:1;
 | 
						|
	u16			_removed:1;
 | 
						|
 | 
						|
	/* Flags whether io, irq, win configurations were
 | 
						|
	 * requested, and whether the configuration is "locked" */
 | 
						|
	u16			_irq:1;
 | 
						|
	u16			_io:1;
 | 
						|
	u16			_win:4;
 | 
						|
	u16			_locked:1;
 | 
						|
 | 
						|
	/* Flag whether a "fuzzy" func_id based match is
 | 
						|
	 * allowed. */
 | 
						|
	u16			allow_func_id_match:1;
 | 
						|
 | 
						|
	/* information about this device */
 | 
						|
	u16			has_manf_id:1;
 | 
						|
	u16			has_card_id:1;
 | 
						|
	u16			has_func_id:1;
 | 
						|
 | 
						|
	u16			reserved:3;
 | 
						|
 | 
						|
	u8			func_id;
 | 
						|
	u16			manf_id;
 | 
						|
	u16			card_id;
 | 
						|
 | 
						|
	char *			prod_id[4];
 | 
						|
 | 
						|
	u64			dma_mask;
 | 
						|
	struct device		dev;
 | 
						|
 | 
						|
#ifdef CONFIG_PCMCIA_IOCTL
 | 
						|
	/* device driver wanted by cardmgr */
 | 
						|
	struct pcmcia_driver *	cardmgr;
 | 
						|
#endif
 | 
						|
 | 
						|
	/* data private to drivers */
 | 
						|
	void			*priv;
 | 
						|
};
 | 
						|
 | 
						|
#define to_pcmcia_dev(n) container_of(n, struct pcmcia_device, dev)
 | 
						|
#define to_pcmcia_drv(n) container_of(n, struct pcmcia_driver, drv)
 | 
						|
 | 
						|
#define handle_to_dev(handle) (handle->dev)
 | 
						|
 | 
						|
/* error reporting */
 | 
						|
void cs_error(struct pcmcia_device *handle, int func, int ret);
 | 
						|
 | 
						|
#endif /* __KERNEL__ */
 | 
						|
#endif /* _LINUX_DS_H */
 |