diff options
Diffstat (limited to 'drivers/ide/legacy/umc8672.c')
| -rw-r--r-- | drivers/ide/legacy/umc8672.c | 81 | 
1 files changed, 45 insertions, 36 deletions
diff --git a/drivers/ide/legacy/umc8672.c b/drivers/ide/legacy/umc8672.c index bc1944811b9..4d90badd2bd 100644 --- a/drivers/ide/legacy/umc8672.c +++ b/drivers/ide/legacy/umc8672.c @@ -19,7 +19,7 @@   */  /* - * VLB Controller Support from  + * VLB Controller Support from   * Wolfram Podien   * Rohoefe 3   * D28832 Achim @@ -32,7 +32,7 @@   * #define UMC_DRIVE0 11   * in the beginning of the driver, which sets the speed of drive 0 to 11 (there   * are some lines present). 0 - 11 are allowed speed values. These values are - * the results from the DOS speed test program supplied from UMC. 11 is the  + * the results from the DOS speed test program supplied from UMC. 11 is the   * highest speed (about PIO mode 3)   */  #define REALLY_SLOW_IO		/* some systems can safely undef this */ @@ -60,62 +60,62 @@  #define UMC_DRIVE3      1              /* In case of crash reduce speed */  static u8 current_speeds[4] = {UMC_DRIVE0, UMC_DRIVE1, UMC_DRIVE2, UMC_DRIVE3}; -static const u8 pio_to_umc [5] = {0,3,7,10,11};	/* rough guesses */ +static const u8 pio_to_umc [5] = {0, 3, 7, 10, 11};	/* rough guesses */  /*       0    1    2    3    4    5    6    7    8    9    10   11      */  static const u8 speedtab [3][12] = { -	{0xf, 0xb, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1 }, -	{0x3, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1 }, -	{0xff,0xcb,0xc0,0x58,0x36,0x33,0x23,0x22,0x21,0x11,0x10,0x0}}; +	{0x0f, 0x0b, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1}, +	{0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1}, +	{0xff, 0xcb, 0xc0, 0x58, 0x36, 0x33, 0x23, 0x22, 0x21, 0x11, 0x10, 0x0} +}; -static void out_umc (char port,char wert) +static void out_umc(char port, char wert)  { -	outb_p(port,0x108); -	outb_p(wert,0x109); +	outb_p(port, 0x108); +	outb_p(wert, 0x109);  } -static inline u8 in_umc (char port) +static inline u8 in_umc(char port)  { -	outb_p(port,0x108); +	outb_p(port, 0x108);  	return inb_p(0x109);  } -static void umc_set_speeds (u8 speeds[]) +static void umc_set_speeds(u8 speeds[])  {  	int i, tmp; -	outb_p(0x5A,0x108); /* enable umc */ +	outb_p(0x5A, 0x108); /* enable umc */ -	out_umc (0xd7,(speedtab[0][speeds[2]] | (speedtab[0][speeds[3]]<<4))); -	out_umc (0xd6,(speedtab[0][speeds[0]] | (speedtab[0][speeds[1]]<<4))); +	out_umc(0xd7, (speedtab[0][speeds[2]] | (speedtab[0][speeds[3]]<<4))); +	out_umc(0xd6, (speedtab[0][speeds[0]] | (speedtab[0][speeds[1]]<<4)));  	tmp = 0; -	for (i = 3; i >= 0; i--) { +	for (i = 3; i >= 0; i--)  		tmp = (tmp << 2) | speedtab[1][speeds[i]]; +	out_umc(0xdc, tmp); +	for (i = 0; i < 4; i++) { +		out_umc(0xd0 + i, speedtab[2][speeds[i]]); +		out_umc(0xd8 + i, speedtab[2][speeds[i]]);  	} -	out_umc (0xdc,tmp); -	for (i = 0;i < 4; i++) { -		out_umc (0xd0+i,speedtab[2][speeds[i]]); -		out_umc (0xd8+i,speedtab[2][speeds[i]]); -	} -	outb_p(0xa5,0x108); /* disable umc */ +	outb_p(0xa5, 0x108); /* disable umc */ -	printk ("umc8672: drive speeds [0 to 11]: %d %d %d %d\n", +	printk("umc8672: drive speeds [0 to 11]: %d %d %d %d\n",  		speeds[0], speeds[1], speeds[2], speeds[3]);  }  static void umc_set_pio_mode(ide_drive_t *drive, const u8 pio)  { +	ide_hwif_t *hwif = drive->hwif;  	unsigned long flags; -	ide_hwgroup_t *hwgroup = ide_hwifs[HWIF(drive)->index^1].hwgroup;  	printk("%s: setting umc8672 to PIO mode%d (speed %d)\n",  		drive->name, pio, pio_to_umc[pio]);  	spin_lock_irqsave(&ide_lock, flags); -	if (hwgroup && hwgroup->handler != NULL) { +	if (hwif->mate && hwif->mate->hwgroup->handler) {  		printk(KERN_ERR "umc8672: other interface is busy: exiting tune_umc()\n");  	} else {  		current_speeds[drive->name[2] - 'a'] = pio_to_umc[pio]; -		umc_set_speeds (current_speeds); +		umc_set_speeds(current_speeds);  	}  	spin_unlock_irqrestore(&ide_lock, flags);  } @@ -128,8 +128,9 @@ static const struct ide_port_info umc8672_port_info __initdata = {  static int __init umc8672_probe(void)  { +	ide_hwif_t *hwif, *mate;  	unsigned long flags; -	static u8 idx[4] = { 0, 1, 0xff, 0xff }; +	static u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };  	hw_regs_t hw[2];  	if (!request_region(0x108, 2, "umc8672")) { @@ -137,16 +138,16 @@ static int __init umc8672_probe(void)  		return 1;  	}  	local_irq_save(flags); -	outb_p(0x5A,0x108); /* enable umc */ +	outb_p(0x5A, 0x108); /* enable umc */  	if (in_umc (0xd5) != 0xa0) {  		local_irq_restore(flags);  		printk(KERN_ERR "umc8672: not found\n");  		release_region(0x108, 2); -		return 1;   +		return 1;  	} -	outb_p(0xa5,0x108); /* disable umc */ +	outb_p(0xa5, 0x108); /* disable umc */ -	umc_set_speeds (current_speeds); +	umc_set_speeds(current_speeds);  	local_irq_restore(flags);  	memset(&hw, 0, sizeof(hw)); @@ -157,18 +158,26 @@ static int __init umc8672_probe(void)  	ide_std_init_ports(&hw[1], 0x170, 0x376);  	hw[1].irq = 15; -	ide_init_port_hw(&ide_hwifs[0], &hw[0]); -	ide_init_port_hw(&ide_hwifs[1], &hw[1]); +	hwif = ide_find_port(); +	if (hwif) { +		ide_init_port_hw(hwif, &hw[0]); +		hwif->set_pio_mode = umc_set_pio_mode; +		idx[0] = hwif->index; +	} -	ide_hwifs[0].set_pio_mode = &umc_set_pio_mode; -	ide_hwifs[1].set_pio_mode = &umc_set_pio_mode; +	mate = ide_find_port(); +	if (mate) { +		ide_init_port_hw(mate, &hw[1]); +		mate->set_pio_mode = umc_set_pio_mode; +		idx[1] = mate->index; +	}  	ide_device_add(idx, &umc8672_port_info);  	return 0;  } -int probe_umc8672 = 0; +int probe_umc8672;  module_param_named(probe, probe_umc8672, bool, 0);  MODULE_PARM_DESC(probe, "probe for UMC8672 chipset");  | 
