diff options
-rw-r--r-- | drivers/ide/legacy/qd65xx.c | 37 |
1 files changed, 10 insertions, 27 deletions
diff --git a/drivers/ide/legacy/qd65xx.c b/drivers/ide/legacy/qd65xx.c index b693a5f21a42..ad4ec2c42a5a 100644 --- a/drivers/ide/legacy/qd65xx.c +++ b/drivers/ide/legacy/qd65xx.c | |||
@@ -88,12 +88,12 @@ | |||
88 | static int timings[4]={-1,-1,-1,-1}; /* stores current timing for each timer */ | 88 | static int timings[4]={-1,-1,-1,-1}; /* stores current timing for each timer */ |
89 | 89 | ||
90 | /* | 90 | /* |
91 | * qd_select: | 91 | * qd65xx_select: |
92 | * | 92 | * |
93 | * This routine is invoked from ide.c to prepare for access to a given drive. | 93 | * This routine is invoked to prepare for access to a given drive. |
94 | */ | 94 | */ |
95 | 95 | ||
96 | static void qd_select (ide_drive_t *drive) | 96 | static void qd65xx_select(ide_drive_t *drive) |
97 | { | 97 | { |
98 | u8 index = (( (QD_TIMREG(drive)) & 0x80 ) >> 7) | | 98 | u8 index = (( (QD_TIMREG(drive)) & 0x80 ) >> 7) | |
99 | (QD_TIMREG(drive) & 0x02); | 99 | (QD_TIMREG(drive) & 0x02); |
@@ -168,36 +168,15 @@ static int qd_find_disk_type (ide_drive_t *drive, | |||
168 | } | 168 | } |
169 | 169 | ||
170 | /* | 170 | /* |
171 | * qd_timing_ok: | ||
172 | * | ||
173 | * check whether timings don't conflict | ||
174 | */ | ||
175 | |||
176 | static int qd_timing_ok (ide_drive_t drives[]) | ||
177 | { | ||
178 | return (IDE_IMPLY(drives[0].present && drives[1].present, | ||
179 | IDE_IMPLY(QD_TIMREG(drives) == QD_TIMREG(drives+1), | ||
180 | QD_TIMING(drives) == QD_TIMING(drives+1)))); | ||
181 | /* if same timing register, must be same timing */ | ||
182 | } | ||
183 | |||
184 | /* | ||
185 | * qd_set_timing: | 171 | * qd_set_timing: |
186 | * | 172 | * |
187 | * records the timing, and enables selectproc as needed | 173 | * records the timing |
188 | */ | 174 | */ |
189 | 175 | ||
190 | static void qd_set_timing (ide_drive_t *drive, u8 timing) | 176 | static void qd_set_timing (ide_drive_t *drive, u8 timing) |
191 | { | 177 | { |
192 | ide_hwif_t *hwif = HWIF(drive); | ||
193 | |||
194 | drive->drive_data &= 0xff00; | 178 | drive->drive_data &= 0xff00; |
195 | drive->drive_data |= timing; | 179 | drive->drive_data |= timing; |
196 | if (qd_timing_ok(hwif->drives)) { | ||
197 | qd_select(drive); /* selects once */ | ||
198 | hwif->selectproc = NULL; | ||
199 | } else | ||
200 | hwif->selectproc = &qd_select; | ||
201 | 180 | ||
202 | printk(KERN_DEBUG "%s: %#x\n", drive->name, timing); | 181 | printk(KERN_DEBUG "%s: %#x\n", drive->name, timing); |
203 | } | 182 | } |
@@ -400,7 +379,8 @@ static int __init qd_probe(int base) | |||
400 | qd_setup(hwif, base, config); | 379 | qd_setup(hwif, base, config); |
401 | 380 | ||
402 | hwif->port_init_devs = qd6500_port_init_devs; | 381 | hwif->port_init_devs = qd6500_port_init_devs; |
403 | hwif->set_pio_mode = &qd6500_set_pio_mode; | 382 | hwif->set_pio_mode = qd6500_set_pio_mode; |
383 | hwif->selectproc = qd65xx_select; | ||
404 | 384 | ||
405 | idx[unit] = hwif->index; | 385 | idx[unit] = hwif->index; |
406 | 386 | ||
@@ -441,7 +421,8 @@ static int __init qd_probe(int base) | |||
441 | qd_setup(hwif, base, config | (control << 8)); | 421 | qd_setup(hwif, base, config | (control << 8)); |
442 | 422 | ||
443 | hwif->port_init_devs = qd6580_port_init_devs; | 423 | hwif->port_init_devs = qd6580_port_init_devs; |
444 | hwif->set_pio_mode = &qd6580_set_pio_mode; | 424 | hwif->set_pio_mode = qd6580_set_pio_mode; |
425 | hwif->selectproc = qd65xx_select; | ||
445 | 426 | ||
446 | idx[unit] = hwif->index; | 427 | idx[unit] = hwif->index; |
447 | 428 | ||
@@ -460,6 +441,7 @@ static int __init qd_probe(int base) | |||
460 | qd_setup(hwif, base, config | (control << 8)); | 441 | qd_setup(hwif, base, config | (control << 8)); |
461 | hwif->port_init_devs = qd6580_port_init_devs; | 442 | hwif->port_init_devs = qd6580_port_init_devs; |
462 | hwif->set_pio_mode = qd6580_set_pio_mode; | 443 | hwif->set_pio_mode = qd6580_set_pio_mode; |
444 | hwif->selectproc = qd65xx_select; | ||
463 | idx[0] = hwif->index; | 445 | idx[0] = hwif->index; |
464 | } | 446 | } |
465 | 447 | ||
@@ -469,6 +451,7 @@ static int __init qd_probe(int base) | |||
469 | qd_setup(mate, base, config | (control << 8)); | 451 | qd_setup(mate, base, config | (control << 8)); |
470 | mate->port_init_devs = qd6580_port_init_devs; | 452 | mate->port_init_devs = qd6580_port_init_devs; |
471 | mate->set_pio_mode = qd6580_set_pio_mode; | 453 | mate->set_pio_mode = qd6580_set_pio_mode; |
454 | mate->selectproc = qd65xx_select; | ||
472 | idx[1] = mate->index; | 455 | idx[1] = mate->index; |
473 | } | 456 | } |
474 | 457 | ||