| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * linux/include/asm-arm/ecard.h | 
|  | 3 | * | 
|  | 4 | * definitions for expansion cards | 
|  | 5 | * | 
|  | 6 | * This is a new system as from Linux 1.2.3 | 
|  | 7 | * | 
|  | 8 | * Changelog: | 
|  | 9 | *  11-12-1996	RMK	Further minor improvements | 
|  | 10 | *  12-09-1997	RMK	Added interrupt enable/disable for card level | 
|  | 11 | * | 
|  | 12 | * Reference: Acorns Risc OS 3 Programmers Reference Manuals. | 
|  | 13 | */ | 
|  | 14 |  | 
|  | 15 | #ifndef __ASM_ECARD_H | 
|  | 16 | #define __ASM_ECARD_H | 
|  | 17 |  | 
|  | 18 | /* | 
|  | 19 | * Currently understood cards (but not necessarily | 
|  | 20 | * supported): | 
|  | 21 | *                        Manufacturer  Product ID | 
|  | 22 | */ | 
|  | 23 | #define MANU_ACORN		0x0000 | 
|  | 24 | #define PROD_ACORN_SCSI			0x0002 | 
|  | 25 | #define PROD_ACORN_ETHER1		0x0003 | 
|  | 26 | #define PROD_ACORN_MFM			0x000b | 
|  | 27 |  | 
|  | 28 | #define MANU_ANT2		0x0011 | 
|  | 29 | #define PROD_ANT_ETHER3			0x00a4 | 
|  | 30 |  | 
|  | 31 | #define MANU_ATOMWIDE		0x0017 | 
|  | 32 | #define PROD_ATOMWIDE_3PSERIAL		0x0090 | 
|  | 33 |  | 
|  | 34 | #define MANU_IRLAM_INSTRUMENTS	0x001f | 
|  | 35 | #define MANU_IRLAM_INSTRUMENTS_ETHERN	0x5678 | 
|  | 36 |  | 
|  | 37 | #define MANU_OAK		0x0021 | 
|  | 38 | #define PROD_OAK_SCSI			0x0058 | 
|  | 39 |  | 
|  | 40 | #define MANU_MORLEY		0x002b | 
|  | 41 | #define PROD_MORLEY_SCSI_UNCACHED	0x0067 | 
|  | 42 |  | 
|  | 43 | #define MANU_CUMANA		0x003a | 
|  | 44 | #define PROD_CUMANA_SCSI_2		0x003a | 
|  | 45 | #define PROD_CUMANA_SCSI_1		0x00a0 | 
|  | 46 |  | 
|  | 47 | #define MANU_ICS		0x003c | 
|  | 48 | #define PROD_ICS_IDE			0x00ae | 
|  | 49 |  | 
|  | 50 | #define MANU_ICS2		0x003d | 
|  | 51 | #define PROD_ICS2_IDE			0x00ae | 
|  | 52 |  | 
|  | 53 | #define MANU_SERPORT		0x003f | 
|  | 54 | #define PROD_SERPORT_DSPORT		0x00b9 | 
|  | 55 |  | 
|  | 56 | #define MANU_ARXE		0x0041 | 
|  | 57 | #define PROD_ARXE_SCSI			0x00be | 
|  | 58 |  | 
|  | 59 | #define MANU_I3			0x0046 | 
|  | 60 | #define PROD_I3_ETHERLAN500		0x00d4 | 
|  | 61 | #define PROD_I3_ETHERLAN600		0x00ec | 
|  | 62 | #define PROD_I3_ETHERLAN600A		0x011e | 
|  | 63 |  | 
|  | 64 | #define MANU_ANT		0x0053 | 
|  | 65 | #define PROD_ANT_ETHERM			0x00d8 | 
|  | 66 | #define PROD_ANT_ETHERB			0x00e4 | 
|  | 67 |  | 
|  | 68 | #define MANU_ALSYSTEMS		0x005b | 
|  | 69 | #define PROD_ALSYS_SCSIATAPI		0x0107 | 
|  | 70 |  | 
|  | 71 | #define MANU_MCS		0x0063 | 
|  | 72 | #define PROD_MCS_CONNECT32		0x0125 | 
|  | 73 |  | 
|  | 74 | #define MANU_EESOX		0x0064 | 
|  | 75 | #define PROD_EESOX_SCSI2		0x008c | 
|  | 76 |  | 
|  | 77 | #define MANU_YELLOWSTONE	0x0096 | 
|  | 78 | #define PROD_YELLOWSTONE_RAPIDE32	0x0120 | 
|  | 79 |  | 
|  | 80 | #ifdef ECARD_C | 
|  | 81 | #define CONST | 
|  | 82 | #else | 
|  | 83 | #define CONST const | 
|  | 84 | #endif | 
|  | 85 |  | 
|  | 86 | #define MAX_ECARDS	9 | 
|  | 87 |  | 
|  | 88 | typedef enum {				/* Cards address space		*/ | 
|  | 89 | ECARD_IOC, | 
|  | 90 | ECARD_MEMC, | 
|  | 91 | ECARD_EASI | 
|  | 92 | } card_type_t; | 
|  | 93 |  | 
|  | 94 | typedef enum {				/* Speed for ECARD_IOC space	*/ | 
|  | 95 | ECARD_SLOW	 = 0, | 
|  | 96 | ECARD_MEDIUM	 = 1, | 
|  | 97 | ECARD_FAST	 = 2, | 
|  | 98 | ECARD_SYNC	 = 3 | 
|  | 99 | } card_speed_t; | 
|  | 100 |  | 
|  | 101 | struct ecard_id {			/* Card ID structure		*/ | 
|  | 102 | unsigned short	manufacturer; | 
|  | 103 | unsigned short	product; | 
|  | 104 | void		*data; | 
|  | 105 | }; | 
|  | 106 |  | 
|  | 107 | struct in_ecid {			/* Packed card ID information	*/ | 
|  | 108 | unsigned short	product;	/* Product code			*/ | 
|  | 109 | unsigned short	manufacturer;	/* Manufacturer code		*/ | 
|  | 110 | unsigned char	id:4;		/* Simple ID			*/ | 
|  | 111 | unsigned char	cd:1;		/* Chunk dir present		*/ | 
|  | 112 | unsigned char	is:1;		/* Interrupt status pointers	*/ | 
|  | 113 | unsigned char	w:2;		/* Width			*/ | 
|  | 114 | unsigned char	country;	/* Country			*/ | 
|  | 115 | unsigned char	irqmask;	/* IRQ mask			*/ | 
|  | 116 | unsigned char	fiqmask;	/* FIQ mask			*/ | 
|  | 117 | unsigned long	irqoff;		/* IRQ offset			*/ | 
|  | 118 | unsigned long	fiqoff;		/* FIQ offset			*/ | 
|  | 119 | }; | 
|  | 120 |  | 
|  | 121 | typedef struct expansion_card ecard_t; | 
|  | 122 | typedef unsigned long *loader_t; | 
|  | 123 |  | 
| Russell King | c7b87f3 | 2007-05-10 16:46:13 +0100 | [diff] [blame] | 124 | typedef struct expansion_card_ops {	/* Card handler routines	*/ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 125 | void (*irqenable)(ecard_t *ec, int irqnr); | 
|  | 126 | void (*irqdisable)(ecard_t *ec, int irqnr); | 
|  | 127 | int  (*irqpending)(ecard_t *ec); | 
|  | 128 | void (*fiqenable)(ecard_t *ec, int fiqnr); | 
|  | 129 | void (*fiqdisable)(ecard_t *ec, int fiqnr); | 
|  | 130 | int  (*fiqpending)(ecard_t *ec); | 
|  | 131 | } expansioncard_ops_t; | 
|  | 132 |  | 
|  | 133 | #define ECARD_NUM_RESOURCES	(6) | 
|  | 134 |  | 
|  | 135 | #define ECARD_RES_IOCSLOW	(0) | 
|  | 136 | #define ECARD_RES_IOCMEDIUM	(1) | 
|  | 137 | #define ECARD_RES_IOCFAST	(2) | 
|  | 138 | #define ECARD_RES_IOCSYNC	(3) | 
|  | 139 | #define ECARD_RES_MEMC		(4) | 
|  | 140 | #define ECARD_RES_EASI		(5) | 
|  | 141 |  | 
|  | 142 | #define ecard_resource_start(ec,nr)	((ec)->resource[nr].start) | 
|  | 143 | #define ecard_resource_end(ec,nr)	((ec)->resource[nr].end) | 
|  | 144 | #define ecard_resource_len(ec,nr)	((ec)->resource[nr].end - \ | 
|  | 145 | (ec)->resource[nr].start + 1) | 
|  | 146 | #define ecard_resource_flags(ec,nr)	((ec)->resource[nr].flags) | 
|  | 147 |  | 
|  | 148 | /* | 
|  | 149 | * This contains all the info needed on an expansion card | 
|  | 150 | */ | 
|  | 151 | struct expansion_card { | 
|  | 152 | struct expansion_card  *next; | 
|  | 153 |  | 
|  | 154 | struct device		dev; | 
|  | 155 | struct resource		resource[ECARD_NUM_RESOURCES]; | 
|  | 156 |  | 
|  | 157 | /* Public data */ | 
|  | 158 | void __iomem		*irqaddr;	/* address of IRQ register	*/ | 
|  | 159 | void __iomem		*fiqaddr;	/* address of FIQ register	*/ | 
|  | 160 | unsigned char		irqmask;	/* IRQ mask			*/ | 
|  | 161 | unsigned char		fiqmask;	/* FIQ mask			*/ | 
|  | 162 | unsigned char  		claimed;	/* Card claimed?		*/ | 
| Russell King | 5559bca | 2007-05-03 10:47:37 +0100 | [diff] [blame] | 163 | unsigned char		easi;		/* EASI card			*/ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 164 |  | 
|  | 165 | void			*irq_data;	/* Data for use for IRQ by card	*/ | 
|  | 166 | void			*fiq_data;	/* Data for use for FIQ by card	*/ | 
|  | 167 | const expansioncard_ops_t *ops;		/* Enable/Disable Ops for card	*/ | 
|  | 168 |  | 
|  | 169 | CONST unsigned int	slot_no;	/* Slot number			*/ | 
|  | 170 | CONST unsigned int	dma;		/* DMA number (for request_dma)	*/ | 
|  | 171 | CONST unsigned int	irq;		/* IRQ number (for request_irq)	*/ | 
|  | 172 | CONST unsigned int	fiq;		/* FIQ number (for request_irq)	*/ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 173 | CONST struct in_ecid	cid;		/* Card Identification		*/ | 
|  | 174 |  | 
|  | 175 | /* Private internal data */ | 
|  | 176 | const char		*card_desc;	/* Card description		*/ | 
|  | 177 | CONST unsigned int	podaddr;	/* Base Linux address for card	*/ | 
|  | 178 | CONST loader_t		loader;		/* loader program */ | 
|  | 179 | u64			dma_mask; | 
|  | 180 | }; | 
|  | 181 |  | 
| Russell King | c7b87f3 | 2007-05-10 16:46:13 +0100 | [diff] [blame] | 182 | void ecard_setirq(struct expansion_card *ec, const struct expansion_card_ops *ops, void *irq_data); | 
|  | 183 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 184 | struct in_chunk_dir { | 
|  | 185 | unsigned int start_offset; | 
|  | 186 | union { | 
|  | 187 | unsigned char string[256]; | 
|  | 188 | unsigned char data[1]; | 
|  | 189 | } d; | 
|  | 190 | }; | 
|  | 191 |  | 
|  | 192 | /* | 
|  | 193 | * ecard_claim: claim an expansion card entry | 
|  | 194 | */ | 
|  | 195 | #define ecard_claim(ec) ((ec)->claimed = 1) | 
|  | 196 |  | 
|  | 197 | /* | 
|  | 198 | * ecard_release: release an expansion card entry | 
|  | 199 | */ | 
|  | 200 | #define ecard_release(ec) ((ec)->claimed = 0) | 
|  | 201 |  | 
|  | 202 | /* | 
|  | 203 | * Read a chunk from an expansion card | 
|  | 204 | * cd : where to put read data | 
|  | 205 | * ec : expansion card info struct | 
|  | 206 | * id : id number to find | 
|  | 207 | * num: (n+1)'th id to find. | 
|  | 208 | */ | 
|  | 209 | extern int ecard_readchunk (struct in_chunk_dir *cd, struct expansion_card *ec, int id, int num); | 
|  | 210 |  | 
|  | 211 | /* | 
|  | 212 | * Obtain the address of a card.  This returns the "old style" address | 
|  | 213 | * and should no longer be used. | 
|  | 214 | */ | 
|  | 215 | static inline unsigned int __deprecated | 
|  | 216 | ecard_address(struct expansion_card *ec, card_type_t type, card_speed_t speed) | 
|  | 217 | { | 
|  | 218 | extern unsigned int __ecard_address(struct expansion_card *, | 
|  | 219 | card_type_t, card_speed_t); | 
|  | 220 | return __ecard_address(ec, type, speed); | 
|  | 221 | } | 
|  | 222 |  | 
|  | 223 | /* | 
|  | 224 | * Request and release ecard resources | 
|  | 225 | */ | 
|  | 226 | extern int ecard_request_resources(struct expansion_card *ec); | 
|  | 227 | extern void ecard_release_resources(struct expansion_card *ec); | 
|  | 228 |  | 
| Russell King | 10bdaaa | 2007-05-10 18:40:51 +0100 | [diff] [blame] | 229 | void __iomem *ecardm_iomap(struct expansion_card *ec, unsigned int res, | 
|  | 230 | unsigned long offset, unsigned long maxsize); | 
|  | 231 | #define ecardm_iounmap(__ec, __addr)	devm_iounmap(&(__ec)->dev, __addr) | 
|  | 232 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 233 | extern struct bus_type ecard_bus_type; | 
|  | 234 |  | 
|  | 235 | #define ECARD_DEV(_d)	container_of((_d), struct expansion_card, dev) | 
|  | 236 |  | 
|  | 237 | struct ecard_driver { | 
|  | 238 | int			(*probe)(struct expansion_card *, const struct ecard_id *id); | 
|  | 239 | void			(*remove)(struct expansion_card *); | 
|  | 240 | void			(*shutdown)(struct expansion_card *); | 
|  | 241 | const struct ecard_id	*id_table; | 
|  | 242 | unsigned int		id; | 
|  | 243 | struct device_driver	drv; | 
|  | 244 | }; | 
|  | 245 |  | 
|  | 246 | #define ECARD_DRV(_d)	container_of((_d), struct ecard_driver, drv) | 
|  | 247 |  | 
|  | 248 | #define ecard_set_drvdata(ec,data)	dev_set_drvdata(&(ec)->dev, (data)) | 
|  | 249 | #define ecard_get_drvdata(ec)		dev_get_drvdata(&(ec)->dev) | 
|  | 250 |  | 
|  | 251 | int ecard_register_driver(struct ecard_driver *); | 
|  | 252 | void ecard_remove_driver(struct ecard_driver *); | 
|  | 253 |  | 
|  | 254 | #endif |