18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * arch/arm/include/asm/ecard.h
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * definitions for expansion cards
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * This is a new system as from Linux 1.2.3
88c2ecf20Sopenharmony_ci *
98c2ecf20Sopenharmony_ci * Changelog:
108c2ecf20Sopenharmony_ci *  11-12-1996	RMK	Further minor improvements
118c2ecf20Sopenharmony_ci *  12-09-1997	RMK	Added interrupt enable/disable for card level
128c2ecf20Sopenharmony_ci *
138c2ecf20Sopenharmony_ci * Reference: Acorns Risc OS 3 Programmers Reference Manuals.
148c2ecf20Sopenharmony_ci */
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#ifndef __ASM_ECARD_H
178c2ecf20Sopenharmony_ci#define __ASM_ECARD_H
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci/*
208c2ecf20Sopenharmony_ci * Currently understood cards (but not necessarily
218c2ecf20Sopenharmony_ci * supported):
228c2ecf20Sopenharmony_ci *                        Manufacturer  Product ID
238c2ecf20Sopenharmony_ci */
248c2ecf20Sopenharmony_ci#define MANU_ACORN		0x0000
258c2ecf20Sopenharmony_ci#define PROD_ACORN_SCSI			0x0002
268c2ecf20Sopenharmony_ci#define PROD_ACORN_ETHER1		0x0003
278c2ecf20Sopenharmony_ci#define PROD_ACORN_MFM			0x000b
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci#define MANU_ANT2		0x0011
308c2ecf20Sopenharmony_ci#define PROD_ANT_ETHER3			0x00a4
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci#define MANU_ATOMWIDE		0x0017
338c2ecf20Sopenharmony_ci#define PROD_ATOMWIDE_3PSERIAL		0x0090
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci#define MANU_IRLAM_INSTRUMENTS	0x001f
368c2ecf20Sopenharmony_ci#define MANU_IRLAM_INSTRUMENTS_ETHERN	0x5678
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci#define MANU_OAK		0x0021
398c2ecf20Sopenharmony_ci#define PROD_OAK_SCSI			0x0058
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci#define MANU_MORLEY		0x002b
428c2ecf20Sopenharmony_ci#define PROD_MORLEY_SCSI_UNCACHED	0x0067
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci#define MANU_CUMANA		0x003a
458c2ecf20Sopenharmony_ci#define PROD_CUMANA_SCSI_2		0x003a
468c2ecf20Sopenharmony_ci#define PROD_CUMANA_SCSI_1		0x00a0
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci#define MANU_ICS		0x003c
498c2ecf20Sopenharmony_ci#define PROD_ICS_IDE			0x00ae
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci#define MANU_ICS2		0x003d
528c2ecf20Sopenharmony_ci#define PROD_ICS2_IDE			0x00ae
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci#define MANU_SERPORT		0x003f
558c2ecf20Sopenharmony_ci#define PROD_SERPORT_DSPORT		0x00b9
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci#define MANU_ARXE		0x0041
588c2ecf20Sopenharmony_ci#define PROD_ARXE_SCSI			0x00be
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci#define MANU_I3			0x0046
618c2ecf20Sopenharmony_ci#define PROD_I3_ETHERLAN500		0x00d4
628c2ecf20Sopenharmony_ci#define PROD_I3_ETHERLAN600		0x00ec
638c2ecf20Sopenharmony_ci#define PROD_I3_ETHERLAN600A		0x011e
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci#define MANU_ANT		0x0053
668c2ecf20Sopenharmony_ci#define PROD_ANT_ETHERM			0x00d8
678c2ecf20Sopenharmony_ci#define PROD_ANT_ETHERB			0x00e4
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci#define MANU_ALSYSTEMS		0x005b
708c2ecf20Sopenharmony_ci#define PROD_ALSYS_SCSIATAPI		0x0107
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ci#define MANU_MCS		0x0063
738c2ecf20Sopenharmony_ci#define PROD_MCS_CONNECT32		0x0125
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci#define MANU_EESOX		0x0064
768c2ecf20Sopenharmony_ci#define PROD_EESOX_SCSI2		0x008c
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ci#define MANU_YELLOWSTONE	0x0096
798c2ecf20Sopenharmony_ci#define PROD_YELLOWSTONE_RAPIDE32	0x0120
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci#ifdef ECARD_C
828c2ecf20Sopenharmony_ci#define CONST
838c2ecf20Sopenharmony_ci#else
848c2ecf20Sopenharmony_ci#define CONST const
858c2ecf20Sopenharmony_ci#endif
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci#define MAX_ECARDS	9
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_cistruct ecard_id {			/* Card ID structure		*/
908c2ecf20Sopenharmony_ci	unsigned short	manufacturer;
918c2ecf20Sopenharmony_ci	unsigned short	product;
928c2ecf20Sopenharmony_ci	void		*data;
938c2ecf20Sopenharmony_ci};
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_cistruct in_ecid {			/* Packed card ID information	*/
968c2ecf20Sopenharmony_ci	unsigned short	product;	/* Product code			*/
978c2ecf20Sopenharmony_ci	unsigned short	manufacturer;	/* Manufacturer code		*/
988c2ecf20Sopenharmony_ci	unsigned char	id:4;		/* Simple ID			*/
998c2ecf20Sopenharmony_ci	unsigned char	cd:1;		/* Chunk dir present		*/
1008c2ecf20Sopenharmony_ci	unsigned char	is:1;		/* Interrupt status pointers	*/
1018c2ecf20Sopenharmony_ci	unsigned char	w:2;		/* Width			*/
1028c2ecf20Sopenharmony_ci	unsigned char	country;	/* Country			*/
1038c2ecf20Sopenharmony_ci	unsigned char	irqmask;	/* IRQ mask			*/
1048c2ecf20Sopenharmony_ci	unsigned char	fiqmask;	/* FIQ mask			*/
1058c2ecf20Sopenharmony_ci	unsigned long	irqoff;		/* IRQ offset			*/
1068c2ecf20Sopenharmony_ci	unsigned long	fiqoff;		/* FIQ offset			*/
1078c2ecf20Sopenharmony_ci};
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_citypedef struct expansion_card ecard_t;
1108c2ecf20Sopenharmony_citypedef unsigned long *loader_t;
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_citypedef struct expansion_card_ops {	/* Card handler routines	*/
1138c2ecf20Sopenharmony_ci	void (*irqenable)(ecard_t *ec, int irqnr);
1148c2ecf20Sopenharmony_ci	void (*irqdisable)(ecard_t *ec, int irqnr);
1158c2ecf20Sopenharmony_ci	int  (*irqpending)(ecard_t *ec);
1168c2ecf20Sopenharmony_ci	void (*fiqenable)(ecard_t *ec, int fiqnr);
1178c2ecf20Sopenharmony_ci	void (*fiqdisable)(ecard_t *ec, int fiqnr);
1188c2ecf20Sopenharmony_ci	int  (*fiqpending)(ecard_t *ec);
1198c2ecf20Sopenharmony_ci} expansioncard_ops_t;
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci#define ECARD_NUM_RESOURCES	(6)
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci#define ECARD_RES_IOCSLOW	(0)
1248c2ecf20Sopenharmony_ci#define ECARD_RES_IOCMEDIUM	(1)
1258c2ecf20Sopenharmony_ci#define ECARD_RES_IOCFAST	(2)
1268c2ecf20Sopenharmony_ci#define ECARD_RES_IOCSYNC	(3)
1278c2ecf20Sopenharmony_ci#define ECARD_RES_MEMC		(4)
1288c2ecf20Sopenharmony_ci#define ECARD_RES_EASI		(5)
1298c2ecf20Sopenharmony_ci
1308c2ecf20Sopenharmony_ci#define ecard_resource_start(ec,nr)	((ec)->resource[nr].start)
1318c2ecf20Sopenharmony_ci#define ecard_resource_end(ec,nr)	((ec)->resource[nr].end)
1328c2ecf20Sopenharmony_ci#define ecard_resource_len(ec,nr)	((ec)->resource[nr].end - \
1338c2ecf20Sopenharmony_ci					 (ec)->resource[nr].start + 1)
1348c2ecf20Sopenharmony_ci#define ecard_resource_flags(ec,nr)	((ec)->resource[nr].flags)
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_ci/*
1378c2ecf20Sopenharmony_ci * This contains all the info needed on an expansion card
1388c2ecf20Sopenharmony_ci */
1398c2ecf20Sopenharmony_cistruct expansion_card {
1408c2ecf20Sopenharmony_ci	struct expansion_card  *next;
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_ci	struct device		dev;
1438c2ecf20Sopenharmony_ci	struct resource		resource[ECARD_NUM_RESOURCES];
1448c2ecf20Sopenharmony_ci
1458c2ecf20Sopenharmony_ci	/* Public data */
1468c2ecf20Sopenharmony_ci	void __iomem		*irqaddr;	/* address of IRQ register	*/
1478c2ecf20Sopenharmony_ci	void __iomem		*fiqaddr;	/* address of FIQ register	*/
1488c2ecf20Sopenharmony_ci	unsigned char		irqmask;	/* IRQ mask			*/
1498c2ecf20Sopenharmony_ci	unsigned char		fiqmask;	/* FIQ mask			*/
1508c2ecf20Sopenharmony_ci	unsigned char  		claimed;	/* Card claimed?		*/
1518c2ecf20Sopenharmony_ci	unsigned char		easi;		/* EASI card			*/
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ci	void			*irq_data;	/* Data for use for IRQ by card	*/
1548c2ecf20Sopenharmony_ci	void			*fiq_data;	/* Data for use for FIQ by card	*/
1558c2ecf20Sopenharmony_ci	const expansioncard_ops_t *ops;		/* Enable/Disable Ops for card	*/
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_ci	CONST unsigned int	slot_no;	/* Slot number			*/
1588c2ecf20Sopenharmony_ci	CONST unsigned int	dma;		/* DMA number (for request_dma)	*/
1598c2ecf20Sopenharmony_ci	CONST unsigned int	irq;		/* IRQ number (for request_irq)	*/
1608c2ecf20Sopenharmony_ci	CONST unsigned int	fiq;		/* FIQ number (for request_irq)	*/
1618c2ecf20Sopenharmony_ci	CONST struct in_ecid	cid;		/* Card Identification		*/
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci	/* Private internal data */
1648c2ecf20Sopenharmony_ci	const char		*card_desc;	/* Card description		*/
1658c2ecf20Sopenharmony_ci	CONST loader_t		loader;		/* loader program */
1668c2ecf20Sopenharmony_ci	u64			dma_mask;
1678c2ecf20Sopenharmony_ci};
1688c2ecf20Sopenharmony_ci
1698c2ecf20Sopenharmony_civoid ecard_setirq(struct expansion_card *ec, const struct expansion_card_ops *ops, void *irq_data);
1708c2ecf20Sopenharmony_ci
1718c2ecf20Sopenharmony_cistruct in_chunk_dir {
1728c2ecf20Sopenharmony_ci	unsigned int start_offset;
1738c2ecf20Sopenharmony_ci	union {
1748c2ecf20Sopenharmony_ci		unsigned char string[256];
1758c2ecf20Sopenharmony_ci		unsigned char data[1];
1768c2ecf20Sopenharmony_ci	} d;
1778c2ecf20Sopenharmony_ci};
1788c2ecf20Sopenharmony_ci
1798c2ecf20Sopenharmony_ci/*
1808c2ecf20Sopenharmony_ci * Read a chunk from an expansion card
1818c2ecf20Sopenharmony_ci * cd : where to put read data
1828c2ecf20Sopenharmony_ci * ec : expansion card info struct
1838c2ecf20Sopenharmony_ci * id : id number to find
1848c2ecf20Sopenharmony_ci * num: (n+1)'th id to find.
1858c2ecf20Sopenharmony_ci */
1868c2ecf20Sopenharmony_ciextern int ecard_readchunk (struct in_chunk_dir *cd, struct expansion_card *ec, int id, int num);
1878c2ecf20Sopenharmony_ci
1888c2ecf20Sopenharmony_ci/*
1898c2ecf20Sopenharmony_ci * Request and release ecard resources
1908c2ecf20Sopenharmony_ci */
1918c2ecf20Sopenharmony_ciextern int ecard_request_resources(struct expansion_card *ec);
1928c2ecf20Sopenharmony_ciextern void ecard_release_resources(struct expansion_card *ec);
1938c2ecf20Sopenharmony_ci
1948c2ecf20Sopenharmony_civoid __iomem *ecardm_iomap(struct expansion_card *ec, unsigned int res,
1958c2ecf20Sopenharmony_ci			   unsigned long offset, unsigned long maxsize);
1968c2ecf20Sopenharmony_ci#define ecardm_iounmap(__ec, __addr)	devm_iounmap(&(__ec)->dev, __addr)
1978c2ecf20Sopenharmony_ci
1988c2ecf20Sopenharmony_ciextern struct bus_type ecard_bus_type;
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_ci#define ECARD_DEV(_d)	container_of((_d), struct expansion_card, dev)
2018c2ecf20Sopenharmony_ci
2028c2ecf20Sopenharmony_cistruct ecard_driver {
2038c2ecf20Sopenharmony_ci	int			(*probe)(struct expansion_card *, const struct ecard_id *id);
2048c2ecf20Sopenharmony_ci	void			(*remove)(struct expansion_card *);
2058c2ecf20Sopenharmony_ci	void			(*shutdown)(struct expansion_card *);
2068c2ecf20Sopenharmony_ci	const struct ecard_id	*id_table;
2078c2ecf20Sopenharmony_ci	unsigned int		id;
2088c2ecf20Sopenharmony_ci	struct device_driver	drv;
2098c2ecf20Sopenharmony_ci};
2108c2ecf20Sopenharmony_ci
2118c2ecf20Sopenharmony_ci#define ECARD_DRV(_d)	container_of((_d), struct ecard_driver, drv)
2128c2ecf20Sopenharmony_ci
2138c2ecf20Sopenharmony_ci#define ecard_set_drvdata(ec,data)	dev_set_drvdata(&(ec)->dev, (data))
2148c2ecf20Sopenharmony_ci#define ecard_get_drvdata(ec)		dev_get_drvdata(&(ec)->dev)
2158c2ecf20Sopenharmony_ci
2168c2ecf20Sopenharmony_ciint ecard_register_driver(struct ecard_driver *);
2178c2ecf20Sopenharmony_civoid ecard_remove_driver(struct ecard_driver *);
2188c2ecf20Sopenharmony_ci
2198c2ecf20Sopenharmony_ci#endif
220