1 /*
2  *  linux/drivers/ide/pci/generic.c	Version 0.11	December 30, 2002
3  *
4  *  Copyright (C) 2001-2002	Andre Hedrick <andre@linux-ide.org>
5  *  Portions (C) Copyright 2002  Red Hat Inc <alan@redhat.com>
6  *
7  * This program is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by the
9  * Free Software Foundation; either version 2, or (at your option) any
10  * later version.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  *
17  * For the avoidance of doubt the "preferred form" of this code is one which
18  * is in an open non patent encumbered format. Where cryptographic key signing
19  * forms part of the process of creating an executable the information
20  * including keys needed to generate an equivalently functional executable
21  * are deemed to be part of the source code.
22  */
23 
24 #undef REALLY_SLOW_IO		/* most systems can safely undef this */
25 
26 #include <linux/config.h> /* for CONFIG_BLK_DEV_IDEPCI */
27 #include <linux/types.h>
28 #include <linux/module.h>
29 #include <linux/kernel.h>
30 #include <linux/delay.h>
31 #include <linux/timer.h>
32 #include <linux/mm.h>
33 #include <linux/ioport.h>
34 #include <linux/blkdev.h>
35 #include <linux/hdreg.h>
36 #include <linux/pci.h>
37 #include <linux/ide.h>
38 #include <linux/init.h>
39 
40 #include <asm/io.h>
41 
42 #include "generic.h"
43 
init_chipset_generic(struct pci_dev * dev,const char * name)44 static unsigned int __init init_chipset_generic (struct pci_dev *dev, const char *name)
45 {
46 	return 0;
47 }
48 
init_hwif_generic(ide_hwif_t * hwif)49 static void __init init_hwif_generic (ide_hwif_t *hwif)
50 {
51 	switch(hwif->pci_dev->device) {
52 		case PCI_DEVICE_ID_UMC_UM8673F:
53 		case PCI_DEVICE_ID_UMC_UM8886A:
54 		case PCI_DEVICE_ID_UMC_UM8886BF:
55 			hwif->irq = hwif->channel ? 15 : 14;
56 			break;
57 		default:
58 			break;
59 	}
60 
61 	if (!(hwif->dma_base))
62 		return;
63 
64 	hwif->atapi_dma = 1;
65 	hwif->ultra_mask = 0x7f;
66 	hwif->mwdma_mask = 0x07;
67 	hwif->swdma_mask = 0x07;
68 
69 	if (!noautodma)
70 		hwif->autodma = 1;
71 	hwif->drives[0].autodma = hwif->autodma;
72 	hwif->drives[1].autodma = hwif->autodma;
73 }
74 
init_dma_generic(ide_hwif_t * hwif,unsigned long dmabase)75 static void init_dma_generic (ide_hwif_t *hwif, unsigned long dmabase)
76 {
77 	ide_setup_dma(hwif, dmabase, 8);
78 }
79 
80 extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *);
81 
82 #if 0
83 
84 	/* Logic to add back later on */
85 
86 	if ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE) {
87 		ide_pci_device_t *unknown = unknown_chipset;
88 //		unknown->vendor = dev->vendor;
89 //		unknown->device = dev->device;
90 		init_setup_unknown(dev, unknown);
91 		return 1;
92 	}
93 	return 0;
94 #endif
95 
96 /**
97  *	generic_init_one	-	called when a PIIX is found
98  *	@dev: the generic device
99  *	@id: the matching pci id
100  *
101  *	Called when the PCI registration layer (or the IDE initialization)
102  *	finds a device matching our IDE device tables.
103  */
104 
generic_init_one(struct pci_dev * dev,const struct pci_device_id * id)105 static int __devinit generic_init_one(struct pci_dev *dev, const struct pci_device_id *id)
106 {
107 	ide_pci_device_t *d = &generic_chipsets[id->driver_data];
108 	u16 command;
109 
110 	if (dev->device != d->device)
111 		BUG();
112 	if ((d->vendor == PCI_VENDOR_ID_UMC) &&
113 	    (d->device == PCI_DEVICE_ID_UMC_UM8886A) &&
114 	    (!(PCI_FUNC(dev->devfn) & 1)))
115 		return 1; /* UM8886A/BF pair */
116 
117 	if ((d->vendor == PCI_VENDOR_ID_OPTI) &&
118 	    (d->device == PCI_DEVICE_ID_OPTI_82C558) &&
119 	    (!(PCI_FUNC(dev->devfn) & 1)))
120 		return 1;
121 
122 	pci_read_config_word(dev, PCI_COMMAND, &command);
123 	if(!(command & PCI_COMMAND_IO))
124 	{
125 		printk(KERN_INFO "Skipping disabled %s IDE controller.\n", d->name);
126 		return 1;
127 	}
128 	ide_setup_pci_device(dev, d);
129 	MOD_INC_USE_COUNT;
130 	return 0;
131 }
132 
133 static struct pci_device_id generic_pci_tbl[] __devinitdata = {
134 	{ PCI_VENDOR_ID_NS,     PCI_DEVICE_ID_NS_87410,            PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
135 	{ PCI_VENDOR_ID_PCTECH, PCI_DEVICE_ID_PCTECH_SAMURAI_IDE,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1},
136 	{ PCI_VENDOR_ID_HOLTEK, PCI_DEVICE_ID_HOLTEK_6565,         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2},
137 	{ PCI_VENDOR_ID_UMC,    PCI_DEVICE_ID_UMC_UM8673F,         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3},
138 	{ PCI_VENDOR_ID_UMC,    PCI_DEVICE_ID_UMC_UM8886A,         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4},
139 	{ PCI_VENDOR_ID_UMC,    PCI_DEVICE_ID_UMC_UM8886BF,        PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5},
140 	{ PCI_VENDOR_ID_HINT,   PCI_DEVICE_ID_HINT_VXPROII_IDE,    PCI_ANY_ID, PCI_ANY_ID, 0, 0, 6},
141 	{ PCI_VENDOR_ID_VIA,    PCI_DEVICE_ID_VIA_82C561,          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 7},
142 	{ PCI_VENDOR_ID_OPTI,   PCI_DEVICE_ID_OPTI_82C558,         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 8},
143 	{ PCI_VENDOR_ID_TOSHIBA, PCI_DEVICE_ID_TOSHIBA_PICCOLO,	   PCI_ANY_ID, PCI_ANY_ID, 0, 0, 9},
144 	{ PCI_VENDOR_ID_TOSHIBA, PCI_DEVICE_ID_TOSHIBA_PICCOLO_1,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 10},
145 	{ PCI_VENDOR_ID_TOSHIBA, PCI_DEVICE_ID_TOSHIBA_PICCOLO_2,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 11},
146 	{ PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_20363,      PCI_ANY_ID, PCI_ANY_ID, 0, 0, 12},
147 	{ PCI_VENDOR_ID_MARVELL,  PCI_DEVICE_ID_MARVELL_6101,      PCI_ANY_ID, PCI_ANY_ID, 0, 0, 13},
148  	{ PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB368,     PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14},
149 	{ PCI_VENDOR_ID_MARVELL,  PCI_DEVICE_ID_MARVELL_6145,      PCI_ANY_ID, PCI_ANY_ID, 0, 0, 15},
150 	{ 0, },
151 };
152 
153 static struct pci_driver driver = {
154 	.name		= "PCI IDE",
155 	.id_table	= generic_pci_tbl,
156 	.probe		= generic_init_one,
157 };
158 
generic_ide_init(void)159 static int generic_ide_init(void)
160 {
161 	return ide_pci_register_driver(&driver);
162 }
163 
generic_ide_exit(void)164 static void generic_ide_exit(void)
165 {
166 	ide_pci_unregister_driver(&driver);
167 }
168 
169 module_init(generic_ide_init);
170 module_exit(generic_ide_exit);
171 
172 MODULE_AUTHOR("Andre Hedrick");
173 MODULE_DESCRIPTION("PCI driver module for generic PCI IDE");
174 MODULE_LICENSE("GPL");
175 
176 EXPORT_NO_SYMBOLS;
177