1 /*
2 * linux/drivers/block/qd6580.c Version 0.02 Feb 09, 1996
3 *
4 * Copyright (C) 1996 Linus Torvalds & author (see below)
5 */
6
7 /*
8 * QDI QD6580 EIDE controller fast support by Colten Edwards.
9 * No net access, but (maybe) can be reached at pje120@cs.usask.ca
10 */
11
12 #undef REALLY_SLOW_IO /* most systems can safely undef this */
13
14 #include <linux/types.h>
15 #include <linux/kernel.h>
16 #include <linux/delay.h>
17 #include <linux/timer.h>
18 #include <linux/mm.h>
19 #include <linux/ioport.h>
20 #include <linux/blkdev.h>
21 #include <linux/hdreg.h>
22 #include <asm/io.h>
23 #include "ide.h"
24 #include "ide_modes.h"
25
26 /*
27 * Register 0xb3 looks like:
28 * 0x4f is fast mode3 ?
29 * 0x3f is medium mode2 ?
30 * 0x2f is slower mode1 ?
31 * 0x1f is slower yet mode0 ?
32 * 0x0f ??? ???
33 *
34 * Don't know whether this sets BOTH drives, or just the first drive.
35 * Don't know if there is a separate setting for the second drive.
36 *
37 * Feel free to patch this if you have one of these beasts
38 * and can work out the answers!
39 *
40 * I/O ports are 0xb0 0xb2 and 0xb3
41 */
42
43 static void tune_qd6580 (ide_drive_t *drive, byte pio)
/* ![[previous]](../icons/n_left.png)
![[next]](../icons/right.png)
![[first]](../icons/n_first.png)
![[last]](../icons/last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
44 {
45 unsigned long flags;
46
47 if (pio == 255)
48 pio = ide_get_best_pio_mode (drive);
49 if (pio > 3)
50 pio = 3;
51
52 save_flags(flags);
53 cli();
54 outb_p(0x8d,0xb0);
55 outb_p(0x0 ,0xb2);
56 outb_p(((pio+1)<<4)|0x0f,0xb3);
57 inb(0x3f6);
58 restore_flags(flags);
59 }
60
61 void init_qd6580 (void)
/* ![[previous]](../icons/left.png)
![[next]](../icons/n_right.png)
![[first]](../icons/first.png)
![[last]](../icons/n_last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
62 {
63 ide_hwifs[0].chipset = ide_qd6580;
64 ide_hwifs[0].tuneproc = &tune_qd6580;
65 }