diff options
Diffstat (limited to 'drivers/ide/legacy/ht6560b.c')
-rw-r--r-- | drivers/ide/legacy/ht6560b.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/drivers/ide/legacy/ht6560b.c b/drivers/ide/legacy/ht6560b.c index 78ca68e60f97..88fe9070c9c3 100644 --- a/drivers/ide/legacy/ht6560b.c +++ b/drivers/ide/legacy/ht6560b.c | |||
@@ -82,7 +82,7 @@ | |||
82 | * out how they setup those cycle time interfacing values, as they at Holtek | 82 | * out how they setup those cycle time interfacing values, as they at Holtek |
83 | * call them. IDESETUP.COM that is supplied with the drivers figures out | 83 | * call them. IDESETUP.COM that is supplied with the drivers figures out |
84 | * optimal values and fetches those values to drivers. I found out that | 84 | * optimal values and fetches those values to drivers. I found out that |
85 | * they use IDE_SELECT_REG to fetch timings to the ide board right after | 85 | * they use Select register to fetch timings to the ide board right after |
86 | * interface switching. After that it was quite easy to add code to | 86 | * interface switching. After that it was quite easy to add code to |
87 | * ht6560b.c. | 87 | * ht6560b.c. |
88 | * | 88 | * |
@@ -127,6 +127,7 @@ | |||
127 | */ | 127 | */ |
128 | static void ht6560b_selectproc (ide_drive_t *drive) | 128 | static void ht6560b_selectproc (ide_drive_t *drive) |
129 | { | 129 | { |
130 | ide_hwif_t *hwif = drive->hwif; | ||
130 | unsigned long flags; | 131 | unsigned long flags; |
131 | static u8 current_select = 0; | 132 | static u8 current_select = 0; |
132 | static u8 current_timing = 0; | 133 | static u8 current_timing = 0; |
@@ -155,8 +156,8 @@ static void ht6560b_selectproc (ide_drive_t *drive) | |||
155 | /* | 156 | /* |
156 | * Set timing for this drive: | 157 | * Set timing for this drive: |
157 | */ | 158 | */ |
158 | outb(timing, IDE_SELECT_REG); | 159 | outb(timing, hwif->io_ports[IDE_SELECT_OFFSET]); |
159 | (void)inb(IDE_STATUS_REG); | 160 | (void)inb(hwif->io_ports[IDE_STATUS_OFFSET]); |
160 | #ifdef DEBUG | 161 | #ifdef DEBUG |
161 | printk("ht6560b: %s: select=%#x timing=%#x\n", | 162 | printk("ht6560b: %s: select=%#x timing=%#x\n", |
162 | drive->name, select, timing); | 163 | drive->name, select, timing); |
@@ -193,9 +194,9 @@ static int __init try_to_init_ht6560b(void) | |||
193 | * Ht6560b autodetected | 194 | * Ht6560b autodetected |
194 | */ | 195 | */ |
195 | outb(HT_CONFIG_DEFAULT, HT_CONFIG_PORT); | 196 | outb(HT_CONFIG_DEFAULT, HT_CONFIG_PORT); |
196 | outb(HT_TIMING_DEFAULT, 0x1f6); /* IDE_SELECT_REG */ | 197 | outb(HT_TIMING_DEFAULT, 0x1f6); /* Select register */ |
197 | (void) inb(0x1f7); /* IDE_STATUS_REG */ | 198 | (void)inb(0x1f7); /* Status register */ |
198 | 199 | ||
199 | printk("ht6560b " HT6560B_VERSION | 200 | printk("ht6560b " HT6560B_VERSION |
200 | ": chipset detected and initialized" | 201 | ": chipset detected and initialized" |
201 | #ifdef DEBUG | 202 | #ifdef DEBUG |
@@ -339,6 +340,7 @@ static int __init ht6560b_init(void) | |||
339 | { | 340 | { |
340 | ide_hwif_t *hwif, *mate; | 341 | ide_hwif_t *hwif, *mate; |
341 | static u8 idx[4] = { 0, 1, 0xff, 0xff }; | 342 | static u8 idx[4] = { 0, 1, 0xff, 0xff }; |
343 | hw_regs_t hw[2]; | ||
342 | 344 | ||
343 | if (probe_ht6560b == 0) | 345 | if (probe_ht6560b == 0) |
344 | return -ENODEV; | 346 | return -ENODEV; |
@@ -357,6 +359,17 @@ static int __init ht6560b_init(void) | |||
357 | goto release_region; | 359 | goto release_region; |
358 | } | 360 | } |
359 | 361 | ||
362 | memset(&hw, 0, sizeof(hw)); | ||
363 | |||
364 | ide_std_init_ports(&hw[0], 0x1f0, 0x3f6); | ||
365 | hw[0].irq = 14; | ||
366 | |||
367 | ide_std_init_ports(&hw[1], 0x170, 0x376); | ||
368 | hw[1].irq = 15; | ||
369 | |||
370 | ide_init_port_hw(hwif, &hw[0]); | ||
371 | ide_init_port_hw(mate, &hw[1]); | ||
372 | |||
360 | hwif->selectproc = &ht6560b_selectproc; | 373 | hwif->selectproc = &ht6560b_selectproc; |
361 | hwif->set_pio_mode = &ht6560b_set_pio_mode; | 374 | hwif->set_pio_mode = &ht6560b_set_pio_mode; |
362 | 375 | ||