1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * This file provides autodetection for ISA PnP IDE interfaces. 4 * It was tested with "ESS ES1868 Plug and Play AudioDrive" IDE interface. 5 * 6 * Copyright (C) 2000 Andrey Panin <pazke@donpac.ru> 7 */ 8 9#include <linux/init.h> 10#include <linux/pnp.h> 11#include <linux/ide.h> 12#include <linux/module.h> 13 14#define DRV_NAME "ide-pnp" 15 16/* Add your devices here :)) */ 17static const struct pnp_device_id idepnp_devices[] = { 18 /* Generic ESDI/IDE/ATA compatible hard disk controller */ 19 {.id = "PNP0600", .driver_data = 0}, 20 {.id = ""} 21}; 22 23static const struct ide_port_info ide_pnp_port_info = { 24 .host_flags = IDE_HFLAG_NO_DMA, 25 .chipset = ide_generic, 26}; 27 28static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) 29{ 30 struct ide_host *host; 31 unsigned long base, ctl; 32 int rc; 33 struct ide_hw hw, *hws[] = { &hw }; 34 35 printk(KERN_INFO DRV_NAME ": generic PnP IDE interface\n"); 36 37 if (!(pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) && pnp_irq_valid(dev, 0))) 38 return -1; 39 40 base = pnp_port_start(dev, 0); 41 ctl = pnp_port_start(dev, 1); 42 43 if (!request_region(base, 8, DRV_NAME)) { 44 printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n", 45 DRV_NAME, base, base + 7); 46 return -EBUSY; 47 } 48 49 if (!request_region(ctl, 1, DRV_NAME)) { 50 printk(KERN_ERR "%s: I/O resource 0x%lX not free.\n", 51 DRV_NAME, ctl); 52 release_region(base, 8); 53 return -EBUSY; 54 } 55 56 memset(&hw, 0, sizeof(hw)); 57 ide_std_init_ports(&hw, base, ctl); 58 hw.irq = pnp_irq(dev, 0); 59 60 rc = ide_host_add(&ide_pnp_port_info, hws, 1, &host); 61 if (rc) 62 goto out; 63 64 pnp_set_drvdata(dev, host); 65 66 return 0; 67out: 68 release_region(ctl, 1); 69 release_region(base, 8); 70 71 return rc; 72} 73 74static void idepnp_remove(struct pnp_dev *dev) 75{ 76 struct ide_host *host = pnp_get_drvdata(dev); 77 78 ide_host_remove(host); 79 80 release_region(pnp_port_start(dev, 1), 1); 81 release_region(pnp_port_start(dev, 0), 8); 82} 83 84static struct pnp_driver idepnp_driver = { 85 .name = "ide", 86 .id_table = idepnp_devices, 87 .probe = idepnp_probe, 88 .remove = idepnp_remove, 89}; 90 91module_pnp_driver(idepnp_driver); 92MODULE_LICENSE("GPL"); 93