blob: 9df1ff7e1eaac84751766ec04c48b8f40da963c7 [file] [log] [blame]
Jeff Garzik669a5db2006-08-29 18:12:40 -04001/*
2 * pata-legacy.c - Legacy port PATA/SATA controller driver.
Alan Coxab771632008-10-27 15:09:10 +00003 * Copyright 2005/2006 Red Hat, all rights reserved.
Jeff Garzik669a5db2006-08-29 18:12:40 -04004 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
8 * any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; see the file COPYING. If not, write to
17 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 * An ATA driver for the legacy ATA ports.
20 *
21 * Data Sources:
22 * Opti 82C465/82C611 support: Data sheets at opti-inc.com
23 * HT6560 series:
24 * Promise 20230/20620:
25 * http://www.ryston.cz/petr/vlb/pdc20230b.html
26 * http://www.ryston.cz/petr/vlb/pdc20230c.html
27 * http://www.ryston.cz/petr/vlb/pdc20630.html
Bartlomiej Zolnierkiewicz9c7e0d22009-12-03 20:32:11 +010028 * QDI65x0:
29 * http://www.ryston.cz/petr/vlb/qd6500.html
30 * http://www.ryston.cz/petr/vlb/qd6580.html
31 *
32 * QDI65x0 probe code based on drivers/ide/legacy/qd65xx.c
33 * Rewritten from the work of Colten Edwards <pje120@cs.usask.ca> by
34 * Samuel Thibault <samuel.thibault@ens-lyon.org>
Jeff Garzik669a5db2006-08-29 18:12:40 -040035 *
36 * Unsupported but docs exist:
37 * Appian/Adaptec AIC25VL01/Cirrus Logic PD7220
Jeff Garzik669a5db2006-08-29 18:12:40 -040038 *
39 * This driver handles legacy (that is "ISA/VLB side") IDE ports found
40 * on PC class systems. There are three hybrid devices that are exceptions
41 * The Cyrix 5510/5520 where a pre SFF ATA device is on the bridge and
42 * the MPIIX where the tuning is PCI side but the IDE is "ISA side".
43 *
44 * Specific support is included for the ht6560a/ht6560b/opti82c611a/
Bartlomiej Zolnierkiewicz9c7e0d22009-12-03 20:32:11 +010045 * opti82c465mv/promise 20230c/20630/qdi65x0/winbond83759A
Jeff Garzik669a5db2006-08-29 18:12:40 -040046 *
47 * Use the autospeed and pio_mask options with:
48 * Appian ADI/2 aka CLPD7220 or AIC25VL01.
49 * Use the jumpers, autospeed and set pio_mask to the mode on the jumpers with
50 * Goldstar GM82C711, PIC-1288A-125, UMC 82C871F, Winbond W83759,
51 * Winbond W83759A, Promise PDC20230-B
52 *
53 * For now use autospeed and pio_mask as above with the W83759A. This may
54 * change.
55 *
Jeff Garzik669a5db2006-08-29 18:12:40 -040056 */
57
James Bottomley45bc9552009-06-05 10:41:39 -040058#include <linux/async.h>
Jeff Garzik669a5db2006-08-29 18:12:40 -040059#include <linux/kernel.h>
60#include <linux/module.h>
61#include <linux/pci.h>
62#include <linux/init.h>
63#include <linux/blkdev.h>
64#include <linux/delay.h>
65#include <scsi/scsi_host.h>
66#include <linux/ata.h>
67#include <linux/libata.h>
68#include <linux/platform_device.h>
69
70#define DRV_NAME "pata_legacy"
Alan Coxb8325482008-01-19 15:47:23 +000071#define DRV_VERSION "0.6.5"
Jeff Garzik669a5db2006-08-29 18:12:40 -040072
73#define NR_HOST 6
74
Alan Coxdefc9cd2008-01-10 14:33:10 -080075static int all;
76module_param(all, int, 0444);
77MODULE_PARM_DESC(all, "Grab all legacy port devices, even if PCI(0=off, 1=on)");
Jeff Garzik669a5db2006-08-29 18:12:40 -040078
79struct legacy_data {
80 unsigned long timing;
81 u8 clock[2];
82 u8 last;
83 int fast;
84 struct platform_device *platform_dev;
85
86};
87
Alan Coxdefc9cd2008-01-10 14:33:10 -080088enum controller {
89 BIOS = 0,
90 SNOOP = 1,
91 PDC20230 = 2,
92 HT6560A = 3,
93 HT6560B = 4,
94 OPTI611A = 5,
95 OPTI46X = 6,
96 QDI6500 = 7,
97 QDI6580 = 8,
98 QDI6580DP = 9, /* Dual channel mode is different */
Alan Coxb8325482008-01-19 15:47:23 +000099 W83759A = 10,
Alan Coxdefc9cd2008-01-10 14:33:10 -0800100
101 UNKNOWN = -1
102};
103
104
105struct legacy_probe {
106 unsigned char *name;
107 unsigned long port;
108 unsigned int irq;
109 unsigned int slot;
110 enum controller type;
111 unsigned long private;
112};
113
114struct legacy_controller {
115 const char *name;
116 struct ata_port_operations *ops;
117 unsigned int pio_mask;
118 unsigned int flags;
Alan Coxe3cf95d2009-04-09 17:31:17 +0100119 unsigned int pflags;
Alan Coxb8325482008-01-19 15:47:23 +0000120 int (*setup)(struct platform_device *, struct legacy_probe *probe,
121 struct legacy_data *data);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800122};
123
124static int legacy_port[NR_HOST] = { 0x1f0, 0x170, 0x1e8, 0x168, 0x1e0, 0x160 };
125
126static struct legacy_probe probe_list[NR_HOST];
Jeff Garzik669a5db2006-08-29 18:12:40 -0400127static struct legacy_data legacy_data[NR_HOST];
128static struct ata_host *legacy_host[NR_HOST];
129static int nr_legacy_host;
130
131
Alan Coxdefc9cd2008-01-10 14:33:10 -0800132static int probe_all; /* Set to check all ISA port ranges */
133static int ht6560a; /* HT 6560A on primary 1, second 2, both 3 */
134static int ht6560b; /* HT 6560A on primary 1, second 2, both 3 */
135static int opti82c611a; /* Opti82c611A on primary 1, sec 2, both 3 */
136static int opti82c46x; /* Opti 82c465MV present(pri/sec autodetect) */
137static int qdi; /* Set to probe QDI controllers */
Alan Coxb8325482008-01-19 15:47:23 +0000138static int winbond; /* Set to probe Winbond controllers,
Alan Cox83972482008-02-08 15:23:38 +0000139 give I/O port if non standard */
Alan Coxdefc9cd2008-01-10 14:33:10 -0800140static int autospeed; /* Chip present which snoops speed changes */
Erik Inge Bolsø14bdef92009-03-14 21:38:24 +0100141static int pio_mask = ATA_PIO4; /* PIO range for autospeed devices */
Alan Coxf834e492007-02-07 13:46:00 -0800142static int iordy_mask = 0xFFFFFFFF; /* Use iordy if available */
Jeff Garzik669a5db2006-08-29 18:12:40 -0400143
144/**
Alan Coxdefc9cd2008-01-10 14:33:10 -0800145 * legacy_probe_add - Add interface to probe list
146 * @port: Controller port
147 * @irq: IRQ number
148 * @type: Controller type
149 * @private: Controller specific info
150 *
151 * Add an entry into the probe list for ATA controllers. This is used
152 * to add the default ISA slots and then to build up the table
153 * further according to other ISA/VLB/Weird device scans
154 *
155 * An I/O port list is used to keep ordering stable and sane, as we
156 * don't have any good way to talk about ordering otherwise
157 */
158
159static int legacy_probe_add(unsigned long port, unsigned int irq,
160 enum controller type, unsigned long private)
161{
162 struct legacy_probe *lp = &probe_list[0];
163 int i;
164 struct legacy_probe *free = NULL;
165
166 for (i = 0; i < NR_HOST; i++) {
167 if (lp->port == 0 && free == NULL)
168 free = lp;
169 /* Matching port, or the correct slot for ordering */
170 if (lp->port == port || legacy_port[i] == port) {
171 free = lp;
172 break;
173 }
174 lp++;
175 }
176 if (free == NULL) {
177 printk(KERN_ERR "pata_legacy: Too many interfaces.\n");
178 return -1;
179 }
180 /* Fill in the entry for later probing */
181 free->port = port;
182 free->irq = irq;
183 free->type = type;
184 free->private = private;
185 return 0;
186}
187
188
189/**
Jeff Garzik669a5db2006-08-29 18:12:40 -0400190 * legacy_set_mode - mode setting
Tejun Heo02607312007-08-06 18:36:23 +0900191 * @link: IDE link
Alanb229a7b2007-01-24 11:47:07 +0000192 * @unused: Device that failed when error is returned
Jeff Garzik669a5db2006-08-29 18:12:40 -0400193 *
194 * Use a non standard set_mode function. We don't want to be tuned.
195 *
196 * The BIOS configured everything. Our job is not to fiddle. Just use
197 * whatever PIO the hardware is using and leave it at that. When we
198 * get some kind of nice user driven API for control then we can
199 * expand on this as per hdparm in the base kernel.
200 */
201
Tejun Heo02607312007-08-06 18:36:23 +0900202static int legacy_set_mode(struct ata_link *link, struct ata_device **unused)
Jeff Garzik669a5db2006-08-29 18:12:40 -0400203{
Tejun Heof58229f2007-08-06 18:36:23 +0900204 struct ata_device *dev;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400205
Tejun Heo1eca4362008-11-03 20:03:17 +0900206 ata_for_each_dev(dev, link, ENABLED) {
207 ata_dev_printk(dev, KERN_INFO, "configured for PIO\n");
208 dev->pio_mode = XFER_PIO_0;
209 dev->xfer_mode = XFER_PIO_0;
210 dev->xfer_shift = ATA_SHIFT_PIO;
211 dev->flags |= ATA_DFLAG_PIO;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400212 }
Alanb229a7b2007-01-24 11:47:07 +0000213 return 0;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400214}
215
216static struct scsi_host_template legacy_sht = {
Tejun Heo68d1d072008-03-25 12:22:49 +0900217 ATA_PIO_SHT(DRV_NAME),
Jeff Garzik669a5db2006-08-29 18:12:40 -0400218};
219
Tejun Heo029cfd62008-03-25 12:22:49 +0900220static const struct ata_port_operations legacy_base_port_ops = {
221 .inherits = &ata_sff_port_ops,
222 .cable_detect = ata_cable_40wire,
223};
224
Jeff Garzik669a5db2006-08-29 18:12:40 -0400225/*
226 * These ops are used if the user indicates the hardware
227 * snoops the commands to decide on the mode and handles the
228 * mode selection "magically" itself. Several legacy controllers
229 * do this. The mode range can be set if it is not 0x1F by setting
230 * pio_mask as well.
231 */
232
233static struct ata_port_operations simple_port_ops = {
Tejun Heo029cfd62008-03-25 12:22:49 +0900234 .inherits = &legacy_base_port_ops,
Tejun Heo5682ed32008-04-07 22:47:16 +0900235 .sff_data_xfer = ata_sff_data_xfer_noirq,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400236};
237
238static struct ata_port_operations legacy_port_ops = {
Tejun Heo029cfd62008-03-25 12:22:49 +0900239 .inherits = &legacy_base_port_ops,
Tejun Heo5682ed32008-04-07 22:47:16 +0900240 .sff_data_xfer = ata_sff_data_xfer_noirq,
Tejun Heo029cfd62008-03-25 12:22:49 +0900241 .set_mode = legacy_set_mode,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400242};
243
244/*
245 * Promise 20230C and 20620 support
246 *
Alan Coxdefc9cd2008-01-10 14:33:10 -0800247 * This controller supports PIO0 to PIO2. We set PIO timings
248 * conservatively to allow for 50MHz Vesa Local Bus. The 20620 DMA
249 * support is weird being DMA to controller and PIO'd to the host
250 * and not supported.
Jeff Garzik669a5db2006-08-29 18:12:40 -0400251 */
252
253static void pdc20230_set_piomode(struct ata_port *ap, struct ata_device *adev)
254{
255 int tries = 5;
256 int pio = adev->pio_mode - XFER_PIO_0;
257 u8 rt;
258 unsigned long flags;
Jeff Garzik85cd7252006-08-31 00:03:49 -0400259
Jeff Garzik669a5db2006-08-29 18:12:40 -0400260 /* Safe as UP only. Force I/Os to occur together */
Jeff Garzik85cd7252006-08-31 00:03:49 -0400261
Jeff Garzik669a5db2006-08-29 18:12:40 -0400262 local_irq_save(flags);
Jeff Garzik85cd7252006-08-31 00:03:49 -0400263
Jeff Garzik669a5db2006-08-29 18:12:40 -0400264 /* Unlock the control interface */
Alan Coxdefc9cd2008-01-10 14:33:10 -0800265 do {
Jeff Garzik669a5db2006-08-29 18:12:40 -0400266 inb(0x1F5);
267 outb(inb(0x1F2) | 0x80, 0x1F2);
268 inb(0x1F2);
269 inb(0x3F6);
270 inb(0x3F6);
271 inb(0x1F2);
272 inb(0x1F2);
273 }
Alan Coxdefc9cd2008-01-10 14:33:10 -0800274 while ((inb(0x1F2) & 0x80) && --tries);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400275
276 local_irq_restore(flags);
Jeff Garzik85cd7252006-08-31 00:03:49 -0400277
Jeff Garzik669a5db2006-08-29 18:12:40 -0400278 outb(inb(0x1F4) & 0x07, 0x1F4);
279
280 rt = inb(0x1F3);
281 rt &= 0x07 << (3 * adev->devno);
282 if (pio)
283 rt |= (1 + 3 * pio) << (3 * adev->devno);
284
285 udelay(100);
286 outb(inb(0x1F2) | 0x01, 0x1F2);
287 udelay(100);
288 inb(0x1F5);
289
290}
291
Tejun Heo55dba312007-12-05 16:43:07 +0900292static unsigned int pdc_data_xfer_vlb(struct ata_device *dev,
Alan Coxdefc9cd2008-01-10 14:33:10 -0800293 unsigned char *buf, unsigned int buflen, int rw)
Jeff Garzik669a5db2006-08-29 18:12:40 -0400294{
Alan Coxc55af1f2009-02-11 13:08:42 -0800295 int slop = buflen & 3;
Zhenwen Xu16e6aec2009-04-17 15:32:59 +0800296 struct ata_port *ap = dev->link->ap;
297
Alan Coxc55af1f2009-02-11 13:08:42 -0800298 /* 32bit I/O capable *and* we need to write a whole number of dwords */
Alan Coxe3cf95d2009-04-09 17:31:17 +0100299 if (ata_id_has_dword_io(dev->id) && (slop == 0 || slop == 3)
300 && (ap->pflags & ATA_PFLAG_PIO32)) {
Tejun Heo55dba312007-12-05 16:43:07 +0900301 unsigned long flags;
302
Jeff Garzik669a5db2006-08-29 18:12:40 -0400303 local_irq_save(flags);
304
305 /* Perform the 32bit I/O synchronization sequence */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900306 ioread8(ap->ioaddr.nsect_addr);
307 ioread8(ap->ioaddr.nsect_addr);
308 ioread8(ap->ioaddr.nsect_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400309
310 /* Now the data */
Tejun Heo55dba312007-12-05 16:43:07 +0900311 if (rw == READ)
Tejun Heo0d5ff562007-02-01 15:06:36 +0900312 ioread32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
Tejun Heo55dba312007-12-05 16:43:07 +0900313 else
314 iowrite32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400315
316 if (unlikely(slop)) {
Harvey Harrison6ad67402008-06-18 17:16:43 -0700317 __le32 pad;
Tejun Heo55dba312007-12-05 16:43:07 +0900318 if (rw == READ) {
Al Virob50e56d2008-01-12 14:16:14 +0000319 pad = cpu_to_le32(ioread32(ap->ioaddr.data_addr));
Jeff Garzik669a5db2006-08-29 18:12:40 -0400320 memcpy(buf + buflen - slop, &pad, slop);
Tejun Heo55dba312007-12-05 16:43:07 +0900321 } else {
322 memcpy(&pad, buf + buflen - slop, slop);
323 iowrite32(le32_to_cpu(pad), ap->ioaddr.data_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400324 }
Tejun Heo55dba312007-12-05 16:43:07 +0900325 buflen += 4 - slop;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400326 }
327 local_irq_restore(flags);
Tejun Heo55dba312007-12-05 16:43:07 +0900328 } else
Tejun Heo9363c382008-04-07 22:47:16 +0900329 buflen = ata_sff_data_xfer_noirq(dev, buf, buflen, rw);
Tejun Heo55dba312007-12-05 16:43:07 +0900330
331 return buflen;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400332}
333
334static struct ata_port_operations pdc20230_port_ops = {
Tejun Heo029cfd62008-03-25 12:22:49 +0900335 .inherits = &legacy_base_port_ops,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400336 .set_piomode = pdc20230_set_piomode,
Tejun Heo5682ed32008-04-07 22:47:16 +0900337 .sff_data_xfer = pdc_data_xfer_vlb,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400338};
339
340/*
341 * Holtek 6560A support
342 *
Alan Coxdefc9cd2008-01-10 14:33:10 -0800343 * This controller supports PIO0 to PIO2 (no IORDY even though higher
344 * timings can be loaded).
Jeff Garzik669a5db2006-08-29 18:12:40 -0400345 */
346
347static void ht6560a_set_piomode(struct ata_port *ap, struct ata_device *adev)
348{
349 u8 active, recover;
350 struct ata_timing t;
351
352 /* Get the timing data in cycles. For now play safe at 50Mhz */
353 ata_timing_compute(adev, adev->pio_mode, &t, 20000, 1000);
354
Harvey Harrison07633b52008-05-14 16:17:00 -0700355 active = clamp_val(t.active, 2, 15);
356 recover = clamp_val(t.recover, 4, 15);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400357
358 inb(0x3E6);
359 inb(0x3E6);
360 inb(0x3E6);
361 inb(0x3E6);
362
Tejun Heo0d5ff562007-02-01 15:06:36 +0900363 iowrite8(recover << 4 | active, ap->ioaddr.device_addr);
364 ioread8(ap->ioaddr.status_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400365}
366
367static struct ata_port_operations ht6560a_port_ops = {
Tejun Heo029cfd62008-03-25 12:22:49 +0900368 .inherits = &legacy_base_port_ops,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400369 .set_piomode = ht6560a_set_piomode,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400370};
371
372/*
373 * Holtek 6560B support
374 *
Alan Coxdefc9cd2008-01-10 14:33:10 -0800375 * This controller supports PIO0 to PIO4. We honour the BIOS/jumper FIFO
376 * setting unless we see an ATAPI device in which case we force it off.
Jeff Garzik669a5db2006-08-29 18:12:40 -0400377 *
378 * FIXME: need to implement 2nd channel support.
379 */
380
381static void ht6560b_set_piomode(struct ata_port *ap, struct ata_device *adev)
382{
383 u8 active, recover;
384 struct ata_timing t;
385
386 /* Get the timing data in cycles. For now play safe at 50Mhz */
387 ata_timing_compute(adev, adev->pio_mode, &t, 20000, 1000);
388
Harvey Harrison07633b52008-05-14 16:17:00 -0700389 active = clamp_val(t.active, 2, 15);
390 recover = clamp_val(t.recover, 2, 16);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400391 recover &= 0x15;
392
393 inb(0x3E6);
394 inb(0x3E6);
395 inb(0x3E6);
396 inb(0x3E6);
397
Tejun Heo0d5ff562007-02-01 15:06:36 +0900398 iowrite8(recover << 4 | active, ap->ioaddr.device_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400399
400 if (adev->class != ATA_DEV_ATA) {
401 u8 rconf = inb(0x3E6);
402 if (rconf & 0x24) {
Alan Coxdefc9cd2008-01-10 14:33:10 -0800403 rconf &= ~0x24;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400404 outb(rconf, 0x3E6);
405 }
406 }
Tejun Heo0d5ff562007-02-01 15:06:36 +0900407 ioread8(ap->ioaddr.status_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400408}
409
410static struct ata_port_operations ht6560b_port_ops = {
Tejun Heo029cfd62008-03-25 12:22:49 +0900411 .inherits = &legacy_base_port_ops,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400412 .set_piomode = ht6560b_set_piomode,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400413};
414
415/*
416 * Opti core chipset helpers
417 */
Jeff Garzik85cd7252006-08-31 00:03:49 -0400418
Jeff Garzik669a5db2006-08-29 18:12:40 -0400419/**
420 * opti_syscfg - read OPTI chipset configuration
421 * @reg: Configuration register to read
422 *
423 * Returns the value of an OPTI system board configuration register.
424 */
425
426static u8 opti_syscfg(u8 reg)
427{
428 unsigned long flags;
429 u8 r;
Jeff Garzik85cd7252006-08-31 00:03:49 -0400430
Jeff Garzik669a5db2006-08-29 18:12:40 -0400431 /* Uniprocessor chipset and must force cycles adjancent */
432 local_irq_save(flags);
433 outb(reg, 0x22);
434 r = inb(0x24);
435 local_irq_restore(flags);
436 return r;
437}
438
439/*
440 * Opti 82C611A
441 *
442 * This controller supports PIO0 to PIO3.
443 */
444
Alan Coxdefc9cd2008-01-10 14:33:10 -0800445static void opti82c611a_set_piomode(struct ata_port *ap,
446 struct ata_device *adev)
Jeff Garzik669a5db2006-08-29 18:12:40 -0400447{
448 u8 active, recover, setup;
449 struct ata_timing t;
450 struct ata_device *pair = ata_dev_pair(adev);
451 int clock;
452 int khz[4] = { 50000, 40000, 33000, 25000 };
453 u8 rc;
454
455 /* Enter configuration mode */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900456 ioread16(ap->ioaddr.error_addr);
457 ioread16(ap->ioaddr.error_addr);
458 iowrite8(3, ap->ioaddr.nsect_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400459
460 /* Read VLB clock strapping */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900461 clock = 1000000000 / khz[ioread8(ap->ioaddr.lbah_addr) & 0x03];
Jeff Garzik669a5db2006-08-29 18:12:40 -0400462
463 /* Get the timing data in cycles */
464 ata_timing_compute(adev, adev->pio_mode, &t, clock, 1000);
465
466 /* Setup timing is shared */
467 if (pair) {
468 struct ata_timing tp;
469 ata_timing_compute(pair, pair->pio_mode, &tp, clock, 1000);
470
471 ata_timing_merge(&t, &tp, &t, ATA_TIMING_SETUP);
472 }
473
Harvey Harrison07633b52008-05-14 16:17:00 -0700474 active = clamp_val(t.active, 2, 17) - 2;
475 recover = clamp_val(t.recover, 1, 16) - 1;
476 setup = clamp_val(t.setup, 1, 4) - 1;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400477
478 /* Select the right timing bank for write timing */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900479 rc = ioread8(ap->ioaddr.lbal_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400480 rc &= 0x7F;
481 rc |= (adev->devno << 7);
Tejun Heo0d5ff562007-02-01 15:06:36 +0900482 iowrite8(rc, ap->ioaddr.lbal_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400483
484 /* Write the timings */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900485 iowrite8(active << 4 | recover, ap->ioaddr.error_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400486
487 /* Select the right bank for read timings, also
488 load the shared timings for address */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900489 rc = ioread8(ap->ioaddr.device_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400490 rc &= 0xC0;
491 rc |= adev->devno; /* Index select */
492 rc |= (setup << 4) | 0x04;
Tejun Heo0d5ff562007-02-01 15:06:36 +0900493 iowrite8(rc, ap->ioaddr.device_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400494
495 /* Load the read timings */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900496 iowrite8(active << 4 | recover, ap->ioaddr.data_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400497
498 /* Ensure the timing register mode is right */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900499 rc = ioread8(ap->ioaddr.lbal_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400500 rc &= 0x73;
501 rc |= 0x84;
Tejun Heo0d5ff562007-02-01 15:06:36 +0900502 iowrite8(rc, ap->ioaddr.lbal_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400503
504 /* Exit command mode */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900505 iowrite8(0x83, ap->ioaddr.nsect_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400506}
507
508
509static struct ata_port_operations opti82c611a_port_ops = {
Tejun Heo029cfd62008-03-25 12:22:49 +0900510 .inherits = &legacy_base_port_ops,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400511 .set_piomode = opti82c611a_set_piomode,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400512};
513
514/*
515 * Opti 82C465MV
516 *
517 * This controller supports PIO0 to PIO3. Unlike the 611A the MVB
518 * version is dual channel but doesn't have a lot of unique registers.
519 */
520
521static void opti82c46x_set_piomode(struct ata_port *ap, struct ata_device *adev)
522{
523 u8 active, recover, setup;
524 struct ata_timing t;
525 struct ata_device *pair = ata_dev_pair(adev);
526 int clock;
527 int khz[4] = { 50000, 40000, 33000, 25000 };
528 u8 rc;
529 u8 sysclk;
530
531 /* Get the clock */
532 sysclk = opti_syscfg(0xAC) & 0xC0; /* BIOS set */
533
534 /* Enter configuration mode */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900535 ioread16(ap->ioaddr.error_addr);
536 ioread16(ap->ioaddr.error_addr);
537 iowrite8(3, ap->ioaddr.nsect_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400538
539 /* Read VLB clock strapping */
540 clock = 1000000000 / khz[sysclk];
541
542 /* Get the timing data in cycles */
543 ata_timing_compute(adev, adev->pio_mode, &t, clock, 1000);
544
545 /* Setup timing is shared */
546 if (pair) {
547 struct ata_timing tp;
548 ata_timing_compute(pair, pair->pio_mode, &tp, clock, 1000);
549
550 ata_timing_merge(&t, &tp, &t, ATA_TIMING_SETUP);
551 }
552
Harvey Harrison07633b52008-05-14 16:17:00 -0700553 active = clamp_val(t.active, 2, 17) - 2;
554 recover = clamp_val(t.recover, 1, 16) - 1;
555 setup = clamp_val(t.setup, 1, 4) - 1;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400556
557 /* Select the right timing bank for write timing */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900558 rc = ioread8(ap->ioaddr.lbal_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400559 rc &= 0x7F;
560 rc |= (adev->devno << 7);
Tejun Heo0d5ff562007-02-01 15:06:36 +0900561 iowrite8(rc, ap->ioaddr.lbal_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400562
563 /* Write the timings */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900564 iowrite8(active << 4 | recover, ap->ioaddr.error_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400565
566 /* Select the right bank for read timings, also
567 load the shared timings for address */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900568 rc = ioread8(ap->ioaddr.device_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400569 rc &= 0xC0;
570 rc |= adev->devno; /* Index select */
571 rc |= (setup << 4) | 0x04;
Tejun Heo0d5ff562007-02-01 15:06:36 +0900572 iowrite8(rc, ap->ioaddr.device_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400573
574 /* Load the read timings */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900575 iowrite8(active << 4 | recover, ap->ioaddr.data_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400576
577 /* Ensure the timing register mode is right */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900578 rc = ioread8(ap->ioaddr.lbal_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400579 rc &= 0x73;
580 rc |= 0x84;
Tejun Heo0d5ff562007-02-01 15:06:36 +0900581 iowrite8(rc, ap->ioaddr.lbal_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400582
583 /* Exit command mode */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900584 iowrite8(0x83, ap->ioaddr.nsect_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400585
586 /* We need to know this for quad device on the MVB */
587 ap->host->private_data = ap;
588}
589
590/**
Tejun Heo9363c382008-04-07 22:47:16 +0900591 * opt82c465mv_qc_issue - command issue
Jeff Garzik669a5db2006-08-29 18:12:40 -0400592 * @qc: command pending
593 *
594 * Called when the libata layer is about to issue a command. We wrap
595 * this interface so that we can load the correct ATA timings. The
596 * MVB has a single set of timing registers and these are shared
597 * across channels. As there are two registers we really ought to
598 * track the last two used values as a sort of register window. For
599 * now we just reload on a channel switch. On the single channel
600 * setup this condition never fires so we do nothing extra.
601 *
602 * FIXME: dual channel needs ->serialize support
603 */
604
Tejun Heo9363c382008-04-07 22:47:16 +0900605static unsigned int opti82c46x_qc_issue(struct ata_queued_cmd *qc)
Jeff Garzik669a5db2006-08-29 18:12:40 -0400606{
607 struct ata_port *ap = qc->ap;
608 struct ata_device *adev = qc->dev;
609
610 /* If timings are set and for the wrong channel (2nd test is
611 due to a libata shortcoming and will eventually go I hope) */
612 if (ap->host->private_data != ap->host
613 && ap->host->private_data != NULL)
614 opti82c46x_set_piomode(ap, adev);
615
Tejun Heo9363c382008-04-07 22:47:16 +0900616 return ata_sff_qc_issue(qc);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400617}
618
619static struct ata_port_operations opti82c46x_port_ops = {
Tejun Heo029cfd62008-03-25 12:22:49 +0900620 .inherits = &legacy_base_port_ops,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400621 .set_piomode = opti82c46x_set_piomode,
Tejun Heo9363c382008-04-07 22:47:16 +0900622 .qc_issue = opti82c46x_qc_issue,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400623};
624
Alan Coxdefc9cd2008-01-10 14:33:10 -0800625static void qdi6500_set_piomode(struct ata_port *ap, struct ata_device *adev)
626{
627 struct ata_timing t;
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800628 struct legacy_data *ld_qdi = ap->host->private_data;
Alan Coxdefc9cd2008-01-10 14:33:10 -0800629 int active, recovery;
630 u8 timing;
631
632 /* Get the timing data in cycles */
633 ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
634
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800635 if (ld_qdi->fast) {
Harvey Harrison07633b52008-05-14 16:17:00 -0700636 active = 8 - clamp_val(t.active, 1, 8);
637 recovery = 18 - clamp_val(t.recover, 3, 18);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800638 } else {
Harvey Harrison07633b52008-05-14 16:17:00 -0700639 active = 9 - clamp_val(t.active, 2, 9);
640 recovery = 15 - clamp_val(t.recover, 0, 15);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800641 }
642 timing = (recovery << 4) | active | 0x08;
643
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800644 ld_qdi->clock[adev->devno] = timing;
Alan Coxdefc9cd2008-01-10 14:33:10 -0800645
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800646 outb(timing, ld_qdi->timing);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800647}
Jeff Garzik669a5db2006-08-29 18:12:40 -0400648
649/**
Alan Coxdefc9cd2008-01-10 14:33:10 -0800650 * qdi6580dp_set_piomode - PIO setup for dual channel
651 * @ap: Port
652 * @adev: Device
Jeff Garzik669a5db2006-08-29 18:12:40 -0400653 *
Alan Coxdefc9cd2008-01-10 14:33:10 -0800654 * In dual channel mode the 6580 has one clock per channel and we have
Tejun Heo9363c382008-04-07 22:47:16 +0900655 * to software clockswitch in qc_issue.
Jeff Garzik669a5db2006-08-29 18:12:40 -0400656 */
657
Alan Coxdefc9cd2008-01-10 14:33:10 -0800658static void qdi6580dp_set_piomode(struct ata_port *ap, struct ata_device *adev)
Jeff Garzik669a5db2006-08-29 18:12:40 -0400659{
Alan Coxdefc9cd2008-01-10 14:33:10 -0800660 struct ata_timing t;
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800661 struct legacy_data *ld_qdi = ap->host->private_data;
Alan Coxdefc9cd2008-01-10 14:33:10 -0800662 int active, recovery;
663 u8 timing;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400664
Alan Coxdefc9cd2008-01-10 14:33:10 -0800665 /* Get the timing data in cycles */
666 ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
Tejun Heo24dc5f32007-01-20 16:00:28 +0900667
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800668 if (ld_qdi->fast) {
Harvey Harrison07633b52008-05-14 16:17:00 -0700669 active = 8 - clamp_val(t.active, 1, 8);
670 recovery = 18 - clamp_val(t.recover, 3, 18);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800671 } else {
Harvey Harrison07633b52008-05-14 16:17:00 -0700672 active = 9 - clamp_val(t.active, 2, 9);
673 recovery = 15 - clamp_val(t.recover, 0, 15);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400674 }
Alan Coxdefc9cd2008-01-10 14:33:10 -0800675 timing = (recovery << 4) | active | 0x08;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400676
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800677 ld_qdi->clock[adev->devno] = timing;
Jeff Garzik85cd7252006-08-31 00:03:49 -0400678
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800679 outb(timing, ld_qdi->timing + 2 * ap->port_no);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800680 /* Clear the FIFO */
681 if (adev->class != ATA_DEV_ATA)
Bartlomiej Zolnierkiewicz6809e732009-12-03 20:32:11 +0100682 outb(0x5F, (ld_qdi->timing & 0xFFF0) + 3);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800683}
684
685/**
686 * qdi6580_set_piomode - PIO setup for single channel
687 * @ap: Port
688 * @adev: Device
689 *
690 * In single channel mode the 6580 has one clock per device and we can
691 * avoid the requirement to clock switch. We also have to load the timing
692 * into the right clock according to whether we are master or slave.
693 */
694
695static void qdi6580_set_piomode(struct ata_port *ap, struct ata_device *adev)
696{
697 struct ata_timing t;
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800698 struct legacy_data *ld_qdi = ap->host->private_data;
Alan Coxdefc9cd2008-01-10 14:33:10 -0800699 int active, recovery;
700 u8 timing;
701
702 /* Get the timing data in cycles */
703 ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
704
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800705 if (ld_qdi->fast) {
Harvey Harrison07633b52008-05-14 16:17:00 -0700706 active = 8 - clamp_val(t.active, 1, 8);
707 recovery = 18 - clamp_val(t.recover, 3, 18);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800708 } else {
Harvey Harrison07633b52008-05-14 16:17:00 -0700709 active = 9 - clamp_val(t.active, 2, 9);
710 recovery = 15 - clamp_val(t.recover, 0, 15);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800711 }
712 timing = (recovery << 4) | active | 0x08;
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800713 ld_qdi->clock[adev->devno] = timing;
714 outb(timing, ld_qdi->timing + 2 * adev->devno);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800715 /* Clear the FIFO */
716 if (adev->class != ATA_DEV_ATA)
Bartlomiej Zolnierkiewicz6809e732009-12-03 20:32:11 +0100717 outb(0x5F, (ld_qdi->timing & 0xFFF0) + 3);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800718}
719
720/**
Tejun Heo9363c382008-04-07 22:47:16 +0900721 * qdi_qc_issue - command issue
Alan Coxdefc9cd2008-01-10 14:33:10 -0800722 * @qc: command pending
723 *
724 * Called when the libata layer is about to issue a command. We wrap
725 * this interface so that we can load the correct ATA timings.
726 */
727
Tejun Heo9363c382008-04-07 22:47:16 +0900728static unsigned int qdi_qc_issue(struct ata_queued_cmd *qc)
Alan Coxdefc9cd2008-01-10 14:33:10 -0800729{
730 struct ata_port *ap = qc->ap;
731 struct ata_device *adev = qc->dev;
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800732 struct legacy_data *ld_qdi = ap->host->private_data;
Alan Coxdefc9cd2008-01-10 14:33:10 -0800733
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800734 if (ld_qdi->clock[adev->devno] != ld_qdi->last) {
Alan Coxdefc9cd2008-01-10 14:33:10 -0800735 if (adev->pio_mode) {
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800736 ld_qdi->last = ld_qdi->clock[adev->devno];
737 outb(ld_qdi->clock[adev->devno], ld_qdi->timing +
Alan Coxdefc9cd2008-01-10 14:33:10 -0800738 2 * ap->port_no);
739 }
740 }
Tejun Heo9363c382008-04-07 22:47:16 +0900741 return ata_sff_qc_issue(qc);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800742}
743
Alan Coxb8325482008-01-19 15:47:23 +0000744static unsigned int vlb32_data_xfer(struct ata_device *adev, unsigned char *buf,
Alan Coxdefc9cd2008-01-10 14:33:10 -0800745 unsigned int buflen, int rw)
746{
747 struct ata_port *ap = adev->link->ap;
748 int slop = buflen & 3;
749
Alan Coxe3cf95d2009-04-09 17:31:17 +0100750 if (ata_id_has_dword_io(adev->id) && (slop == 0 || slop == 3)
751 && (ap->pflags & ATA_PFLAG_PIO32)) {
Alan Coxdefc9cd2008-01-10 14:33:10 -0800752 if (rw == WRITE)
753 iowrite32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
754 else
755 ioread32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
756
757 if (unlikely(slop)) {
Harvey Harrison6ad67402008-06-18 17:16:43 -0700758 __le32 pad;
Alan Coxdefc9cd2008-01-10 14:33:10 -0800759 if (rw == WRITE) {
760 memcpy(&pad, buf + buflen - slop, slop);
Harvey Harrison6ad67402008-06-18 17:16:43 -0700761 iowrite32(le32_to_cpu(pad), ap->ioaddr.data_addr);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800762 } else {
Harvey Harrison6ad67402008-06-18 17:16:43 -0700763 pad = cpu_to_le32(ioread32(ap->ioaddr.data_addr));
Alan Coxdefc9cd2008-01-10 14:33:10 -0800764 memcpy(buf + buflen - slop, &pad, slop);
765 }
766 }
767 return (buflen + 3) & ~3;
768 } else
Tejun Heo9363c382008-04-07 22:47:16 +0900769 return ata_sff_data_xfer(adev, buf, buflen, rw);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800770}
771
Alan Coxb8325482008-01-19 15:47:23 +0000772static int qdi_port(struct platform_device *dev,
773 struct legacy_probe *lp, struct legacy_data *ld)
774{
775 if (devm_request_region(&dev->dev, lp->private, 4, "qdi") == NULL)
776 return -EBUSY;
777 ld->timing = lp->private;
778 return 0;
779}
780
Alan Coxdefc9cd2008-01-10 14:33:10 -0800781static struct ata_port_operations qdi6500_port_ops = {
Tejun Heo029cfd62008-03-25 12:22:49 +0900782 .inherits = &legacy_base_port_ops,
Alan Coxdefc9cd2008-01-10 14:33:10 -0800783 .set_piomode = qdi6500_set_piomode,
Tejun Heo9363c382008-04-07 22:47:16 +0900784 .qc_issue = qdi_qc_issue,
Tejun Heo5682ed32008-04-07 22:47:16 +0900785 .sff_data_xfer = vlb32_data_xfer,
Alan Coxdefc9cd2008-01-10 14:33:10 -0800786};
787
788static struct ata_port_operations qdi6580_port_ops = {
Tejun Heo029cfd62008-03-25 12:22:49 +0900789 .inherits = &legacy_base_port_ops,
Alan Coxdefc9cd2008-01-10 14:33:10 -0800790 .set_piomode = qdi6580_set_piomode,
Tejun Heo5682ed32008-04-07 22:47:16 +0900791 .sff_data_xfer = vlb32_data_xfer,
Alan Coxdefc9cd2008-01-10 14:33:10 -0800792};
793
794static struct ata_port_operations qdi6580dp_port_ops = {
Tejun Heo029cfd62008-03-25 12:22:49 +0900795 .inherits = &legacy_base_port_ops,
Alan Coxdefc9cd2008-01-10 14:33:10 -0800796 .set_piomode = qdi6580dp_set_piomode,
Bartlomiej Zolnierkiewicz43c7d172009-12-03 20:32:11 +0100797 .qc_issue = qdi_qc_issue,
Tejun Heo5682ed32008-04-07 22:47:16 +0900798 .sff_data_xfer = vlb32_data_xfer,
Alan Coxdefc9cd2008-01-10 14:33:10 -0800799};
800
Alan Coxb8325482008-01-19 15:47:23 +0000801static DEFINE_SPINLOCK(winbond_lock);
802
803static void winbond_writecfg(unsigned long port, u8 reg, u8 val)
804{
805 unsigned long flags;
806 spin_lock_irqsave(&winbond_lock, flags);
807 outb(reg, port + 0x01);
808 outb(val, port + 0x02);
809 spin_unlock_irqrestore(&winbond_lock, flags);
810}
811
812static u8 winbond_readcfg(unsigned long port, u8 reg)
813{
814 u8 val;
815
816 unsigned long flags;
817 spin_lock_irqsave(&winbond_lock, flags);
818 outb(reg, port + 0x01);
819 val = inb(port + 0x02);
820 spin_unlock_irqrestore(&winbond_lock, flags);
821
822 return val;
823}
824
825static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev)
826{
827 struct ata_timing t;
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800828 struct legacy_data *ld_winbond = ap->host->private_data;
Alan Coxb8325482008-01-19 15:47:23 +0000829 int active, recovery;
830 u8 reg;
831 int timing = 0x88 + (ap->port_no * 4) + (adev->devno * 2);
832
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800833 reg = winbond_readcfg(ld_winbond->timing, 0x81);
Alan Coxb8325482008-01-19 15:47:23 +0000834
835 /* Get the timing data in cycles */
836 if (reg & 0x40) /* Fast VLB bus, assume 50MHz */
837 ata_timing_compute(adev, adev->pio_mode, &t, 20000, 1000);
838 else
839 ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
840
Harvey Harrison07633b52008-05-14 16:17:00 -0700841 active = (clamp_val(t.active, 3, 17) - 1) & 0x0F;
842 recovery = (clamp_val(t.recover, 1, 15) + 1) & 0x0F;
Alan Coxb8325482008-01-19 15:47:23 +0000843 timing = (active << 4) | recovery;
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800844 winbond_writecfg(ld_winbond->timing, timing, reg);
Alan Coxb8325482008-01-19 15:47:23 +0000845
846 /* Load the setup timing */
847
848 reg = 0x35;
849 if (adev->class != ATA_DEV_ATA)
850 reg |= 0x08; /* FIFO off */
851 if (!ata_pio_need_iordy(adev))
852 reg |= 0x02; /* IORDY off */
Harvey Harrison07633b52008-05-14 16:17:00 -0700853 reg |= (clamp_val(t.setup, 0, 3) << 6);
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800854 winbond_writecfg(ld_winbond->timing, timing + 1, reg);
Alan Coxb8325482008-01-19 15:47:23 +0000855}
856
857static int winbond_port(struct platform_device *dev,
858 struct legacy_probe *lp, struct legacy_data *ld)
859{
860 if (devm_request_region(&dev->dev, lp->private, 4, "winbond") == NULL)
861 return -EBUSY;
862 ld->timing = lp->private;
863 return 0;
864}
865
866static struct ata_port_operations winbond_port_ops = {
Tejun Heo029cfd62008-03-25 12:22:49 +0900867 .inherits = &legacy_base_port_ops,
Alan Coxb8325482008-01-19 15:47:23 +0000868 .set_piomode = winbond_set_piomode,
Tejun Heo5682ed32008-04-07 22:47:16 +0900869 .sff_data_xfer = vlb32_data_xfer,
Alan Coxb8325482008-01-19 15:47:23 +0000870};
871
Alan Coxdefc9cd2008-01-10 14:33:10 -0800872static struct legacy_controller controllers[] = {
873 {"BIOS", &legacy_port_ops, 0x1F,
Alan Coxe3cf95d2009-04-09 17:31:17 +0100874 ATA_FLAG_NO_IORDY, 0, NULL },
Alan Coxdefc9cd2008-01-10 14:33:10 -0800875 {"Snooping", &simple_port_ops, 0x1F,
Alan Coxe3cf95d2009-04-09 17:31:17 +0100876 0, 0, NULL },
Alan Coxdefc9cd2008-01-10 14:33:10 -0800877 {"PDC20230", &pdc20230_port_ops, 0x7,
Alan Coxe3cf95d2009-04-09 17:31:17 +0100878 ATA_FLAG_NO_IORDY,
Zhenwen Xu16e6aec2009-04-17 15:32:59 +0800879 ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32CHANGE, NULL },
Alan Coxdefc9cd2008-01-10 14:33:10 -0800880 {"HT6560A", &ht6560a_port_ops, 0x07,
Alan Coxe3cf95d2009-04-09 17:31:17 +0100881 ATA_FLAG_NO_IORDY, 0, NULL },
Alan Coxdefc9cd2008-01-10 14:33:10 -0800882 {"HT6560B", &ht6560b_port_ops, 0x1F,
Alan Coxe3cf95d2009-04-09 17:31:17 +0100883 ATA_FLAG_NO_IORDY, 0, NULL },
Alan Coxdefc9cd2008-01-10 14:33:10 -0800884 {"OPTI82C611A", &opti82c611a_port_ops, 0x0F,
Alan Coxe3cf95d2009-04-09 17:31:17 +0100885 0, 0, NULL },
Alan Coxdefc9cd2008-01-10 14:33:10 -0800886 {"OPTI82C46X", &opti82c46x_port_ops, 0x0F,
Alan Coxe3cf95d2009-04-09 17:31:17 +0100887 0, 0, NULL },
Alan Coxdefc9cd2008-01-10 14:33:10 -0800888 {"QDI6500", &qdi6500_port_ops, 0x07,
Alan Coxe3cf95d2009-04-09 17:31:17 +0100889 ATA_FLAG_NO_IORDY,
Zhenwen Xu16e6aec2009-04-17 15:32:59 +0800890 ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32CHANGE, qdi_port },
Alan Coxdefc9cd2008-01-10 14:33:10 -0800891 {"QDI6580", &qdi6580_port_ops, 0x1F,
Zhenwen Xu16e6aec2009-04-17 15:32:59 +0800892 0, ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32CHANGE, qdi_port },
Alan Coxdefc9cd2008-01-10 14:33:10 -0800893 {"QDI6580DP", &qdi6580dp_port_ops, 0x1F,
Zhenwen Xu16e6aec2009-04-17 15:32:59 +0800894 0, ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32CHANGE, qdi_port },
Alan Coxb8325482008-01-19 15:47:23 +0000895 {"W83759A", &winbond_port_ops, 0x1F,
Zhenwen Xu16e6aec2009-04-17 15:32:59 +0800896 0, ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32CHANGE,
Alan Coxe3cf95d2009-04-09 17:31:17 +0100897 winbond_port }
Alan Coxdefc9cd2008-01-10 14:33:10 -0800898};
899
900/**
901 * probe_chip_type - Discover controller
902 * @probe: Probe entry to check
903 *
904 * Probe an ATA port and identify the type of controller. We don't
905 * check if the controller appears to be driveless at this point.
906 */
907
Alan Coxb8325482008-01-19 15:47:23 +0000908static __init int probe_chip_type(struct legacy_probe *probe)
Alan Coxdefc9cd2008-01-10 14:33:10 -0800909{
910 int mask = 1 << probe->slot;
911
Alan Coxb8325482008-01-19 15:47:23 +0000912 if (winbond && (probe->port == 0x1F0 || probe->port == 0x170)) {
913 u8 reg = winbond_readcfg(winbond, 0x81);
914 reg |= 0x80; /* jumpered mode off */
915 winbond_writecfg(winbond, 0x81, reg);
916 reg = winbond_readcfg(winbond, 0x83);
917 reg |= 0xF0; /* local control */
918 winbond_writecfg(winbond, 0x83, reg);
919 reg = winbond_readcfg(winbond, 0x85);
920 reg |= 0xF0; /* programmable timing */
921 winbond_writecfg(winbond, 0x85, reg);
922
923 reg = winbond_readcfg(winbond, 0x81);
924
925 if (reg & mask)
926 return W83759A;
927 }
Alan Coxdefc9cd2008-01-10 14:33:10 -0800928 if (probe->port == 0x1F0) {
Jeff Garzik669a5db2006-08-29 18:12:40 -0400929 unsigned long flags;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400930 local_irq_save(flags);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400931 /* Probes */
Jeff Garzik669a5db2006-08-29 18:12:40 -0400932 outb(inb(0x1F2) | 0x80, 0x1F2);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800933 inb(0x1F5);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400934 inb(0x1F2);
935 inb(0x3F6);
936 inb(0x3F6);
937 inb(0x1F2);
938 inb(0x1F2);
939
940 if ((inb(0x1F2) & 0x80) == 0) {
941 /* PDC20230c or 20630 ? */
Alan Coxdefc9cd2008-01-10 14:33:10 -0800942 printk(KERN_INFO "PDC20230-C/20630 VLB ATA controller"
943 " detected.\n");
Jeff Garzik669a5db2006-08-29 18:12:40 -0400944 udelay(100);
945 inb(0x1F5);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800946 local_irq_restore(flags);
947 return PDC20230;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400948 } else {
949 outb(0x55, 0x1F2);
950 inb(0x1F2);
951 inb(0x1F2);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800952 if (inb(0x1F2) == 0x00)
953 printk(KERN_INFO "PDC20230-B VLB ATA "
954 "controller detected.\n");
955 local_irq_restore(flags);
956 return BIOS;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400957 }
958 local_irq_restore(flags);
959 }
960
Alan Coxdefc9cd2008-01-10 14:33:10 -0800961 if (ht6560a & mask)
962 return HT6560A;
963 if (ht6560b & mask)
964 return HT6560B;
965 if (opti82c611a & mask)
966 return OPTI611A;
967 if (opti82c46x & mask)
968 return OPTI46X;
969 if (autospeed & mask)
970 return SNOOP;
971 return BIOS;
972}
Jeff Garzik669a5db2006-08-29 18:12:40 -0400973
Alan Coxdefc9cd2008-01-10 14:33:10 -0800974
975/**
976 * legacy_init_one - attach a legacy interface
977 * @pl: probe record
978 *
979 * Register an ISA bus IDE interface. Such interfaces are PIO and we
980 * assume do not support IRQ sharing.
981 */
982
983static __init int legacy_init_one(struct legacy_probe *probe)
984{
985 struct legacy_controller *controller = &controllers[probe->type];
986 int pio_modes = controller->pio_mask;
987 unsigned long io = probe->port;
988 u32 mask = (1 << probe->slot);
989 struct ata_port_operations *ops = controller->ops;
990 struct legacy_data *ld = &legacy_data[probe->slot];
991 struct ata_host *host = NULL;
992 struct ata_port *ap;
993 struct platform_device *pdev;
994 struct ata_device *dev;
995 void __iomem *io_addr, *ctrl_addr;
996 u32 iordy = (iordy_mask & mask) ? 0: ATA_FLAG_NO_IORDY;
997 int ret;
998
999 iordy |= controller->flags;
1000
1001 pdev = platform_device_register_simple(DRV_NAME, probe->slot, NULL, 0);
1002 if (IS_ERR(pdev))
1003 return PTR_ERR(pdev);
1004
1005 ret = -EBUSY;
1006 if (devm_request_region(&pdev->dev, io, 8, "pata_legacy") == NULL ||
1007 devm_request_region(&pdev->dev, io + 0x0206, 1,
1008 "pata_legacy") == NULL)
1009 goto fail;
Alan Coxf834e492007-02-07 13:46:00 -08001010
Tejun Heo5d728822007-04-17 23:44:08 +09001011 ret = -ENOMEM;
Alan Coxdefc9cd2008-01-10 14:33:10 -08001012 io_addr = devm_ioport_map(&pdev->dev, io, 8);
1013 ctrl_addr = devm_ioport_map(&pdev->dev, io + 0x0206, 1);
1014 if (!io_addr || !ctrl_addr)
1015 goto fail;
1016 if (controller->setup)
Alan Coxb8325482008-01-19 15:47:23 +00001017 if (controller->setup(pdev, probe, ld) < 0)
Alan Coxdefc9cd2008-01-10 14:33:10 -08001018 goto fail;
Tejun Heo5d728822007-04-17 23:44:08 +09001019 host = ata_host_alloc(&pdev->dev, 1);
1020 if (!host)
1021 goto fail;
1022 ap = host->ports[0];
Jeff Garzik669a5db2006-08-29 18:12:40 -04001023
Tejun Heo5d728822007-04-17 23:44:08 +09001024 ap->ops = ops;
1025 ap->pio_mask = pio_modes;
1026 ap->flags |= ATA_FLAG_SLAVE_POSS | iordy;
Alan Coxe3cf95d2009-04-09 17:31:17 +01001027 ap->pflags |= controller->pflags;
Tejun Heo5d728822007-04-17 23:44:08 +09001028 ap->ioaddr.cmd_addr = io_addr;
1029 ap->ioaddr.altstatus_addr = ctrl_addr;
1030 ap->ioaddr.ctl_addr = ctrl_addr;
Tejun Heo9363c382008-04-07 22:47:16 +09001031 ata_sff_std_ports(&ap->ioaddr);
Alan Coxb8325482008-01-19 15:47:23 +00001032 ap->host->private_data = ld;
Tejun Heo5d728822007-04-17 23:44:08 +09001033
Alan Coxdefc9cd2008-01-10 14:33:10 -08001034 ata_port_desc(ap, "cmd 0x%lx ctl 0x%lx", io, io + 0x0206);
Tejun Heocbcdd872007-08-18 13:14:55 +09001035
Tejun Heo9363c382008-04-07 22:47:16 +09001036 ret = ata_host_activate(host, probe->irq, ata_sff_interrupt, 0,
1037 &legacy_sht);
Tejun Heo5d728822007-04-17 23:44:08 +09001038 if (ret)
Jeff Garzik669a5db2006-08-29 18:12:40 -04001039 goto fail;
James Bottomley45bc9552009-06-05 10:41:39 -04001040 async_synchronize_full();
Jeff Garzik669a5db2006-08-29 18:12:40 -04001041 ld->platform_dev = pdev;
Jeff Garzik669a5db2006-08-29 18:12:40 -04001042
Alan Coxdefc9cd2008-01-10 14:33:10 -08001043 /* Nothing found means we drop the port as its probably not there */
1044
1045 ret = -ENODEV;
Tejun Heo1eca4362008-11-03 20:03:17 +09001046 ata_for_each_dev(dev, &ap->link, ALL) {
Alan Coxdefc9cd2008-01-10 14:33:10 -08001047 if (!ata_dev_absent(dev)) {
1048 legacy_host[probe->slot] = host;
1049 ld->platform_dev = pdev;
1050 return 0;
1051 }
1052 }
Tejun Heo20cbf5f2009-04-14 12:59:03 +09001053 ata_host_detach(host);
Jeff Garzik669a5db2006-08-29 18:12:40 -04001054fail:
1055 platform_device_unregister(pdev);
Jeff Garzik669a5db2006-08-29 18:12:40 -04001056 return ret;
1057}
1058
1059/**
1060 * legacy_check_special_cases - ATA special cases
1061 * @p: PCI device to check
1062 * @master: set this if we find an ATA master
1063 * @master: set this if we find an ATA secondary
1064 *
Alan Coxdefc9cd2008-01-10 14:33:10 -08001065 * A small number of vendors implemented early PCI ATA interfaces
1066 * on bridge logic without the ATA interface being PCI visible.
1067 * Where we have a matching PCI driver we must skip the relevant
1068 * device here. If we don't know about it then the legacy driver
1069 * is the right driver anyway.
Jeff Garzik669a5db2006-08-29 18:12:40 -04001070 */
1071
Alan Coxb8325482008-01-19 15:47:23 +00001072static void __init legacy_check_special_cases(struct pci_dev *p, int *primary,
Alan Coxdefc9cd2008-01-10 14:33:10 -08001073 int *secondary)
Jeff Garzik669a5db2006-08-29 18:12:40 -04001074{
1075 /* Cyrix CS5510 pre SFF MWDMA ATA on the bridge */
1076 if (p->vendor == 0x1078 && p->device == 0x0000) {
1077 *primary = *secondary = 1;
1078 return;
1079 }
1080 /* Cyrix CS5520 pre SFF MWDMA ATA on the bridge */
1081 if (p->vendor == 0x1078 && p->device == 0x0002) {
1082 *primary = *secondary = 1;
1083 return;
1084 }
1085 /* Intel MPIIX - PIO ATA on non PCI side of bridge */
1086 if (p->vendor == 0x8086 && p->device == 0x1234) {
1087 u16 r;
1088 pci_read_config_word(p, 0x6C, &r);
Alan Coxdefc9cd2008-01-10 14:33:10 -08001089 if (r & 0x8000) {
1090 /* ATA port enabled */
Jeff Garzik669a5db2006-08-29 18:12:40 -04001091 if (r & 0x4000)
1092 *secondary = 1;
1093 else
1094 *primary = 1;
1095 }
1096 return;
1097 }
1098}
1099
Alan Coxdefc9cd2008-01-10 14:33:10 -08001100static __init void probe_opti_vlb(void)
1101{
1102 /* If an OPTI 82C46X is present find out where the channels are */
1103 static const char *optis[4] = {
1104 "3/463MV", "5MV",
1105 "5MVA", "5MVB"
1106 };
1107 u8 chans = 1;
1108 u8 ctrl = (opti_syscfg(0x30) & 0xC0) >> 6;
1109
1110 opti82c46x = 3; /* Assume master and slave first */
1111 printk(KERN_INFO DRV_NAME ": Opti 82C46%s chipset support.\n",
1112 optis[ctrl]);
1113 if (ctrl == 3)
1114 chans = (opti_syscfg(0x3F) & 0x20) ? 2 : 1;
1115 ctrl = opti_syscfg(0xAC);
1116 /* Check enabled and this port is the 465MV port. On the
1117 MVB we may have two channels */
1118 if (ctrl & 8) {
1119 if (chans == 2) {
1120 legacy_probe_add(0x1F0, 14, OPTI46X, 0);
1121 legacy_probe_add(0x170, 15, OPTI46X, 0);
1122 }
1123 if (ctrl & 4)
1124 legacy_probe_add(0x170, 15, OPTI46X, 0);
1125 else
1126 legacy_probe_add(0x1F0, 14, OPTI46X, 0);
1127 } else
1128 legacy_probe_add(0x1F0, 14, OPTI46X, 0);
1129}
1130
1131static __init void qdi65_identify_port(u8 r, u8 res, unsigned long port)
1132{
1133 static const unsigned long ide_port[2] = { 0x170, 0x1F0 };
1134 /* Check card type */
1135 if ((r & 0xF0) == 0xC0) {
1136 /* QD6500: single channel */
Alan Coxb8325482008-01-19 15:47:23 +00001137 if (r & 8)
Alan Coxdefc9cd2008-01-10 14:33:10 -08001138 /* Disabled ? */
Alan Coxdefc9cd2008-01-10 14:33:10 -08001139 return;
Alan Coxdefc9cd2008-01-10 14:33:10 -08001140 legacy_probe_add(ide_port[r & 0x01], 14 + (r & 0x01),
1141 QDI6500, port);
1142 }
1143 if (((r & 0xF0) == 0xA0) || (r & 0xF0) == 0x50) {
1144 /* QD6580: dual channel */
1145 if (!request_region(port + 2 , 2, "pata_qdi")) {
1146 release_region(port, 2);
1147 return;
1148 }
1149 res = inb(port + 3);
1150 /* Single channel mode ? */
1151 if (res & 1)
1152 legacy_probe_add(ide_port[r & 0x01], 14 + (r & 0x01),
1153 QDI6580, port);
1154 else { /* Dual channel mode */
1155 legacy_probe_add(0x1F0, 14, QDI6580DP, port);
1156 /* port + 0x02, r & 0x04 */
1157 legacy_probe_add(0x170, 15, QDI6580DP, port + 2);
1158 }
Alan Coxb8325482008-01-19 15:47:23 +00001159 release_region(port + 2, 2);
Alan Coxdefc9cd2008-01-10 14:33:10 -08001160 }
1161}
1162
1163static __init void probe_qdi_vlb(void)
1164{
1165 unsigned long flags;
1166 static const unsigned long qd_port[2] = { 0x30, 0xB0 };
1167 int i;
1168
1169 /*
1170 * Check each possible QD65xx base address
1171 */
1172
1173 for (i = 0; i < 2; i++) {
1174 unsigned long port = qd_port[i];
1175 u8 r, res;
1176
1177
1178 if (request_region(port, 2, "pata_qdi")) {
1179 /* Check for a card */
1180 local_irq_save(flags);
1181 /* I have no h/w that needs this delay but it
1182 is present in the historic code */
1183 r = inb(port);
1184 udelay(1);
1185 outb(0x19, port);
1186 udelay(1);
1187 res = inb(port);
1188 udelay(1);
1189 outb(r, port);
1190 udelay(1);
1191 local_irq_restore(flags);
1192
1193 /* Fail */
1194 if (res == 0x19) {
1195 release_region(port, 2);
1196 continue;
1197 }
1198 /* Passes the presence test */
1199 r = inb(port + 1);
1200 udelay(1);
1201 /* Check port agrees with port set */
Alan Coxb8325482008-01-19 15:47:23 +00001202 if ((r & 2) >> 1 == i)
1203 qdi65_identify_port(r, res, port);
1204 release_region(port, 2);
Alan Coxdefc9cd2008-01-10 14:33:10 -08001205 }
1206 }
1207}
Jeff Garzik669a5db2006-08-29 18:12:40 -04001208
1209/**
1210 * legacy_init - attach legacy interfaces
1211 *
1212 * Attach legacy IDE interfaces by scanning the usual IRQ/port suspects.
1213 * Right now we do not scan the ide0 and ide1 address but should do so
1214 * for non PCI systems or systems with no PCI IDE legacy mode devices.
1215 * If you fix that note there are special cases to consider like VLB
1216 * drivers and CS5510/20.
1217 */
1218
1219static __init int legacy_init(void)
1220{
1221 int i;
1222 int ct = 0;
1223 int primary = 0;
1224 int secondary = 0;
Alan Coxdefc9cd2008-01-10 14:33:10 -08001225 int pci_present = 0;
1226 struct legacy_probe *pl = &probe_list[0];
1227 int slot = 0;
Jeff Garzik669a5db2006-08-29 18:12:40 -04001228
1229 struct pci_dev *p = NULL;
1230
1231 for_each_pci_dev(p) {
1232 int r;
Alan Coxdefc9cd2008-01-10 14:33:10 -08001233 /* Check for any overlap of the system ATA mappings. Native
1234 mode controllers stuck on these addresses or some devices
1235 in 'raid' mode won't be found by the storage class test */
Jeff Garzik669a5db2006-08-29 18:12:40 -04001236 for (r = 0; r < 6; r++) {
1237 if (pci_resource_start(p, r) == 0x1f0)
1238 primary = 1;
1239 if (pci_resource_start(p, r) == 0x170)
1240 secondary = 1;
1241 }
1242 /* Check for special cases */
1243 legacy_check_special_cases(p, &primary, &secondary);
1244
Alan Coxdefc9cd2008-01-10 14:33:10 -08001245 /* If PCI bus is present then don't probe for tertiary
1246 legacy ports */
1247 pci_present = 1;
Jeff Garzik669a5db2006-08-29 18:12:40 -04001248 }
1249
Alan Coxb8325482008-01-19 15:47:23 +00001250 if (winbond == 1)
1251 winbond = 0x130; /* Default port, alt is 1B0 */
1252
Alan Coxdefc9cd2008-01-10 14:33:10 -08001253 if (primary == 0 || all)
1254 legacy_probe_add(0x1F0, 14, UNKNOWN, 0);
1255 if (secondary == 0 || all)
1256 legacy_probe_add(0x170, 15, UNKNOWN, 0);
Jeff Garzik85cd7252006-08-31 00:03:49 -04001257
Alan Coxdefc9cd2008-01-10 14:33:10 -08001258 if (probe_all || !pci_present) {
1259 /* ISA/VLB extra ports */
1260 legacy_probe_add(0x1E8, 11, UNKNOWN, 0);
1261 legacy_probe_add(0x168, 10, UNKNOWN, 0);
1262 legacy_probe_add(0x1E0, 8, UNKNOWN, 0);
1263 legacy_probe_add(0x160, 12, UNKNOWN, 0);
Jeff Garzik669a5db2006-08-29 18:12:40 -04001264 }
1265
Alan Coxdefc9cd2008-01-10 14:33:10 -08001266 if (opti82c46x)
1267 probe_opti_vlb();
1268 if (qdi)
1269 probe_qdi_vlb();
1270
Alan Coxdefc9cd2008-01-10 14:33:10 -08001271 for (i = 0; i < NR_HOST; i++, pl++) {
1272 if (pl->port == 0)
Jeff Garzik669a5db2006-08-29 18:12:40 -04001273 continue;
Alan Coxdefc9cd2008-01-10 14:33:10 -08001274 if (pl->type == UNKNOWN)
1275 pl->type = probe_chip_type(pl);
1276 pl->slot = slot++;
1277 if (legacy_init_one(pl) == 0)
Jeff Garzik669a5db2006-08-29 18:12:40 -04001278 ct++;
1279 }
1280 if (ct != 0)
1281 return 0;
1282 return -ENODEV;
1283}
1284
1285static __exit void legacy_exit(void)
1286{
1287 int i;
1288
1289 for (i = 0; i < nr_legacy_host; i++) {
1290 struct legacy_data *ld = &legacy_data[i];
Tejun Heo24dc5f32007-01-20 16:00:28 +09001291 ata_host_detach(legacy_host[i]);
Jeff Garzik669a5db2006-08-29 18:12:40 -04001292 platform_device_unregister(ld->platform_dev);
Jeff Garzik669a5db2006-08-29 18:12:40 -04001293 }
1294}
1295
1296MODULE_AUTHOR("Alan Cox");
1297MODULE_DESCRIPTION("low-level driver for legacy ATA");
1298MODULE_LICENSE("GPL");
1299MODULE_VERSION(DRV_VERSION);
1300
1301module_param(probe_all, int, 0);
1302module_param(autospeed, int, 0);
1303module_param(ht6560a, int, 0);
1304module_param(ht6560b, int, 0);
1305module_param(opti82c611a, int, 0);
1306module_param(opti82c46x, int, 0);
Alan Coxdefc9cd2008-01-10 14:33:10 -08001307module_param(qdi, int, 0);
Jeff Garzik669a5db2006-08-29 18:12:40 -04001308module_param(pio_mask, int, 0);
Alan Coxf834e492007-02-07 13:46:00 -08001309module_param(iordy_mask, int, 0);
Jeff Garzik669a5db2006-08-29 18:12:40 -04001310
1311module_init(legacy_init);
1312module_exit(legacy_exit);