aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ide/legacy/umc8672.c58
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
62static u8 current_speeds[4] = {UMC_DRIVE0, UMC_DRIVE1, UMC_DRIVE2, UMC_DRIVE3}; 62static u8 current_speeds[4] = {UMC_DRIVE0, UMC_DRIVE1, UMC_DRIVE2, UMC_DRIVE3};
63static const u8 pio_to_umc [5] = {0,3,7,10,11}; /* rough guesses */ 63static 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 */
66static const u8 speedtab [3][12] = { 66static 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
71static void out_umc (char port,char wert) 72static 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
77static inline u8 in_umc (char port) 78static 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
83static void umc_set_speeds (u8 speeds[]) 84static 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
180int probe_umc8672 = 0; 180int probe_umc8672;
181 181
182module_param_named(probe, probe_umc8672, bool, 0); 182module_param_named(probe, probe_umc8672, bool, 0);
183MODULE_PARM_DESC(probe, "probe for UMC8672 chipset"); 183MODULE_PARM_DESC(probe, "probe for UMC8672 chipset");