2005-04-16 15:20:36 -07:00
/*
2008-02-01 23:09:33 +01:00
* Atari Falcon IDE Driver
2005-04-16 15:20:36 -07:00
*
* Created 12 Jul 1997 by Geert Uytterhoeven
*
* 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 .
*/
2007-07-20 04:33:18 +01:00
# include <linux/module.h>
2005-04-16 15:20:36 -07:00
# include <linux/types.h>
# include <linux/mm.h>
# include <linux/interrupt.h>
# include <linux/blkdev.h>
# include <linux/hdreg.h>
# include <linux/ide.h>
# include <linux/init.h>
# include <asm/setup.h>
# include <asm/atarihw.h>
# include <asm/atariints.h>
# include <asm/atari_stdma.h>
2008-04-26 17:36:38 +02:00
# define DRV_NAME "falconide"
2005-04-16 15:20:36 -07:00
/*
* Base of the IDE interface
*/
# define ATA_HD_BASE 0xfff00000
/*
* Offsets from the above base
*/
# define ATA_HD_CONTROL 0x39
/*
* falconide_intr_lock is used to obtain access to the IDE interrupt ,
* which is shared between several drivers .
*/
int falconide_intr_lock ;
2007-07-20 04:33:18 +01:00
EXPORT_SYMBOL ( falconide_intr_lock ) ;
2005-04-16 15:20:36 -07:00
2008-04-28 23:44:36 +02:00
static void falconide_input_data ( ide_drive_t * drive , struct request * rq ,
void * buf , unsigned int len )
2008-04-28 23:44:36 +02:00
{
2008-04-28 23:44:36 +02:00
unsigned long data_addr = drive - > hwif - > io_ports . data_addr ;
2008-04-28 23:44:36 +02:00
if ( drive - > media = = ide_disk & & rq & & rq - > cmd_type = = REQ_TYPE_FS )
2008-04-28 23:44:36 +02:00
return insw ( data_addr , buf , ( len + 1 ) / 2 ) ;
2008-04-28 23:44:36 +02:00
2008-04-28 23:44:36 +02:00
insw_swapw ( data_addr , buf , ( len + 1 ) / 2 ) ;
2008-04-28 23:44:36 +02:00
}
2008-04-28 23:44:36 +02:00
static void falconide_output_data ( ide_drive_t * drive , struct request * rq ,
void * buf , unsigned int len )
2008-04-28 23:44:36 +02:00
{
2008-04-28 23:44:36 +02:00
unsigned long data_addr = drive - > hwif - > io_ports . data_addr ;
2008-04-28 23:44:36 +02:00
if ( drive - > media = = ide_disk & & rq & & rq - > cmd_type = = REQ_TYPE_FS )
2008-05-05 21:15:19 +02:00
return outsw ( data_addr , buf , ( len + 1 ) / 2 ) ;
2008-04-28 23:44:36 +02:00
2008-04-28 23:44:36 +02:00
outsw_swapw ( data_addr , buf , ( len + 1 ) / 2 ) ;
2008-04-28 23:44:36 +02:00
}
2008-02-06 02:57:50 +01:00
static void __init falconide_setup_ports ( hw_regs_t * hw )
{
int i ;
memset ( hw , 0 , sizeof ( * hw ) ) ;
2008-04-27 15:38:32 +02:00
hw - > io_ports . data_addr = ATA_HD_BASE ;
2008-02-06 02:57:50 +01:00
for ( i = 1 ; i < 8 ; i + + )
2008-04-27 15:38:32 +02:00
hw - > io_ports_array [ i ] = ATA_HD_BASE + 1 + i * 4 ;
2008-02-06 02:57:50 +01:00
2008-04-27 15:38:32 +02:00
hw - > io_ports . ctl_addr = ATA_HD_BASE + ATA_HD_CONTROL ;
2008-02-06 02:57:50 +01:00
hw - > irq = IRQ_MFP_IDE ;
hw - > ack_intr = NULL ;
2008-06-10 20:56:37 +02:00
hw - > chipset = ide_generic ;
2008-02-06 02:57:50 +01:00
}
2005-04-16 15:20:36 -07:00
/*
* Probe for a Falcon IDE interface
*/
2008-01-26 20:13:07 +01:00
static int __init falconide_init ( void )
2005-04-16 15:20:36 -07:00
{
hw_regs_t hw ;
2008-02-01 23:09:15 +01:00
ide_hwif_t * hwif ;
2005-04-16 15:20:36 -07:00
2008-02-06 02:57:50 +01:00
if ( ! MACH_IS_ATARI | | ! ATARIHW_PRESENT ( IDE ) )
return 0 ;
2008-01-26 20:13:09 +01:00
printk ( KERN_INFO " ide: Falcon IDE controller \n " ) ;
2008-04-26 17:36:38 +02:00
if ( ! request_mem_region ( ATA_HD_BASE , 0x40 , DRV_NAME ) ) {
printk ( KERN_ERR " %s: resources busy \n " , DRV_NAME ) ;
return - EBUSY ;
}
2008-02-06 02:57:50 +01:00
falconide_setup_ports ( & hw ) ;
2005-04-16 15:20:36 -07:00
2008-04-26 17:36:32 +02:00
hwif = ide_find_port ( ) ;
2008-01-26 20:13:06 +01:00
if ( hwif ) {
u8 index = hwif - > index ;
2008-01-26 20:13:06 +01:00
u8 idx [ 4 ] = { index , 0xff , 0xff , 0xff } ;
2008-01-26 20:13:06 +01:00
ide_init_port_hw ( hwif , & hw ) ;
2008-04-28 23:44:36 +02:00
/* Atari has a byte-swapped IDE interface */
2008-04-28 23:44:36 +02:00
hwif - > input_data = falconide_input_data ;
hwif - > output_data = falconide_output_data ;
2008-04-28 23:44:36 +02:00
2008-02-19 01:41:25 +01:00
ide_get_lock ( NULL , NULL ) ;
2008-02-02 19:56:31 +01:00
ide_device_add ( idx , NULL ) ;
2008-02-19 01:41:25 +01:00
ide_release_lock ( ) ;
2008-01-26 20:13:06 +01:00
}
2008-01-26 20:13:07 +01:00
2008-02-06 02:57:50 +01:00
return 0 ;
2005-04-16 15:20:36 -07:00
}
2008-01-26 20:13:07 +01:00
module_init ( falconide_init ) ;
2008-04-02 21:22:04 +02:00
MODULE_LICENSE ( " GPL " ) ;