2005-04-17 02:20:36 +04:00
/*
2008-02-02 01:09:33 +03:00
* Macintosh IDE Driver
2005-04-17 02:20:36 +04:00
*
* Copyright ( C ) 1998 by Michael Schmitz
*
* This driver was written based on information obtained from the MacOS IDE
* driver binary by Mikael Forselius
*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file COPYING in the main directory of this archive for
* more details .
*/
# include <linux/types.h>
# include <linux/mm.h>
# include <linux/interrupt.h>
# include <linux/blkdev.h>
# include <linux/delay.h>
# include <linux/ide.h>
# include <asm/macintosh.h>
# include <asm/macints.h>
# include <asm/mac_baboon.h>
# define IDE_BASE 0x50F1A000 /* Base address of IDE controller */
/*
* Generic IDE registers as offsets from the base
* These match MkLinux so they should be correct .
*/
# define IDE_CONTROL 0x38 /* control/altstatus */
/*
* Mac - specific registers
*/
/*
* this register is odd ; it doesn ' t seem to do much and it ' s
* not word - aligned like virtually every other hardware register
* on the Mac . . .
*/
# define IDE_IFR 0x101 / * (0x101) IDE interrupt flags on Quadra:
*
* Bit 0 + 1 : some interrupt flags
* Bit 2 + 3 : some interrupt enable
* Bit 4 : ? ?
* Bit 5 : IDE interrupt flag ( any hwif )
* Bit 6 : maybe IDE interrupt enable ( any hwif ) ? ?
* Bit 7 : Any interrupt condition
*/
volatile unsigned char * ide_ifr = ( unsigned char * ) ( IDE_BASE + IDE_IFR ) ;
int macide_ack_intr ( ide_hwif_t * hwif )
{
if ( * ide_ifr & 0x20 ) {
* ide_ifr & = ~ 0x20 ;
return 1 ;
}
return 0 ;
}
2008-02-06 04:57:50 +03:00
static void __init macide_setup_ports ( hw_regs_t * hw , unsigned long base ,
int irq , ide_ack_intr_t * ack_intr )
{
int i ;
memset ( hw , 0 , sizeof ( * hw ) ) ;
for ( i = 0 ; i < 8 ; i + + )
2008-04-27 17:38:32 +04:00
hw - > io_ports_array [ i ] = base + i * 4 ;
2008-02-06 04:57:50 +03:00
2008-04-27 17:38:32 +04:00
hw - > io_ports . ctl_addr = base + IDE_CONTROL ;
2008-02-06 04:57:50 +03:00
hw - > irq = irq ;
hw - > ack_intr = ack_intr ;
2008-06-10 22:56:37 +04:00
hw - > chipset = ide_generic ;
2008-02-06 04:57:50 +03:00
}
2008-01-26 22:13:09 +03:00
static const char * mac_ide_name [ ] =
{ " Quadra " , " Powerbook " , " Powerbook Baboon " } ;
2005-04-17 02:20:36 +04:00
/*
* Probe for a Macintosh IDE interface
*/
2008-01-26 22:13:07 +03:00
static int __init macide_init ( void )
2005-04-17 02:20:36 +04:00
{
2008-02-06 04:57:50 +03:00
ide_ack_intr_t * ack_intr ;
unsigned long base ;
int irq ;
2008-07-23 21:55:50 +04:00
hw_regs_t hw , * hws [ ] = { & hw , NULL , NULL , NULL } ;
2005-04-17 02:20:36 +04:00
2008-05-18 22:47:14 +04:00
if ( ! MACH_IS_MAC )
return - ENODEV ;
2005-04-17 02:20:36 +04:00
switch ( macintosh_config - > ide_type ) {
case MAC_IDE_QUADRA :
2008-02-06 04:57:50 +03:00
base = IDE_BASE ;
ack_intr = macide_ack_intr ;
irq = IRQ_NUBUS_F ;
2005-04-17 02:20:36 +04:00
break ;
case MAC_IDE_PB :
2008-02-06 04:57:50 +03:00
base = IDE_BASE ;
ack_intr = macide_ack_intr ;
irq = IRQ_NUBUS_C ;
2005-04-17 02:20:36 +04:00
break ;
case MAC_IDE_BABOON :
2008-02-06 04:57:50 +03:00
base = BABOON_BASE ;
ack_intr = NULL ;
irq = IRQ_BABOON_1 ;
2008-01-26 22:13:06 +03:00
break ;
default :
2008-01-26 22:13:07 +03:00
return - ENODEV ;
2008-01-26 22:13:06 +03:00
}
2005-04-17 02:20:36 +04:00
2008-01-26 22:13:09 +03:00
printk ( KERN_INFO " ide: Macintosh %s IDE controller \n " ,
mac_ide_name [ macintosh_config - > ide_type - 1 ] ) ;
2008-02-06 04:57:50 +03:00
macide_setup_ports ( & hw , base , irq , ack_intr ) ;
ide: add ide_host_add() helper
Add ide_host_add() helper which does ide_host_alloc()+ide_host_register(),
then convert ide_setup_pci_device[s](), ide_legacy_device_add() and some
host drivers to use it.
While at it:
* Fix ide_setup_pci_device[s](), ide_arm.c, gayle.c, ide-4drives.c,
macide.c, q40ide.c, cmd640.c and cs5520.c to return correct error value.
* -ENOENT -> -ENOMEM in rapide.c, ide-h8300.c, ide-generic.c, au1xxx-ide.c
and pmac.c
* -ENODEV -> -ENOMEM in palm_bk3710.c, ide_platform.c and delkin_cb.c
* -1 -> -ENOMEM in ide-pnp.c
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2008-07-23 21:55:57 +04:00
return ide_host_add ( NULL , hws , NULL ) ;
2005-04-17 02:20:36 +04:00
}
2008-01-26 22:13:07 +03:00
module_init ( macide_init ) ;
2008-04-02 23:22:04 +04:00
MODULE_LICENSE ( " GPL " ) ;