Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
  1/*
  2 * This file provides autodetection for ISA PnP IDE interfaces.
  3 * It was tested with "ESS ES1868 Plug and Play AudioDrive" IDE interface.
  4 *
  5 * Copyright (C) 2000 Andrey Panin <pazke@donpac.ru>
  6 *
  7 * This program is free software; you can redistribute it and/or modify
  8 * it under the terms of the GNU General Public License as published by
  9 * the Free Software Foundation; either version 2, or (at your option)
 10 * any later version.
 11 *
 12 * You should have received a copy of the GNU General Public License
 13 * (for example /usr/src/linux/COPYING); if not, write to the Free
 14 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 15 */
 16
 17#include <linux/init.h>
 18#include <linux/pnp.h>
 19#include <linux/ide.h>
 20#include <linux/module.h>
 21
 22#define DRV_NAME "ide-pnp"
 23
 24/* Add your devices here :)) */
 25static struct pnp_device_id idepnp_devices[] = {
 26	/* Generic ESDI/IDE/ATA compatible hard disk controller */
 27	{.id = "PNP0600", .driver_data = 0},
 28	{.id = ""}
 29};
 30
 31static const struct ide_port_info ide_pnp_port_info = {
 32	.host_flags		= IDE_HFLAG_NO_DMA,
 33	.chipset		= ide_generic,
 34};
 35
 36static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
 37{
 38	struct ide_host *host;
 39	unsigned long base, ctl;
 40	int rc;
 41	struct ide_hw hw, *hws[] = { &hw };
 42
 43	printk(KERN_INFO DRV_NAME ": generic PnP IDE interface\n");
 44
 45	if (!(pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) && pnp_irq_valid(dev, 0)))
 46		return -1;
 47
 48	base = pnp_port_start(dev, 0);
 49	ctl = pnp_port_start(dev, 1);
 50
 51	if (!request_region(base, 8, DRV_NAME)) {
 52		printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n",
 53				DRV_NAME, base, base + 7);
 54		return -EBUSY;
 55	}
 56
 57	if (!request_region(ctl, 1, DRV_NAME)) {
 58		printk(KERN_ERR "%s: I/O resource 0x%lX not free.\n",
 59				DRV_NAME, ctl);
 60		release_region(base, 8);
 61		return -EBUSY;
 62	}
 63
 64	memset(&hw, 0, sizeof(hw));
 65	ide_std_init_ports(&hw, base, ctl);
 66	hw.irq = pnp_irq(dev, 0);
 67
 68	rc = ide_host_add(&ide_pnp_port_info, hws, 1, &host);
 69	if (rc)
 70		goto out;
 71
 72	pnp_set_drvdata(dev, host);
 73
 74	return 0;
 75out:
 76	release_region(ctl, 1);
 77	release_region(base, 8);
 78
 79	return rc;
 80}
 81
 82static void idepnp_remove(struct pnp_dev *dev)
 83{
 84	struct ide_host *host = pnp_get_drvdata(dev);
 85
 86	ide_host_remove(host);
 87
 88	release_region(pnp_port_start(dev, 1), 1);
 89	release_region(pnp_port_start(dev, 0), 8);
 90}
 91
 92static struct pnp_driver idepnp_driver = {
 93	.name		= "ide",
 94	.id_table	= idepnp_devices,
 95	.probe		= idepnp_probe,
 96	.remove		= idepnp_remove,
 97};
 98
 99static int __init pnpide_init(void)
100{
101	return pnp_register_driver(&idepnp_driver);
102}
103
104static void __exit pnpide_exit(void)
105{
106	pnp_unregister_driver(&idepnp_driver);
107}
108
109module_init(pnpide_init);
110module_exit(pnpide_exit);
111
112MODULE_LICENSE("GPL");