- Kai Germaschewski: ISDN update (including Makefiles)
[davej-history.git] / drivers / scsi / amiga7xx.c
blobf2f457b79b1b8d828862b92e6c4a37240aad558f
1 /*
2 * Detection routine for the NCR53c710 based Amiga SCSI Controllers for Linux.
3 * Amiga MacroSystemUS WarpEngine SCSI controller.
4 * Amiga Technologies A4000T SCSI controller.
5 * Amiga Technologies/DKB A4091 SCSI controller.
7 * Written 1997 by Alan Hourihane <alanh@fairlite.demon.co.uk>
8 * plus modifications of the 53c7xx.c driver to support the Amiga.
9 */
10 #include <linux/types.h>
11 #include <linux/mm.h>
12 #include <linux/blk.h>
13 #include <linux/sched.h>
14 #include <linux/version.h>
15 #include <linux/config.h>
16 #include <linux/zorro.h>
18 #include <asm/setup.h>
19 #include <asm/page.h>
20 #include <asm/pgtable.h>
21 #include <asm/amigaints.h>
22 #include <asm/amigahw.h>
23 #include <asm/io.h>
24 #include <asm/irq.h>
25 #include <asm/init.h>
27 #include "scsi.h"
28 #include "hosts.h"
29 #include "53c7xx.h"
30 #include "amiga7xx.h"
32 #include<linux/stat.h>
34 extern int ncr53c7xx_init (Scsi_Host_Template *tpnt, int board, int chip,
35 u32 base, int io_port, int irq, int dma,
36 long long options, int clock);
38 int __init amiga7xx_detect(Scsi_Host_Template *tpnt)
40 static unsigned char called = 0;
41 int num = 0, clock;
42 long long options;
43 struct zorro_dev *z = NULL;
44 unsigned long address;
46 if (called || !MACH_IS_AMIGA)
47 return 0;
49 tpnt->proc_name = "Amiga7xx";
51 #ifdef CONFIG_A4000T_SCSI
52 if (AMIGAHW_PRESENT(A4000_SCSI)) {
53 address = 0xdd0040;
54 if (request_mem_region(address, 0x1000, "ncr53c710")) {
55 address = ZTWO_VADDR(address);
56 options = OPTION_MEMORY_MAPPED | OPTION_DEBUG_TEST1 |
57 OPTION_INTFLY | OPTION_SYNCHRONOUS |
58 OPTION_ALWAYS_SYNCHRONOUS | OPTION_DISCONNECT;
59 clock = 50000000; /* 50MHz SCSI Clock */
60 ncr53c7xx_init(tpnt, 0, 710, address, 0, IRQ_AMIGA_PORTS, DMA_NONE,
61 options, clock);
62 num++;
65 #endif
67 while ((z = zorro_find_device(ZORRO_WILDCARD, z))) {
68 unsigned long address = z->resource.start;
69 unsigned long size = z->resource.end-z->resource.start+1;
70 switch (z->id) {
71 #ifdef CONFIG_BLZ603EPLUS_SCSI
72 case ZORRO_PROD_PHASE5_BLIZZARD_603E_PLUS:
73 address = 0xf40000;
74 if (request_mem_region(address, 0x1000, "ncr53c710")) {
75 address = ZTWO_VADDR(address);
76 options = OPTION_MEMORY_MAPPED | OPTION_DEBUG_TEST1 |
77 OPTION_INTFLY | OPTION_SYNCHRONOUS |
78 OPTION_ALWAYS_SYNCHRONOUS | OPTION_DISCONNECT;
79 clock = 50000000; /* 50MHz SCSI Clock */
80 ncr53c7xx_init(tpnt, 0, 710, address, 0, IRQ_AMIGA_PORTS,
81 DMA_NONE, options, clock);
82 num++;
84 break;
85 #endif
87 #ifdef CONFIG_WARPENGINE_SCSI
88 case ZORRO_PROD_MACROSYSTEMS_WARP_ENGINE_40xx:
89 if (request_mem_region(address+0x40000, 0x1000, "ncr53c710")) {
90 address = (unsigned long)ioremap(address, size);
91 options = OPTION_MEMORY_MAPPED | OPTION_DEBUG_TEST1 |
92 OPTION_INTFLY | OPTION_SYNCHRONOUS |
93 OPTION_ALWAYS_SYNCHRONOUS | OPTION_DISCONNECT;
94 clock = 50000000; /* 50MHz SCSI Clock */
95 ncr53c7xx_init(tpnt, 0, 710, address+0x40000, 0,
96 IRQ_AMIGA_PORTS, DMA_NONE, options, clock);
97 num++;
99 break;
100 #endif
102 #ifdef CONFIG_A4091_SCSI
103 case ZORRO_PROD_CBM_A4091_1:
104 case ZORRO_PROD_CBM_A4091_2:
105 if (request_mem_region(address+0x800000, 0x1000, "ncr53c710")) {
106 address = (unsigned long)ioremap(address, size);
107 options = OPTION_MEMORY_MAPPED | OPTION_DEBUG_TEST1 |
108 OPTION_INTFLY | OPTION_SYNCHRONOUS |
109 OPTION_ALWAYS_SYNCHRONOUS | OPTION_DISCONNECT;
110 clock = 50000000; /* 50MHz SCSI Clock */
111 ncr53c7xx_init(tpnt, 0, 710, address+0x800000, 0,
112 IRQ_AMIGA_PORTS, DMA_NONE, options, clock);
113 num++;
115 break;
116 #endif
118 #ifdef CONFIG_GVP_TURBO_SCSI
119 case ZORRO_PROD_GVP_GFORCE_040_060:
120 if (request_mem_region(address+0x40000, 0x1000, "ncr53c710")) {
121 address = ZTWO_VADDR(address);
122 options = OPTION_MEMORY_MAPPED | OPTION_DEBUG_TEST1 |
123 OPTION_INTFLY | OPTION_SYNCHRONOUS |
124 OPTION_ALWAYS_SYNCHRONOUS | OPTION_DISCONNECT;
125 clock = 50000000; /* 50MHz SCSI Clock */
126 ncr53c7xx_init(tpnt, 0, 710, address+0x40000, 0,
127 IRQ_AMIGA_PORTS, DMA_NONE, options, clock);
128 num++;
130 #endif
134 called = 1;
135 return num;