ide-pci-generic.c revision 2467922a560bb7e6eb4635435760ad0a2197ffcc
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Copyright (C) 2001-2002	Andre Hedrick <andre@linux-ide.org>
3ccd32e221c3e3797ac56305c554ad8b07c13c815Alan Cox *  Portions (C) Copyright 2002  Red Hat Inc
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or modify it
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * under the terms of the GNU General Public License as published by the
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Free Software Foundation; either version 2, or (at your option) any
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * later version.
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is distributed in the hope that it will be useful, but
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * WITHOUT ANY WARRANTY; without even the implied warranty of
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * General Public License for more details.
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * For the avoidance of doubt the "preferred form" of this code is one which
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * is in an open non patent encumbered format. Where cryptographic key signing
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * forms part of the process of creating an executable the information
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * including keys needed to generate an equivalently functional executable
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * are deemed to be part of the source code.
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/types.h>
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pci.h>
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ide.h>
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
29ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz#define DRV_NAME "ide_pci_generic"
30ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz
31b189346cd10e28fa080347591066f0688405faeeAlan Coxstatic int ide_generic_all;		/* Set to claim all devices */
32b189346cd10e28fa080347591066f0688405faeeAlan Cox
33a4bea10eca68152e84ffc4eaeb9d20ec2ac34664Patrick Jeffersonmodule_param_named(all_generic_ide, ide_generic_all, bool, 0444);
34a4bea10eca68152e84ffc4eaeb9d20ec2ac34664Patrick JeffersonMODULE_PARM_DESC(all_generic_ide, "IDE generic will claim all unknown PCI IDE storage controllers.");
35b189346cd10e28fa080347591066f0688405faeeAlan Cox
36ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz#define DECLARE_GENERIC_PCI_DEV(extra_flags) \
371c3dd326ad790934fd88ec086e75a9d61ddaef8aBartlomiej Zolnierkiewicz	{ \
38ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz		.name		= DRV_NAME, \
397cab14a79973893392111b8f887856a54621f759Bartlomiej Zolnierkiewicz		.host_flags	= IDE_HFLAG_TRUST_BIOS_FOR_DMA | \
405e71d9c5a50b92b33d35061d42ac39166db9578eBartlomiej Zolnierkiewicz				  extra_flags, \
415f8b6c34854a966fe5eb7241fde0419d47d5d408Bartlomiej Zolnierkiewicz		.swdma_mask	= ATA_SWDMA2, \
425f8b6c34854a966fe5eb7241fde0419d47d5d408Bartlomiej Zolnierkiewicz		.mwdma_mask	= ATA_MWDMA2, \
435f8b6c34854a966fe5eb7241fde0419d47d5d408Bartlomiej Zolnierkiewicz		.udma_mask	= ATA_UDMA6, \
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
468562043606430185cad26d085d46adcc7ad67fd1Bartlomiej Zolnierkiewiczstatic const struct ide_port_info generic_chipsets[] __devinitdata = {
47ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	/*  0: Unknown */
48ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	DECLARE_GENERIC_PCI_DEV(0),
491c3dd326ad790934fd88ec086e75a9d61ddaef8aBartlomiej Zolnierkiewicz
50ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	{	/* 1: NS87410 */
51ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz		.name		= DRV_NAME,
5217deabdcded322c04c5ec2baf8cf38c58017f08ePaolo Ciarrocchi		.enablebits	= { {0x43, 0x08, 0x08}, {0x47, 0x08, 0x08} },
535e71d9c5a50b92b33d35061d42ac39166db9578eBartlomiej Zolnierkiewicz		.host_flags	= IDE_HFLAG_TRUST_BIOS_FOR_DMA,
545f8b6c34854a966fe5eb7241fde0419d47d5d408Bartlomiej Zolnierkiewicz		.swdma_mask	= ATA_SWDMA2,
555f8b6c34854a966fe5eb7241fde0419d47d5d408Bartlomiej Zolnierkiewicz		.mwdma_mask	= ATA_MWDMA2,
565f8b6c34854a966fe5eb7241fde0419d47d5d408Bartlomiej Zolnierkiewicz		.udma_mask	= ATA_UDMA6,
571c3dd326ad790934fd88ec086e75a9d61ddaef8aBartlomiej Zolnierkiewicz	},
581c3dd326ad790934fd88ec086e75a9d61ddaef8aBartlomiej Zolnierkiewicz
59ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	/*  2: SAMURAI / HT6565 / HINT_IDE */
60ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	DECLARE_GENERIC_PCI_DEV(0),
61ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	/*  3: UM8673F / UM8886A / UM8886BF */
622467922a560bb7e6eb4635435760ad0a2197ffccBartlomiej Zolnierkiewicz	DECLARE_GENERIC_PCI_DEV(IDE_HFLAG_NO_DMA),
63ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	/*  4: VIA_IDE / OPTI621V / Piccolo010{2,3,5} */
64ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	DECLARE_GENERIC_PCI_DEV(IDE_HFLAG_NO_AUTODMA),
65ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz
66ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	{	/* 5: VIA8237SATA */
67ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz		.name		= DRV_NAME,
687cab14a79973893392111b8f887856a54621f759Bartlomiej Zolnierkiewicz		.host_flags	= IDE_HFLAG_TRUST_BIOS_FOR_DMA |
697cab14a79973893392111b8f887856a54621f759Bartlomiej Zolnierkiewicz				  IDE_HFLAG_OFF_BOARD,
705f8b6c34854a966fe5eb7241fde0419d47d5d408Bartlomiej Zolnierkiewicz		.swdma_mask	= ATA_SWDMA2,
715f8b6c34854a966fe5eb7241fde0419d47d5d408Bartlomiej Zolnierkiewicz		.mwdma_mask	= ATA_MWDMA2,
725f8b6c34854a966fe5eb7241fde0419d47d5d408Bartlomiej Zolnierkiewicz		.udma_mask	= ATA_UDMA6,
731c3dd326ad790934fd88ec086e75a9d61ddaef8aBartlomiej Zolnierkiewicz	},
741c3dd326ad790934fd88ec086e75a9d61ddaef8aBartlomiej Zolnierkiewicz
75ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	{	/* 6: Revolution */
76ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz		.name		= DRV_NAME,
778ac2b42a45896641ed292deaf038a1d2703d85a6Bartlomiej Zolnierkiewicz		.host_flags	= IDE_HFLAG_CLEAR_SIMPLEX |
788ac2b42a45896641ed292deaf038a1d2703d85a6Bartlomiej Zolnierkiewicz				  IDE_HFLAG_TRUST_BIOS_FOR_DMA |
797cab14a79973893392111b8f887856a54621f759Bartlomiej Zolnierkiewicz				  IDE_HFLAG_OFF_BOARD,
805f8b6c34854a966fe5eb7241fde0419d47d5d408Bartlomiej Zolnierkiewicz		.swdma_mask	= ATA_SWDMA2,
815f8b6c34854a966fe5eb7241fde0419d47d5d408Bartlomiej Zolnierkiewicz		.mwdma_mask	= ATA_MWDMA2,
825f8b6c34854a966fe5eb7241fde0419d47d5d408Bartlomiej Zolnierkiewicz		.udma_mask	= ATA_UDMA6,
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/**
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	generic_init_one	-	called when a PIIX is found
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	@dev: the generic device
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	@id: the matching pci id
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	Called when the PCI registration layer (or the IDE initialization)
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	finds a device matching our IDE device tables.
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
9417deabdcded322c04c5ec2baf8cf38c58017f08ePaolo Ciarrocchi
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __devinit generic_init_one(struct pci_dev *dev, const struct pci_device_id *id)
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
978562043606430185cad26d085d46adcc7ad67fd1Bartlomiej Zolnierkiewicz	const struct ide_port_info *d = &generic_chipsets[id->driver_data];
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int ret = -ENODEV;
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
100b189346cd10e28fa080347591066f0688405faeeAlan Cox	/* Don't use the generic entry unless instructed to do so */
101b189346cd10e28fa080347591066f0688405faeeAlan Cox	if (id->driver_data == 0 && ide_generic_all == 0)
102b189346cd10e28fa080347591066f0688405faeeAlan Cox			goto out;
103b189346cd10e28fa080347591066f0688405faeeAlan Cox
104ea30759643b423933ced48acdd78e5299f05295bJiri Slaby	switch (dev->vendor) {
105ea30759643b423933ced48acdd78e5299f05295bJiri Slaby	case PCI_VENDOR_ID_UMC:
106ea30759643b423933ced48acdd78e5299f05295bJiri Slaby		if (dev->device == PCI_DEVICE_ID_UMC_UM8886A &&
107ea30759643b423933ced48acdd78e5299f05295bJiri Slaby				!(PCI_FUNC(dev->devfn) & 1))
108ea30759643b423933ced48acdd78e5299f05295bJiri Slaby			goto out; /* UM8886A/BF pair */
109ea30759643b423933ced48acdd78e5299f05295bJiri Slaby		break;
110ea30759643b423933ced48acdd78e5299f05295bJiri Slaby	case PCI_VENDOR_ID_OPTI:
111ea30759643b423933ced48acdd78e5299f05295bJiri Slaby		if (dev->device == PCI_DEVICE_ID_OPTI_82C558 &&
112ea30759643b423933ced48acdd78e5299f05295bJiri Slaby				!(PCI_FUNC(dev->devfn) & 1))
113ea30759643b423933ced48acdd78e5299f05295bJiri Slaby			goto out;
114ea30759643b423933ced48acdd78e5299f05295bJiri Slaby		break;
115ea30759643b423933ced48acdd78e5299f05295bJiri Slaby	case PCI_VENDOR_ID_JMICRON:
116ea30759643b423933ced48acdd78e5299f05295bJiri Slaby		if (dev->device != PCI_DEVICE_ID_JMICRON_JMB368 &&
117ea30759643b423933ced48acdd78e5299f05295bJiri Slaby				PCI_FUNC(dev->devfn) != 1)
118ea30759643b423933ced48acdd78e5299f05295bJiri Slaby			goto out;
119ea30759643b423933ced48acdd78e5299f05295bJiri Slaby		break;
120ea30759643b423933ced48acdd78e5299f05295bJiri Slaby	case PCI_VENDOR_ID_NS:
121ea30759643b423933ced48acdd78e5299f05295bJiri Slaby		if (dev->device == PCI_DEVICE_ID_NS_87410 &&
122ea30759643b423933ced48acdd78e5299f05295bJiri Slaby				(dev->class >> 8) != PCI_CLASS_STORAGE_IDE)
123c333526f489044be2b93085720eb898f0037b346Alan Cox			goto out;
124ea30759643b423933ced48acdd78e5299f05295bJiri Slaby		break;
125c333526f489044be2b93085720eb898f0037b346Alan Cox	}
12615e0c694367332d7e7114c7c73044bc5fed9ee48Alan Cox
1273719bc5c22c9025bf1c909fe8b527ebf1de9a153Alan Cox	if (dev->vendor != PCI_VENDOR_ID_JMICRON) {
128ea30759643b423933ced48acdd78e5299f05295bJiri Slaby		u16 command;
1293719bc5c22c9025bf1c909fe8b527ebf1de9a153Alan Cox		pci_read_config_word(dev, PCI_COMMAND, &command);
1303719bc5c22c9025bf1c909fe8b527ebf1de9a153Alan Cox		if (!(command & PCI_COMMAND_IO)) {
13128cfd8af52a9ed4e5bd1751ea6bc0b8c870f68ecBartlomiej Zolnierkiewicz			printk(KERN_INFO "%s %s: skipping disabled "
13228cfd8af52a9ed4e5bd1751ea6bc0b8c870f68ecBartlomiej Zolnierkiewicz				"controller\n", d->name, pci_name(dev));
1333719bc5c22c9025bf1c909fe8b527ebf1de9a153Alan Cox			goto out;
1343719bc5c22c9025bf1c909fe8b527ebf1de9a153Alan Cox		}
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1366cdf6eb357c2681596b7b1672b92396ba82333d4Bartlomiej Zolnierkiewicz	ret = ide_pci_init_one(dev, d, NULL);
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsout:
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return ret;
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1419cbcc5e3c5d2d0355fed22d00762fd764c81a383Bartlomiej Zolnierkiewiczstatic const struct pci_device_id generic_pci_tbl[] = {
1429cbcc5e3c5d2d0355fed22d00762fd764c81a383Bartlomiej Zolnierkiewicz	{ PCI_VDEVICE(NS,	PCI_DEVICE_ID_NS_87410),		 1 },
1439cbcc5e3c5d2d0355fed22d00762fd764c81a383Bartlomiej Zolnierkiewicz	{ PCI_VDEVICE(PCTECH,	PCI_DEVICE_ID_PCTECH_SAMURAI_IDE),	 2 },
144ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	{ PCI_VDEVICE(HOLTEK,	PCI_DEVICE_ID_HOLTEK_6565),		 2 },
145ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	{ PCI_VDEVICE(UMC,	PCI_DEVICE_ID_UMC_UM8673F),		 3 },
146ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	{ PCI_VDEVICE(UMC,	PCI_DEVICE_ID_UMC_UM8886A),		 3 },
147ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	{ PCI_VDEVICE(UMC,	PCI_DEVICE_ID_UMC_UM8886BF),		 3 },
148ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	{ PCI_VDEVICE(HINT,	PCI_DEVICE_ID_HINT_VXPROII_IDE),	 2 },
149ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	{ PCI_VDEVICE(VIA,	PCI_DEVICE_ID_VIA_82C561),		 4 },
150ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	{ PCI_VDEVICE(OPTI,	PCI_DEVICE_ID_OPTI_82C558),		 4 },
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_BLK_DEV_IDE_SATA
152ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	{ PCI_VDEVICE(VIA,	PCI_DEVICE_ID_VIA_8237_SATA),		 5 },
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
154ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	{ PCI_VDEVICE(TOSHIBA,	PCI_DEVICE_ID_TOSHIBA_PICCOLO),		 4 },
155ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	{ PCI_VDEVICE(TOSHIBA,	PCI_DEVICE_ID_TOSHIBA_PICCOLO_1),	 4 },
156ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	{ PCI_VDEVICE(TOSHIBA,	PCI_DEVICE_ID_TOSHIBA_PICCOLO_2),	 4 },
157ced3ec8aa7d0fa3300187ee47c144a22ccfc974eBartlomiej Zolnierkiewicz	{ PCI_VDEVICE(NETCELL,	PCI_DEVICE_ID_REVOLUTION),		 6 },
1589cbcc5e3c5d2d0355fed22d00762fd764c81a383Bartlomiej Zolnierkiewicz	/*
1599cbcc5e3c5d2d0355fed22d00762fd764c81a383Bartlomiej Zolnierkiewicz	 * Must come last.  If you add entries adjust
1609cbcc5e3c5d2d0355fed22d00762fd764c81a383Bartlomiej Zolnierkiewicz	 * this table and generic_chipsets[] appropriately.
1619cbcc5e3c5d2d0355fed22d00762fd764c81a383Bartlomiej Zolnierkiewicz	 */
1629cbcc5e3c5d2d0355fed22d00762fd764c81a383Bartlomiej Zolnierkiewicz	{ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL, 0 },
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{ 0, },
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DEVICE_TABLE(pci, generic_pci_tbl);
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
167a9ab09e26055a76295548ca36ec00de2f4367d32Bartlomiej Zolnierkiewiczstatic struct pci_driver generic_pci_driver = {
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.name		= "PCI_IDE",
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.id_table	= generic_pci_tbl,
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.probe		= generic_init_one,
171f566bcae9fb39b108e39a2f31594c028d6ee2e77Bartlomiej Zolnierkiewicz	.remove		= ide_pci_remove,
172feb22b7f8e62b1b987a3a1dbad95af767a1df832Bartlomiej Zolnierkiewicz	.suspend	= ide_pci_suspend,
173feb22b7f8e62b1b987a3a1dbad95af767a1df832Bartlomiej Zolnierkiewicz	.resume		= ide_pci_resume,
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
17682ab1eeceba6705cd5a8815c48eb03af1dada744Bartlomiej Zolnierkiewiczstatic int __init generic_ide_init(void)
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
178a9ab09e26055a76295548ca36ec00de2f4367d32Bartlomiej Zolnierkiewicz	return ide_pci_register_driver(&generic_pci_driver);
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
181f566bcae9fb39b108e39a2f31594c028d6ee2e77Bartlomiej Zolnierkiewiczstatic void __exit generic_ide_exit(void)
182f566bcae9fb39b108e39a2f31594c028d6ee2e77Bartlomiej Zolnierkiewicz{
183a9ab09e26055a76295548ca36ec00de2f4367d32Bartlomiej Zolnierkiewicz	pci_unregister_driver(&generic_pci_driver);
184f566bcae9fb39b108e39a2f31594c028d6ee2e77Bartlomiej Zolnierkiewicz}
185f566bcae9fb39b108e39a2f31594c028d6ee2e77Bartlomiej Zolnierkiewicz
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(generic_ide_init);
187f566bcae9fb39b108e39a2f31594c028d6ee2e77Bartlomiej Zolnierkiewiczmodule_exit(generic_ide_exit);
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_AUTHOR("Andre Hedrick");
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DESCRIPTION("PCI driver module for generic PCI IDE");
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL");
192