Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * arch/arm/include/asm/ecard.h
0004  *
0005  * definitions for expansion cards
0006  *
0007  * This is a new system as from Linux 1.2.3
0008  *
0009  * Changelog:
0010  *  11-12-1996  RMK Further minor improvements
0011  *  12-09-1997  RMK Added interrupt enable/disable for card level
0012  *
0013  * Reference: Acorns Risc OS 3 Programmers Reference Manuals.
0014  */
0015 
0016 #ifndef __ASM_ECARD_H
0017 #define __ASM_ECARD_H
0018 
0019 /*
0020  * Currently understood cards (but not necessarily
0021  * supported):
0022  *                        Manufacturer  Product ID
0023  */
0024 #define MANU_ACORN      0x0000
0025 #define PROD_ACORN_SCSI         0x0002
0026 #define PROD_ACORN_ETHER1       0x0003
0027 #define PROD_ACORN_MFM          0x000b
0028 
0029 #define MANU_ANT2       0x0011
0030 #define PROD_ANT_ETHER3         0x00a4
0031 
0032 #define MANU_ATOMWIDE       0x0017
0033 #define PROD_ATOMWIDE_3PSERIAL      0x0090
0034 
0035 #define MANU_IRLAM_INSTRUMENTS  0x001f
0036 #define MANU_IRLAM_INSTRUMENTS_ETHERN   0x5678
0037 
0038 #define MANU_OAK        0x0021
0039 #define PROD_OAK_SCSI           0x0058
0040 
0041 #define MANU_MORLEY     0x002b
0042 #define PROD_MORLEY_SCSI_UNCACHED   0x0067
0043 
0044 #define MANU_CUMANA     0x003a
0045 #define PROD_CUMANA_SCSI_2      0x003a
0046 #define PROD_CUMANA_SCSI_1      0x00a0
0047 
0048 #define MANU_ICS        0x003c
0049 #define PROD_ICS_IDE            0x00ae
0050 
0051 #define MANU_ICS2       0x003d
0052 #define PROD_ICS2_IDE           0x00ae
0053 
0054 #define MANU_SERPORT        0x003f
0055 #define PROD_SERPORT_DSPORT     0x00b9
0056 
0057 #define MANU_ARXE       0x0041
0058 #define PROD_ARXE_SCSI          0x00be
0059 
0060 #define MANU_I3         0x0046
0061 #define PROD_I3_ETHERLAN500     0x00d4
0062 #define PROD_I3_ETHERLAN600     0x00ec
0063 #define PROD_I3_ETHERLAN600A        0x011e
0064 
0065 #define MANU_ANT        0x0053
0066 #define PROD_ANT_ETHERM         0x00d8
0067 #define PROD_ANT_ETHERB         0x00e4
0068 
0069 #define MANU_ALSYSTEMS      0x005b
0070 #define PROD_ALSYS_SCSIATAPI        0x0107
0071 
0072 #define MANU_MCS        0x0063
0073 #define PROD_MCS_CONNECT32      0x0125
0074 
0075 #define MANU_EESOX      0x0064
0076 #define PROD_EESOX_SCSI2        0x008c
0077 
0078 #define MANU_YELLOWSTONE    0x0096
0079 #define PROD_YELLOWSTONE_RAPIDE32   0x0120
0080 
0081 #ifdef ECARD_C
0082 #define CONST
0083 #else
0084 #define CONST const
0085 #endif
0086 
0087 #define MAX_ECARDS  9
0088 
0089 struct ecard_id {           /* Card ID structure        */
0090     unsigned short  manufacturer;
0091     unsigned short  product;
0092     void        *data;
0093 };
0094 
0095 struct in_ecid {            /* Packed card ID information   */
0096     unsigned short  product;    /* Product code         */
0097     unsigned short  manufacturer;   /* Manufacturer code        */
0098     unsigned char   id:4;       /* Simple ID            */
0099     unsigned char   cd:1;       /* Chunk dir present        */
0100     unsigned char   is:1;       /* Interrupt status pointers    */
0101     unsigned char   w:2;        /* Width            */
0102     unsigned char   country;    /* Country          */
0103     unsigned char   irqmask;    /* IRQ mask         */
0104     unsigned char   fiqmask;    /* FIQ mask         */
0105     unsigned long   irqoff;     /* IRQ offset           */
0106     unsigned long   fiqoff;     /* FIQ offset           */
0107 };
0108 
0109 typedef struct expansion_card ecard_t;
0110 typedef unsigned long *loader_t;
0111 
0112 typedef struct expansion_card_ops { /* Card handler routines    */
0113     void (*irqenable)(ecard_t *ec, int irqnr);
0114     void (*irqdisable)(ecard_t *ec, int irqnr);
0115     int  (*irqpending)(ecard_t *ec);
0116     void (*fiqenable)(ecard_t *ec, int fiqnr);
0117     void (*fiqdisable)(ecard_t *ec, int fiqnr);
0118     int  (*fiqpending)(ecard_t *ec);
0119 } expansioncard_ops_t;
0120 
0121 #define ECARD_NUM_RESOURCES (6)
0122 
0123 #define ECARD_RES_IOCSLOW   (0)
0124 #define ECARD_RES_IOCMEDIUM (1)
0125 #define ECARD_RES_IOCFAST   (2)
0126 #define ECARD_RES_IOCSYNC   (3)
0127 #define ECARD_RES_MEMC      (4)
0128 #define ECARD_RES_EASI      (5)
0129 
0130 #define ecard_resource_start(ec,nr) ((ec)->resource[nr].start)
0131 #define ecard_resource_end(ec,nr)   ((ec)->resource[nr].end)
0132 #define ecard_resource_len(ec,nr)   ((ec)->resource[nr].end - \
0133                      (ec)->resource[nr].start + 1)
0134 #define ecard_resource_flags(ec,nr) ((ec)->resource[nr].flags)
0135 
0136 /*
0137  * This contains all the info needed on an expansion card
0138  */
0139 struct expansion_card {
0140     struct expansion_card  *next;
0141 
0142     struct device       dev;
0143     struct resource     resource[ECARD_NUM_RESOURCES];
0144 
0145     /* Public data */
0146     void __iomem        *irqaddr;   /* address of IRQ register  */
0147     void __iomem        *fiqaddr;   /* address of FIQ register  */
0148     unsigned char       irqmask;    /* IRQ mask         */
0149     unsigned char       fiqmask;    /* FIQ mask         */
0150     unsigned char       claimed;    /* Card claimed?        */
0151     unsigned char       easi;       /* EASI card            */
0152 
0153     void            *irq_data;  /* Data for use for IRQ by card */
0154     void            *fiq_data;  /* Data for use for FIQ by card */
0155     const expansioncard_ops_t *ops;     /* Enable/Disable Ops for card  */
0156 
0157     CONST unsigned int  slot_no;    /* Slot number          */
0158     CONST unsigned int  dma;        /* DMA number (for request_dma) */
0159     CONST unsigned int  irq;        /* IRQ number (for request_irq) */
0160     CONST unsigned int  fiq;        /* FIQ number (for request_irq) */
0161     CONST struct in_ecid    cid;        /* Card Identification      */
0162 
0163     /* Private internal data */
0164     const char      *card_desc; /* Card description     */
0165     CONST loader_t      loader;     /* loader program */
0166     u64         dma_mask;
0167 };
0168 
0169 void ecard_setirq(struct expansion_card *ec, const struct expansion_card_ops *ops, void *irq_data);
0170 
0171 struct in_chunk_dir {
0172     unsigned int start_offset;
0173     union {
0174         unsigned char string[256];
0175         unsigned char data[1];
0176     } d;
0177 };
0178 
0179 /*
0180  * Read a chunk from an expansion card
0181  * cd : where to put read data
0182  * ec : expansion card info struct
0183  * id : id number to find
0184  * num: (n+1)'th id to find.
0185  */
0186 extern int ecard_readchunk (struct in_chunk_dir *cd, struct expansion_card *ec, int id, int num);
0187 
0188 /*
0189  * Request and release ecard resources
0190  */
0191 extern int ecard_request_resources(struct expansion_card *ec);
0192 extern void ecard_release_resources(struct expansion_card *ec);
0193 
0194 void __iomem *ecardm_iomap(struct expansion_card *ec, unsigned int res,
0195                unsigned long offset, unsigned long maxsize);
0196 #define ecardm_iounmap(__ec, __addr)    devm_iounmap(&(__ec)->dev, __addr)
0197 
0198 extern struct bus_type ecard_bus_type;
0199 
0200 #define ECARD_DEV(_d)   container_of((_d), struct expansion_card, dev)
0201 
0202 struct ecard_driver {
0203     int         (*probe)(struct expansion_card *, const struct ecard_id *id);
0204     void            (*remove)(struct expansion_card *);
0205     void            (*shutdown)(struct expansion_card *);
0206     const struct ecard_id   *id_table;
0207     unsigned int        id;
0208     struct device_driver    drv;
0209 };
0210 
0211 #define ECARD_DRV(_d)   container_of((_d), struct ecard_driver, drv)
0212 
0213 #define ecard_set_drvdata(ec,data)  dev_set_drvdata(&(ec)->dev, (data))
0214 #define ecard_get_drvdata(ec)       dev_get_drvdata(&(ec)->dev)
0215 
0216 int ecard_register_driver(struct ecard_driver *);
0217 void ecard_remove_driver(struct ecard_driver *);
0218 
0219 #endif