diff options
Diffstat (limited to 'drivers/ide/pci/opti621.c')
-rw-r--r-- | drivers/ide/pci/opti621.c | 63 |
1 files changed, 32 insertions, 31 deletions
diff --git a/drivers/ide/pci/opti621.c b/drivers/ide/pci/opti621.c index 22bbf613f948..9ca60dd2185e 100644 --- a/drivers/ide/pci/opti621.c +++ b/drivers/ide/pci/opti621.c | |||
@@ -176,34 +176,35 @@ static int cmpt_clk(int time, int bus_speed) | |||
176 | return ((time*bus_speed+999)/1000); | 176 | return ((time*bus_speed+999)/1000); |
177 | } | 177 | } |
178 | 178 | ||
179 | static void write_reg(ide_hwif_t *hwif, u8 value, int reg) | ||
180 | /* Write value to register reg, base of register | 179 | /* Write value to register reg, base of register |
181 | * is at reg_base (0x1f0 primary, 0x170 secondary, | 180 | * is at reg_base (0x1f0 primary, 0x170 secondary, |
182 | * if not changed by PCI configuration). | 181 | * if not changed by PCI configuration). |
183 | * This is from setupvic.exe program. | 182 | * This is from setupvic.exe program. |
184 | */ | 183 | */ |
184 | static void write_reg(u8 value, int reg) | ||
185 | { | 185 | { |
186 | hwif->INW(reg_base+1); | 186 | inw(reg_base + 1); |
187 | hwif->INW(reg_base+1); | 187 | inw(reg_base + 1); |
188 | hwif->OUTB(3, reg_base+2); | 188 | outb(3, reg_base + 2); |
189 | hwif->OUTB(value, reg_base+reg); | 189 | outb(value, reg_base + reg); |
190 | hwif->OUTB(0x83, reg_base+2); | 190 | outb(0x83, reg_base + 2); |
191 | } | 191 | } |
192 | 192 | ||
193 | static u8 read_reg(ide_hwif_t *hwif, int reg) | ||
194 | /* Read value from register reg, base of register | 193 | /* Read value from register reg, base of register |
195 | * is at reg_base (0x1f0 primary, 0x170 secondary, | 194 | * is at reg_base (0x1f0 primary, 0x170 secondary, |
196 | * if not changed by PCI configuration). | 195 | * if not changed by PCI configuration). |
197 | * This is from setupvic.exe program. | 196 | * This is from setupvic.exe program. |
198 | */ | 197 | */ |
198 | static u8 read_reg(int reg) | ||
199 | { | 199 | { |
200 | u8 ret = 0; | 200 | u8 ret = 0; |
201 | 201 | ||
202 | hwif->INW(reg_base+1); | 202 | inw(reg_base + 1); |
203 | hwif->INW(reg_base+1); | 203 | inw(reg_base + 1); |
204 | hwif->OUTB(3, reg_base+2); | 204 | outb(3, reg_base + 2); |
205 | ret = hwif->INB(reg_base+reg); | 205 | ret = inb(reg_base + reg); |
206 | hwif->OUTB(0x83, reg_base+2); | 206 | outb(0x83, reg_base + 2); |
207 | |||
207 | return ret; | 208 | return ret; |
208 | } | 209 | } |
209 | 210 | ||
@@ -286,39 +287,39 @@ static void opti621_tune_drive (ide_drive_t *drive, u8 pio) | |||
286 | reg_base = hwif->io_ports[IDE_DATA_OFFSET]; | 287 | reg_base = hwif->io_ports[IDE_DATA_OFFSET]; |
287 | 288 | ||
288 | /* allow Register-B */ | 289 | /* allow Register-B */ |
289 | hwif->OUTB(0xc0, reg_base+CNTRL_REG); | 290 | outb(0xc0, reg_base + CNTRL_REG); |
290 | /* hmm, setupvic.exe does this ;-) */ | 291 | /* hmm, setupvic.exe does this ;-) */ |
291 | hwif->OUTB(0xff, reg_base+5); | 292 | outb(0xff, reg_base + 5); |
292 | /* if reads 0xff, adapter not exist? */ | 293 | /* if reads 0xff, adapter not exist? */ |
293 | (void) hwif->INB(reg_base+CNTRL_REG); | 294 | (void)inb(reg_base + CNTRL_REG); |
294 | /* if reads 0xc0, no interface exist? */ | 295 | /* if reads 0xc0, no interface exist? */ |
295 | read_reg(hwif, CNTRL_REG); | 296 | read_reg(CNTRL_REG); |
296 | /* read version, probably 0 */ | 297 | /* read version, probably 0 */ |
297 | read_reg(hwif, STRAP_REG); | 298 | read_reg(STRAP_REG); |
298 | 299 | ||
299 | /* program primary drive */ | 300 | /* program primary drive */ |
300 | /* select Index-0 for Register-A */ | 301 | /* select Index-0 for Register-A */ |
301 | write_reg(hwif, 0, MISC_REG); | 302 | write_reg(0, MISC_REG); |
302 | /* set read cycle timings */ | 303 | /* set read cycle timings */ |
303 | write_reg(hwif, cycle1, READ_REG); | 304 | write_reg(cycle1, READ_REG); |
304 | /* set write cycle timings */ | 305 | /* set write cycle timings */ |
305 | write_reg(hwif, cycle1, WRITE_REG); | 306 | write_reg(cycle1, WRITE_REG); |
306 | 307 | ||
307 | /* program secondary drive */ | 308 | /* program secondary drive */ |
308 | /* select Index-1 for Register-B */ | 309 | /* select Index-1 for Register-B */ |
309 | write_reg(hwif, 1, MISC_REG); | 310 | write_reg(1, MISC_REG); |
310 | /* set read cycle timings */ | 311 | /* set read cycle timings */ |
311 | write_reg(hwif, cycle2, READ_REG); | 312 | write_reg(cycle2, READ_REG); |
312 | /* set write cycle timings */ | 313 | /* set write cycle timings */ |
313 | write_reg(hwif, cycle2, WRITE_REG); | 314 | write_reg(cycle2, WRITE_REG); |
314 | 315 | ||
315 | /* use Register-A for drive 0 */ | 316 | /* use Register-A for drive 0 */ |
316 | /* use Register-B for drive 1 */ | 317 | /* use Register-B for drive 1 */ |
317 | write_reg(hwif, 0x85, CNTRL_REG); | 318 | write_reg(0x85, CNTRL_REG); |
318 | 319 | ||
319 | /* set address setup, DRDY timings, */ | 320 | /* set address setup, DRDY timings, */ |
320 | /* and read prefetch for both drives */ | 321 | /* and read prefetch for both drives */ |
321 | write_reg(hwif, misc, MISC_REG); | 322 | write_reg(misc, MISC_REG); |
322 | 323 | ||
323 | spin_unlock_irqrestore(&ide_lock, flags); | 324 | spin_unlock_irqrestore(&ide_lock, flags); |
324 | } | 325 | } |