2019-05-19 15:08:20 +03:00
// SPDX-License-Identifier: GPL-2.0-only
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"
2012-01-13 03:02:20 +04:00
static bool 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 )
2008-10-13 23:39:40 +04:00
drive - > select ^ = 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 ,
2009-03-27 14:46:28 +03:00
. host_flags = IDE_HFLAG_SERIALIZE | IDE_HFLAG_NO_DMA |
IDE_HFLAG_4DRIVES ,
2009-05-17 21:12:22 +04:00
. chipset = ide_4drives ,
2008-07-16 22:33:40 +04:00
} ;
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 ;
2009-05-17 21:12:25 +04:00
struct ide_hw hw , * hws [ ] = { & hw , & hw } ;
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 ;
2008-04-18 02:46:34 +04:00
2009-05-17 21:12:24 +04:00
return ide_host_add ( & ide_4drives_port_info , hws , 2 , 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 " ) ;