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