This source file includes following definitions.
- out_umc
- in_umc
- umc_set_speeds
- tune_umc
- init_umc8672
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 #undef REALLY_SLOW_IO
39
40 #include <linux/types.h>
41 #include <linux/kernel.h>
42 #include <linux/delay.h>
43 #include <linux/timer.h>
44 #include <linux/mm.h>
45 #include <linux/ioport.h>
46 #include <linux/blkdev.h>
47 #include <linux/hdreg.h>
48 #include <asm/io.h>
49 #include "ide.h"
50 #include "ide_modes.h"
51
52
53
54
55 #define UMC_DRIVE0 1
56 #define UMC_DRIVE1 1
57 #define UMC_DRIVE2 1
58 #define UMC_DRIVE3 1
59
60 static byte current_speeds[4] = {UMC_DRIVE0, UMC_DRIVE1, UMC_DRIVE2, UMC_DRIVE3};
61 static const byte pio_to_umc [5] = {0,3,7,10,11};
62
63
64 static const byte speedtab [3][12] = {
65 {0xf, 0xb, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1 },
66 {0x3, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1 },
67 {0xff,0xcb,0xc0,0x58,0x36,0x33,0x23,0x22,0x21,0x11,0x10,0x0}};
68
69 static void out_umc (char port,char wert)
70 {
71 outb_p (port,0x108);
72 outb_p (wert,0x109);
73 }
74
75 static byte in_umc (char port)
76 {
77 outb_p (port,0x108);
78 return inb_p (0x109);
79 }
80
81 static void umc_set_speeds (byte speeds[])
82 {
83 int i, tmp;
84 unsigned long flags;
85
86 save_flags(flags);
87 cli ();
88 outb_p (0x5A,0x108);
89
90 out_umc (0xd7,(speedtab[0][speeds[2]] | (speedtab[0][speeds[3]]<<4)));
91 out_umc (0xd6,(speedtab[0][speeds[0]] | (speedtab[0][speeds[1]]<<4)));
92 tmp = 0;
93 for (i = 3; i >= 0; i--)
94 {
95 tmp = (tmp << 2) | speedtab[1][speeds[i]];
96 }
97 out_umc (0xdc,tmp);
98 for (i = 0;i < 4; i++)
99 {
100 out_umc (0xd0+i,speedtab[2][speeds[i]]);
101 out_umc (0xd8+i,speedtab[2][speeds[i]]);
102 }
103 outb_p (0xa5,0x108);
104 restore_flags(flags);
105
106 printk ("umc8672: drive speeds [0 to 11]: %d %d %d %d\n",
107 speeds[0], speeds[1], speeds[2], speeds[3]);
108 }
109
110 static void tune_umc (ide_drive_t *drive, byte pio)
111 {
112 if (pio == 255)
113 pio = ide_get_best_pio_mode(drive);
114 if (pio > 4)
115 pio = 4;
116
117 current_speeds[drive->name[2] - 'a'] = pio_to_umc[pio];
118 umc_set_speeds (current_speeds);
119 }
120
121 void init_umc8672 (void)
122 {
123 unsigned long flags;
124
125 if (check_region(0x108, 2)) {
126 printk("\numc8672: PORTS 0x108-0x109 ALREADY IN USE\n");
127 return;
128 }
129 save_flags(flags);
130 cli ();
131 outb_p (0x5A,0x108);
132 if (in_umc (0xd5) != 0xa0)
133 {
134 sti ();
135 printk ("umc8672: not found\n");
136 return;
137 }
138 outb_p (0xa5,0x108);
139 restore_flags(flags);
140
141 umc_set_speeds (current_speeds);
142
143 request_region(0x108, 2, "umc8672");
144 ide_hwifs[0].chipset = ide_umc8672;
145 ide_hwifs[1].chipset = ide_umc8672;
146 ide_hwifs[0].tuneproc = &tune_umc;
147 ide_hwifs[1].tuneproc = &tune_umc;
148
149 }