2008-04-18 02:46:34 +04:00
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/module.h>
# include <linux/ide.h>
2008-04-27 00:25:18 +04:00
# define DRV_NAME "ide-4drives"
2008-04-27 17:38:24 +04:00
static int probe_4drives ;
2008-04-18 02:46:34 +04:00
module_param_named ( probe , probe_4drives , bool , 0 ) ;
MODULE_PARM_DESC ( probe , " probe for generic IDE chipset with 4 drives/port " ) ;
2008-07-16 22:33:42 +04:00
static void ide_4drives_init_dev ( ide_drive_t * drive )
2008-07-16 22:33:40 +04:00
{
2008-07-16 22:33:42 +04:00
if ( drive - > hwif - > channel )
drive - > select . all ^ = 0x20 ;
2008-07-16 22:33:40 +04:00
}
static const struct ide_port_ops ide_4drives_port_ops = {
2008-07-16 22:33:42 +04:00
. init_dev = ide_4drives_init_dev ,
2008-07-16 22:33:40 +04:00
} ;
static const struct ide_port_info ide_4drives_port_info = {
. port_ops = & ide_4drives_port_ops ,
. host_flags = IDE_HFLAG_SERIALIZE | IDE_HFLAG_NO_DMA ,
} ;
2008-04-18 02:46:34 +04:00
static int __init ide_4drives_init ( void )
{
2008-04-27 00:25:18 +04:00
unsigned long base = 0x1f0 , ctl = 0x3f6 ;
2008-07-23 21:55:57 +04:00
hw_regs_t hw , * hws [ ] = { & hw , & hw , NULL , NULL } ;
2008-04-18 02:46:34 +04:00
if ( probe_4drives = = 0 )
return - ENODEV ;
2008-04-27 00:25:18 +04:00
if ( ! request_region ( base , 8 , DRV_NAME ) ) {
printk ( KERN_ERR " %s: I/O resource 0x%lX-0x%lX not free. \n " ,
DRV_NAME , base , base + 7 ) ;
return - EBUSY ;
}
if ( ! request_region ( ctl , 1 , DRV_NAME ) ) {
printk ( KERN_ERR " %s: I/O resource 0x%lX not free. \n " ,
DRV_NAME , ctl ) ;
release_region ( base , 8 ) ;
return - EBUSY ;
}
2008-04-18 02:46:35 +04:00
memset ( & hw , 0 , sizeof ( hw ) ) ;
2008-04-18 02:46:34 +04:00
2008-04-27 00:25:18 +04:00
ide_std_init_ports ( & hw , base , ctl ) ;
2008-04-18 02:46:35 +04:00
hw . irq = 14 ;
hw . chipset = ide_4drives ;
2008-04-18 02:46:34 +04:00
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 ( & ide_4drives_port_info , hws , NULL ) ;
2008-04-18 02:46:34 +04:00
}
module_init ( ide_4drives_init ) ;
MODULE_AUTHOR ( " Bartlomiej Zolnierkiewicz " ) ;
MODULE_DESCRIPTION ( " generic IDE chipset with 4 drives/port support " ) ;
MODULE_LICENSE ( " GPL " ) ;