diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-07-23 13:55:56 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-07-23 13:55:56 -0400 |
commit | 73dc532bc1eebe3bff6b918c5685a219eae27f97 (patch) | |
tree | c29d45ab4299250d990e0d5c31b72ef6cac12882 /drivers/ide/legacy | |
parent | 3b2a5c7149ee4af4aff8fee953f66fc846d92cea (diff) |
gayle: reserve memory resources at once
* Reserve memory resources for all IDE ports at once by moving
request_mem_region() out of 'for ()' loop and always defining
GAYLE_IDEREG_SIZE to 0x2000.
* Keep memory resources even if no free IDE slots can be found
(this driver is unloadable currently).
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/legacy')
-rw-r--r-- | drivers/ide/legacy/gayle.c | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/drivers/ide/legacy/gayle.c b/drivers/ide/legacy/gayle.c index e45c7341186c..7baeefa870fa 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,6 +124,9 @@ 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 | hw_regs_t hw[GAYLE_NUM_HWIFS], *hws[] = { NULL, NULL, NULL, NULL }; | 131 | hw_regs_t hw[GAYLE_NUM_HWIFS], *hws[] = { NULL, NULL, NULL, NULL }; |
129 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; | 132 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; |
@@ -149,12 +152,6 @@ found: | |||
149 | #endif | 152 | #endif |
150 | ""); | 153 | ""); |
151 | 154 | ||
152 | for (i = 0; i < GAYLE_NUM_PROBE_HWIFS; i++) { | ||
153 | unsigned long base, ctrlport, irqport; | ||
154 | ide_ack_intr_t *ack_intr; | ||
155 | ide_hwif_t *hwif; | ||
156 | unsigned long phys_base, res_start, res_n; | ||
157 | |||
158 | if (a4000) { | 155 | if (a4000) { |
159 | phys_base = GAYLE_BASE_4000; | 156 | phys_base = GAYLE_BASE_4000; |
160 | irqport = (unsigned long)ZTWO_VADDR(GAYLE_IRQ_4000); | 157 | irqport = (unsigned long)ZTWO_VADDR(GAYLE_IRQ_4000); |
@@ -168,15 +165,16 @@ found: | |||
168 | * FIXME: we now have selectable modes between mmio v/s iomio | 165 | * FIXME: we now have selectable modes between mmio v/s iomio |
169 | */ | 166 | */ |
170 | 167 | ||
171 | phys_base += i*GAYLE_NEXT_PORT; | ||
172 | |||
173 | res_start = ((unsigned long)phys_base) & ~(GAYLE_NEXT_PORT-1); | 168 | res_start = ((unsigned long)phys_base) & ~(GAYLE_NEXT_PORT-1); |
174 | res_n = GAYLE_IDEREG_SIZE; | 169 | res_n = GAYLE_IDEREG_SIZE; |
175 | 170 | ||
176 | if (!request_mem_region(res_start, res_n, "IDE")) | 171 | if (!request_mem_region(res_start, res_n, "IDE")) |
177 | continue; | 172 | return -EBUSY; |
178 | 173 | ||
179 | base = (unsigned long)ZTWO_VADDR(phys_base); | 174 | for (i = 0; i < GAYLE_NUM_PROBE_HWIFS; i++) { |
175 | ide_hwif_t *hwif; | ||
176 | |||
177 | base = (unsigned long)ZTWO_VADDR(phys_base + i * GAYLE_NEXT_PORT); | ||
180 | ctrlport = GAYLE_HAS_CONTROL_REG ? (base + GAYLE_CONTROL) : 0; | 178 | ctrlport = GAYLE_HAS_CONTROL_REG ? (base + GAYLE_CONTROL) : 0; |
181 | 179 | ||
182 | gayle_setup_ports(&hw[i], base, ctrlport, irqport, ack_intr); | 180 | gayle_setup_ports(&hw[i], base, ctrlport, irqport, ack_intr); |
@@ -187,8 +185,7 @@ found: | |||
187 | 185 | ||
188 | hws[i] = &hw[i]; | 186 | hws[i] = &hw[i]; |
189 | idx[i] = hwif->index; | 187 | idx[i] = hwif->index; |
190 | } else | 188 | } |
191 | release_mem_region(res_start, res_n); | ||
192 | } | 189 | } |
193 | 190 | ||
194 | ide_device_add(idx, NULL, hws); | 191 | ide_device_add(idx, NULL, hws); |