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 ) ;
2009-06-15 20:52:58 +04:00
int macide_test_irq ( ide_hwif_t * hwif )
2005-04-17 02:20:36 +04:00
{
2009-06-15 20:52:57 +04:00
if ( * ide_ifr & 0x20 )
2005-04-17 02:20:36 +04:00
return 1 ;
return 0 ;
}
2009-06-15 20:52:57 +04:00
static void macide_clear_irq ( ide_drive_t * drive )
{
* ide_ifr & = ~ 0x20 ;
}
2009-05-17 21:12:25 +04:00
static void __init macide_setup_ports ( struct ide_hw * hw , unsigned long base ,
2009-06-15 20:52:58 +04:00
int irq )
2008-02-06 04:57:50 +03:00
{
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 ;
}
2009-06-15 20:52:57 +04:00
static const struct ide_port_ops macide_port_ops = {
. clear_irq = macide_clear_irq ,
2009-06-15 20:52:58 +04:00
. test_irq = macide_test_irq ,
2009-06-15 20:52:57 +04:00
} ;
2009-03-27 14:46:18 +03:00
static const struct ide_port_info macide_port_info = {
2009-06-15 20:52:57 +04:00
. port_ops = & macide_port_ops ,
2009-03-27 14:46:23 +03:00
. host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA ,
2009-03-27 14:46:27 +03:00
. irq_flags = IRQF_SHARED ,
2009-05-17 21:12:22 +04:00
. chipset = ide_generic ,
2009-03-27 14:46:18 +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
unsigned long base ;
int irq ;
2009-05-17 21:12:25 +04:00
struct ide_hw hw , * hws [ ] = { & hw } ;
2009-06-15 20:52:57 +04:00
struct ide_port_info d = macide_port_info ;
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 ;
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 ;
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 ;
2009-06-15 20:52:57 +04:00
d . port_ops = NULL ;
2008-02-06 04:57:50 +03:00
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 ] ) ;
2009-06-15 20:52:58 +04:00
macide_setup_ports ( & hw , base , irq ) ;
2008-02-06 04:57:50 +03:00
2009-06-15 20:52:57 +04:00
return ide_host_add ( & d , hws , 1 , 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 " ) ;