2005-04-17 02:20:36 +04:00
/*
* This file provides autodetection for ISA PnP IDE interfaces .
* It was tested with " ESS ES1868 Plug and Play AudioDrive " IDE interface .
*
* Copyright ( C ) 2000 Andrey Panin < pazke @ donpac . ru >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 , or ( at your option )
* any later version .
*
* You should have received a copy of the GNU General Public License
* ( for example / usr / src / linux / COPYING ) ; if not , write to the Free
2008-04-26 19:36:40 +04:00
* Software Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
2005-04-17 02:20:36 +04:00
*/
# include <linux/init.h>
# include <linux/pnp.h>
# include <linux/ide.h>
2011-07-03 21:41:29 +04:00
# include <linux/module.h>
2005-04-17 02:20:36 +04:00
2008-04-27 00:25:16 +04:00
# define DRV_NAME "ide-pnp"
2005-04-17 02:20:36 +04:00
/* Add your devices here :)) */
static struct pnp_device_id idepnp_devices [ ] = {
2008-04-26 19:36:40 +04:00
/* Generic ESDI/IDE/ATA compatible hard disk controller */
2005-04-17 02:20:36 +04:00
{ . id = " PNP0600 " , . driver_data = 0 } ,
{ . id = " " }
} ;
2009-03-27 14:46:18 +03:00
static const struct ide_port_info ide_pnp_port_info = {
. host_flags = IDE_HFLAG_NO_DMA ,
2009-05-17 21:12:22 +04:00
. chipset = ide_generic ,
2009-03-27 14:46:18 +03:00
} ;
2008-04-26 19:36:40 +04:00
static int idepnp_probe ( struct pnp_dev * dev , const struct pnp_device_id * dev_id )
2005-04-17 02:20:36 +04:00
{
2008-07-23 21:55:57 +04:00
struct ide_host * host ;
2008-04-27 00:25:16 +04:00
unsigned long base , ctl ;
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
int rc ;
2009-05-17 21:12:25 +04:00
struct ide_hw hw , * hws [ ] = { & hw } ;
2005-04-17 02:20:36 +04:00
2008-07-16 22:33:43 +04:00
printk ( KERN_INFO DRV_NAME " : generic PnP IDE interface \n " ) ;
2005-04-17 02:20:36 +04:00
if ( ! ( pnp_port_valid ( dev , 0 ) & & pnp_port_valid ( dev , 1 ) & & pnp_irq_valid ( dev , 0 ) ) )
return - 1 ;
2008-04-27 00:25:16 +04:00
base = pnp_port_start ( dev , 0 ) ;
ctl = pnp_port_start ( dev , 1 ) ;
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 ;
}
2005-04-17 02:20:36 +04:00
memset ( & hw , 0 , sizeof ( hw ) ) ;
2008-04-27 00:25:16 +04:00
ide_std_init_ports ( & hw , base , ctl ) ;
2005-04-17 02:20:36 +04:00
hw . irq = pnp_irq ( dev , 0 ) ;
2009-05-17 21:12:24 +04:00
rc = ide_host_add ( & ide_pnp_port_info , hws , 1 , & host ) ;
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
if ( rc )
goto out ;
2008-01-26 22:13:06 +03: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
pnp_set_drvdata ( dev , host ) ;
2005-04-17 02:20:36 +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 0 ;
out :
2008-04-27 00:25:16 +04:00
release_region ( ctl , 1 ) ;
release_region ( base , 8 ) ;
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 rc ;
2005-04-17 02:20:36 +04:00
}
2008-04-26 19:36:40 +04:00
static void idepnp_remove ( struct pnp_dev * dev )
2005-04-17 02:20:36 +04:00
{
2008-07-23 21:55:57 +04:00
struct ide_host * host = pnp_get_drvdata ( dev ) ;
2008-02-02 21:56:39 +03:00
2008-07-23 21:55:57 +04:00
ide_host_remove ( host ) ;
2008-04-27 00:25:16 +04:00
release_region ( pnp_port_start ( dev , 1 ) , 1 ) ;
release_region ( pnp_port_start ( dev , 0 ) , 8 ) ;
2005-04-17 02:20:36 +04:00
}
static struct pnp_driver idepnp_driver = {
. name = " ide " ,
. id_table = idepnp_devices ,
. probe = idepnp_probe ,
. remove = idepnp_remove ,
} ;
2008-01-26 22:13:07 +03:00
static int __init pnpide_init ( void )
2005-04-17 02:20:36 +04:00
{
2008-01-26 22:13:07 +03:00
return pnp_register_driver ( & idepnp_driver ) ;
2005-04-17 02:20:36 +04:00
}
2007-01-27 15:47:02 +03:00
2008-01-26 22:13:07 +03:00
static void __exit pnpide_exit ( void )
2007-01-27 15:47:02 +03:00
{
pnp_unregister_driver ( & idepnp_driver ) ;
}
2008-01-26 22:13:07 +03:00
module_init ( pnpide_init ) ;
module_exit ( pnpide_exit ) ;
2008-04-02 23:22:02 +04:00
MODULE_LICENSE ( " GPL " ) ;