diff options
Diffstat (limited to 'drivers/ide/legacy/umc8672.c')
-rw-r--r-- | drivers/ide/legacy/umc8672.c | 58 |
1 files changed, 29 insertions, 29 deletions
diff --git a/drivers/ide/legacy/umc8672.c b/drivers/ide/legacy/umc8672.c index 43ee632a6dae..4d90badd2bda 100644 --- a/drivers/ide/legacy/umc8672.c +++ b/drivers/ide/legacy/umc8672.c | |||
@@ -19,7 +19,7 @@ | |||
19 | */ | 19 | */ |
20 | 20 | ||
21 | /* | 21 | /* |
22 | * VLB Controller Support from | 22 | * VLB Controller Support from |
23 | * Wolfram Podien | 23 | * Wolfram Podien |
24 | * Rohoefe 3 | 24 | * Rohoefe 3 |
25 | * D28832 Achim | 25 | * D28832 Achim |
@@ -32,7 +32,7 @@ | |||
32 | * #define UMC_DRIVE0 11 | 32 | * #define UMC_DRIVE0 11 |
33 | * in the beginning of the driver, which sets the speed of drive 0 to 11 (there | 33 | * in the beginning of the driver, which sets the speed of drive 0 to 11 (there |
34 | * are some lines present). 0 - 11 are allowed speed values. These values are | 34 | * are some lines present). 0 - 11 are allowed speed values. These values are |
35 | * the results from the DOS speed test program supplied from UMC. 11 is the | 35 | * the results from the DOS speed test program supplied from UMC. 11 is the |
36 | * highest speed (about PIO mode 3) | 36 | * highest speed (about PIO mode 3) |
37 | */ | 37 | */ |
38 | #define REALLY_SLOW_IO /* some systems can safely undef this */ | 38 | #define REALLY_SLOW_IO /* some systems can safely undef this */ |
@@ -60,46 +60,46 @@ | |||
60 | #define UMC_DRIVE3 1 /* In case of crash reduce speed */ | 60 | #define UMC_DRIVE3 1 /* In case of crash reduce speed */ |
61 | 61 | ||
62 | static u8 current_speeds[4] = {UMC_DRIVE0, UMC_DRIVE1, UMC_DRIVE2, UMC_DRIVE3}; | 62 | static u8 current_speeds[4] = {UMC_DRIVE0, UMC_DRIVE1, UMC_DRIVE2, UMC_DRIVE3}; |
63 | static const u8 pio_to_umc [5] = {0,3,7,10,11}; /* rough guesses */ | 63 | static const u8 pio_to_umc [5] = {0, 3, 7, 10, 11}; /* rough guesses */ |
64 | 64 | ||
65 | /* 0 1 2 3 4 5 6 7 8 9 10 11 */ | 65 | /* 0 1 2 3 4 5 6 7 8 9 10 11 */ |
66 | static const u8 speedtab [3][12] = { | 66 | static const u8 speedtab [3][12] = { |
67 | {0xf, 0xb, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1 }, | 67 | {0x0f, 0x0b, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1}, |
68 | {0x3, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1 }, | 68 | {0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1}, |
69 | {0xff,0xcb,0xc0,0x58,0x36,0x33,0x23,0x22,0x21,0x11,0x10,0x0}}; | 69 | {0xff, 0xcb, 0xc0, 0x58, 0x36, 0x33, 0x23, 0x22, 0x21, 0x11, 0x10, 0x0} |
70 | }; | ||
70 | 71 | ||
71 | static void out_umc (char port,char wert) | 72 | static void out_umc(char port, char wert) |
72 | { | 73 | { |
73 | outb_p(port,0x108); | 74 | outb_p(port, 0x108); |
74 | outb_p(wert,0x109); | 75 | outb_p(wert, 0x109); |
75 | } | 76 | } |
76 | 77 | ||
77 | static inline u8 in_umc (char port) | 78 | static inline u8 in_umc(char port) |
78 | { | 79 | { |
79 | outb_p(port,0x108); | 80 | outb_p(port, 0x108); |
80 | return inb_p(0x109); | 81 | return inb_p(0x109); |
81 | } | 82 | } |
82 | 83 | ||
83 | static void umc_set_speeds (u8 speeds[]) | 84 | static void umc_set_speeds(u8 speeds[]) |
84 | { | 85 | { |
85 | int i, tmp; | 86 | int i, tmp; |
86 | 87 | ||
87 | outb_p(0x5A,0x108); /* enable umc */ | 88 | outb_p(0x5A, 0x108); /* enable umc */ |
88 | 89 | ||
89 | out_umc (0xd7,(speedtab[0][speeds[2]] | (speedtab[0][speeds[3]]<<4))); | 90 | out_umc(0xd7, (speedtab[0][speeds[2]] | (speedtab[0][speeds[3]]<<4))); |
90 | out_umc (0xd6,(speedtab[0][speeds[0]] | (speedtab[0][speeds[1]]<<4))); | 91 | out_umc(0xd6, (speedtab[0][speeds[0]] | (speedtab[0][speeds[1]]<<4))); |
91 | tmp = 0; | 92 | tmp = 0; |
92 | for (i = 3; i >= 0; i--) { | 93 | for (i = 3; i >= 0; i--) |
93 | tmp = (tmp << 2) | speedtab[1][speeds[i]]; | 94 | tmp = (tmp << 2) | speedtab[1][speeds[i]]; |
95 | out_umc(0xdc, tmp); | ||
96 | for (i = 0; i < 4; i++) { | ||
97 | out_umc(0xd0 + i, speedtab[2][speeds[i]]); | ||
98 | out_umc(0xd8 + i, speedtab[2][speeds[i]]); | ||
94 | } | 99 | } |
95 | out_umc (0xdc,tmp); | 100 | outb_p(0xa5, 0x108); /* disable umc */ |
96 | for (i = 0;i < 4; i++) { | ||
97 | out_umc (0xd0+i,speedtab[2][speeds[i]]); | ||
98 | out_umc (0xd8+i,speedtab[2][speeds[i]]); | ||
99 | } | ||
100 | outb_p(0xa5,0x108); /* disable umc */ | ||
101 | 101 | ||
102 | printk ("umc8672: drive speeds [0 to 11]: %d %d %d %d\n", | 102 | printk("umc8672: drive speeds [0 to 11]: %d %d %d %d\n", |
103 | speeds[0], speeds[1], speeds[2], speeds[3]); | 103 | speeds[0], speeds[1], speeds[2], speeds[3]); |
104 | } | 104 | } |
105 | 105 | ||
@@ -115,7 +115,7 @@ static void umc_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
115 | printk(KERN_ERR "umc8672: other interface is busy: exiting tune_umc()\n"); | 115 | printk(KERN_ERR "umc8672: other interface is busy: exiting tune_umc()\n"); |
116 | } else { | 116 | } else { |
117 | current_speeds[drive->name[2] - 'a'] = pio_to_umc[pio]; | 117 | current_speeds[drive->name[2] - 'a'] = pio_to_umc[pio]; |
118 | umc_set_speeds (current_speeds); | 118 | umc_set_speeds(current_speeds); |
119 | } | 119 | } |
120 | spin_unlock_irqrestore(&ide_lock, flags); | 120 | spin_unlock_irqrestore(&ide_lock, flags); |
121 | } | 121 | } |
@@ -138,16 +138,16 @@ static int __init umc8672_probe(void) | |||
138 | return 1; | 138 | return 1; |
139 | } | 139 | } |
140 | local_irq_save(flags); | 140 | local_irq_save(flags); |
141 | outb_p(0x5A,0x108); /* enable umc */ | 141 | outb_p(0x5A, 0x108); /* enable umc */ |
142 | if (in_umc (0xd5) != 0xa0) { | 142 | if (in_umc (0xd5) != 0xa0) { |
143 | local_irq_restore(flags); | 143 | local_irq_restore(flags); |
144 | printk(KERN_ERR "umc8672: not found\n"); | 144 | printk(KERN_ERR "umc8672: not found\n"); |
145 | release_region(0x108, 2); | 145 | release_region(0x108, 2); |
146 | return 1; | 146 | return 1; |
147 | } | 147 | } |
148 | outb_p(0xa5,0x108); /* disable umc */ | 148 | outb_p(0xa5, 0x108); /* disable umc */ |
149 | 149 | ||
150 | umc_set_speeds (current_speeds); | 150 | umc_set_speeds(current_speeds); |
151 | local_irq_restore(flags); | 151 | local_irq_restore(flags); |
152 | 152 | ||
153 | memset(&hw, 0, sizeof(hw)); | 153 | memset(&hw, 0, sizeof(hw)); |
@@ -177,7 +177,7 @@ static int __init umc8672_probe(void) | |||
177 | return 0; | 177 | return 0; |
178 | } | 178 | } |
179 | 179 | ||
180 | int probe_umc8672 = 0; | 180 | int probe_umc8672; |
181 | 181 | ||
182 | module_param_named(probe, probe_umc8672, bool, 0); | 182 | module_param_named(probe, probe_umc8672, bool, 0); |
183 | MODULE_PARM_DESC(probe, "probe for UMC8672 chipset"); | 183 | MODULE_PARM_DESC(probe, "probe for UMC8672 chipset"); |