diff options
Diffstat (limited to 'drivers/ide/legacy/gayle.c')
-rw-r--r-- | drivers/ide/legacy/gayle.c | 39 |
1 files changed, 12 insertions, 27 deletions
diff --git a/drivers/ide/legacy/gayle.c b/drivers/ide/legacy/gayle.c index 7e74b20202df..dd5c467d8dd0 100644 --- a/drivers/ide/legacy/gayle.c +++ b/drivers/ide/legacy/gayle.c | |||
@@ -31,6 +31,8 @@ | |||
31 | #define GAYLE_BASE_4000 0xdd2020 /* A4000/A4000T */ | 31 | #define GAYLE_BASE_4000 0xdd2020 /* A4000/A4000T */ |
32 | #define GAYLE_BASE_1200 0xda0000 /* A1200/A600 and E-Matrix 530 */ | 32 | #define GAYLE_BASE_1200 0xda0000 /* A1200/A600 and E-Matrix 530 */ |
33 | 33 | ||
34 | #define GAYLE_IDEREG_SIZE 0x2000 | ||
35 | |||
34 | /* | 36 | /* |
35 | * Offsets from one of the above bases | 37 | * Offsets from one of the above bases |
36 | */ | 38 | */ |
@@ -56,13 +58,11 @@ | |||
56 | #define GAYLE_NUM_HWIFS 1 | 58 | #define GAYLE_NUM_HWIFS 1 |
57 | #define GAYLE_NUM_PROBE_HWIFS GAYLE_NUM_HWIFS | 59 | #define GAYLE_NUM_PROBE_HWIFS GAYLE_NUM_HWIFS |
58 | #define GAYLE_HAS_CONTROL_REG 1 | 60 | #define GAYLE_HAS_CONTROL_REG 1 |
59 | #define GAYLE_IDEREG_SIZE 0x2000 | ||
60 | #else /* CONFIG_BLK_DEV_IDEDOUBLER */ | 61 | #else /* CONFIG_BLK_DEV_IDEDOUBLER */ |
61 | #define GAYLE_NUM_HWIFS 2 | 62 | #define GAYLE_NUM_HWIFS 2 |
62 | #define GAYLE_NUM_PROBE_HWIFS (ide_doubler ? GAYLE_NUM_HWIFS : \ | 63 | #define GAYLE_NUM_PROBE_HWIFS (ide_doubler ? GAYLE_NUM_HWIFS : \ |
63 | GAYLE_NUM_HWIFS-1) | 64 | GAYLE_NUM_HWIFS-1) |
64 | #define GAYLE_HAS_CONTROL_REG (!ide_doubler) | 65 | #define GAYLE_HAS_CONTROL_REG (!ide_doubler) |
65 | #define GAYLE_IDEREG_SIZE (ide_doubler ? 0x1000 : 0x2000) | ||
66 | 66 | ||
67 | static int ide_doubler; | 67 | static int ide_doubler; |
68 | module_param_named(doubler, ide_doubler, bool, 0); | 68 | module_param_named(doubler, ide_doubler, bool, 0); |
@@ -124,8 +124,11 @@ static void __init gayle_setup_ports(hw_regs_t *hw, unsigned long base, | |||
124 | 124 | ||
125 | static int __init gayle_init(void) | 125 | static int __init gayle_init(void) |
126 | { | 126 | { |
127 | unsigned long phys_base, res_start, res_n; | ||
128 | unsigned long base, ctrlport, irqport; | ||
129 | ide_ack_intr_t *ack_intr; | ||
127 | int a4000, i; | 130 | int a4000, i; |
128 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; | 131 | hw_regs_t hw[GAYLE_NUM_HWIFS], *hws[] = { NULL, NULL, NULL, NULL }; |
129 | 132 | ||
130 | if (!MACH_IS_AMIGA) | 133 | if (!MACH_IS_AMIGA) |
131 | return -ENODEV; | 134 | return -ENODEV; |
@@ -148,13 +151,6 @@ found: | |||
148 | #endif | 151 | #endif |
149 | ""); | 152 | ""); |
150 | 153 | ||
151 | for (i = 0; i < GAYLE_NUM_PROBE_HWIFS; i++) { | ||
152 | unsigned long base, ctrlport, irqport; | ||
153 | ide_ack_intr_t *ack_intr; | ||
154 | hw_regs_t hw; | ||
155 | ide_hwif_t *hwif; | ||
156 | unsigned long phys_base, res_start, res_n; | ||
157 | |||
158 | if (a4000) { | 154 | if (a4000) { |
159 | phys_base = GAYLE_BASE_4000; | 155 | phys_base = GAYLE_BASE_4000; |
160 | irqport = (unsigned long)ZTWO_VADDR(GAYLE_IRQ_4000); | 156 | irqport = (unsigned long)ZTWO_VADDR(GAYLE_IRQ_4000); |
@@ -168,33 +164,22 @@ found: | |||
168 | * FIXME: we now have selectable modes between mmio v/s iomio | 164 | * FIXME: we now have selectable modes between mmio v/s iomio |
169 | */ | 165 | */ |
170 | 166 | ||
171 | phys_base += i*GAYLE_NEXT_PORT; | ||
172 | |||
173 | res_start = ((unsigned long)phys_base) & ~(GAYLE_NEXT_PORT-1); | 167 | res_start = ((unsigned long)phys_base) & ~(GAYLE_NEXT_PORT-1); |
174 | res_n = GAYLE_IDEREG_SIZE; | 168 | res_n = GAYLE_IDEREG_SIZE; |
175 | 169 | ||
176 | if (!request_mem_region(res_start, res_n, "IDE")) | 170 | if (!request_mem_region(res_start, res_n, "IDE")) |
177 | continue; | 171 | return -EBUSY; |
178 | 172 | ||
179 | base = (unsigned long)ZTWO_VADDR(phys_base); | 173 | for (i = 0; i < GAYLE_NUM_PROBE_HWIFS; i++) { |
174 | base = (unsigned long)ZTWO_VADDR(phys_base + i * GAYLE_NEXT_PORT); | ||
180 | ctrlport = GAYLE_HAS_CONTROL_REG ? (base + GAYLE_CONTROL) : 0; | 175 | ctrlport = GAYLE_HAS_CONTROL_REG ? (base + GAYLE_CONTROL) : 0; |
181 | 176 | ||
182 | gayle_setup_ports(&hw, base, ctrlport, irqport, ack_intr); | 177 | gayle_setup_ports(&hw[i], base, ctrlport, irqport, ack_intr); |
183 | |||
184 | hwif = ide_find_port(); | ||
185 | if (hwif) { | ||
186 | u8 index = hwif->index; | ||
187 | 178 | ||
188 | ide_init_port_hw(hwif, &hw); | 179 | hws[i] = &hw[i]; |
189 | |||
190 | idx[i] = index; | ||
191 | } else | ||
192 | release_mem_region(res_start, res_n); | ||
193 | } | 180 | } |
194 | 181 | ||
195 | ide_device_add(idx, NULL); | 182 | return ide_host_add(NULL, hws, NULL); |
196 | |||
197 | return 0; | ||
198 | } | 183 | } |
199 | 184 | ||
200 | module_init(gayle_init); | 185 | module_init(gayle_init); |