blob: 5329b954c5f2b6fb31bfb16ee3791e0be823a967 [file] [log] [blame]
Jeff Garzik669a5db2006-08-29 18:12:40 -04001/*
2 * pata-legacy.c - Legacy port PATA/SATA controller driver.
3 * Copyright 2005/2006 Red Hat <alan@redhat.com>, all rights reserved.
4 *
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
28 *
29 * Unsupported but docs exist:
30 * Appian/Adaptec AIC25VL01/Cirrus Logic PD7220
Jeff Garzik669a5db2006-08-29 18:12:40 -040031 *
32 * This driver handles legacy (that is "ISA/VLB side") IDE ports found
33 * on PC class systems. There are three hybrid devices that are exceptions
34 * The Cyrix 5510/5520 where a pre SFF ATA device is on the bridge and
35 * the MPIIX where the tuning is PCI side but the IDE is "ISA side".
36 *
37 * Specific support is included for the ht6560a/ht6560b/opti82c611a/
Alan Coxb8325482008-01-19 15:47:23 +000038 * opti82c465mv/promise 20230c/20630/winbond83759A
Jeff Garzik669a5db2006-08-29 18:12:40 -040039 *
40 * Use the autospeed and pio_mask options with:
41 * Appian ADI/2 aka CLPD7220 or AIC25VL01.
42 * Use the jumpers, autospeed and set pio_mask to the mode on the jumpers with
43 * Goldstar GM82C711, PIC-1288A-125, UMC 82C871F, Winbond W83759,
44 * Winbond W83759A, Promise PDC20230-B
45 *
46 * For now use autospeed and pio_mask as above with the W83759A. This may
47 * change.
48 *
Jeff Garzik669a5db2006-08-29 18:12:40 -040049 */
50
51#include <linux/kernel.h>
52#include <linux/module.h>
53#include <linux/pci.h>
54#include <linux/init.h>
55#include <linux/blkdev.h>
56#include <linux/delay.h>
57#include <scsi/scsi_host.h>
58#include <linux/ata.h>
59#include <linux/libata.h>
60#include <linux/platform_device.h>
61
62#define DRV_NAME "pata_legacy"
Alan Coxb8325482008-01-19 15:47:23 +000063#define DRV_VERSION "0.6.5"
Jeff Garzik669a5db2006-08-29 18:12:40 -040064
65#define NR_HOST 6
66
Alan Coxdefc9cd2008-01-10 14:33:10 -080067static int all;
68module_param(all, int, 0444);
69MODULE_PARM_DESC(all, "Grab all legacy port devices, even if PCI(0=off, 1=on)");
Jeff Garzik669a5db2006-08-29 18:12:40 -040070
71struct legacy_data {
72 unsigned long timing;
73 u8 clock[2];
74 u8 last;
75 int fast;
76 struct platform_device *platform_dev;
77
78};
79
Alan Coxdefc9cd2008-01-10 14:33:10 -080080enum controller {
81 BIOS = 0,
82 SNOOP = 1,
83 PDC20230 = 2,
84 HT6560A = 3,
85 HT6560B = 4,
86 OPTI611A = 5,
87 OPTI46X = 6,
88 QDI6500 = 7,
89 QDI6580 = 8,
90 QDI6580DP = 9, /* Dual channel mode is different */
Alan Coxb8325482008-01-19 15:47:23 +000091 W83759A = 10,
Alan Coxdefc9cd2008-01-10 14:33:10 -080092
93 UNKNOWN = -1
94};
95
96
97struct legacy_probe {
98 unsigned char *name;
99 unsigned long port;
100 unsigned int irq;
101 unsigned int slot;
102 enum controller type;
103 unsigned long private;
104};
105
106struct legacy_controller {
107 const char *name;
108 struct ata_port_operations *ops;
109 unsigned int pio_mask;
110 unsigned int flags;
Alan Coxb8325482008-01-19 15:47:23 +0000111 int (*setup)(struct platform_device *, struct legacy_probe *probe,
112 struct legacy_data *data);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800113};
114
115static int legacy_port[NR_HOST] = { 0x1f0, 0x170, 0x1e8, 0x168, 0x1e0, 0x160 };
116
117static struct legacy_probe probe_list[NR_HOST];
Jeff Garzik669a5db2006-08-29 18:12:40 -0400118static struct legacy_data legacy_data[NR_HOST];
119static struct ata_host *legacy_host[NR_HOST];
120static int nr_legacy_host;
121
122
Alan Coxdefc9cd2008-01-10 14:33:10 -0800123static int probe_all; /* Set to check all ISA port ranges */
124static int ht6560a; /* HT 6560A on primary 1, second 2, both 3 */
125static int ht6560b; /* HT 6560A on primary 1, second 2, both 3 */
126static int opti82c611a; /* Opti82c611A on primary 1, sec 2, both 3 */
127static int opti82c46x; /* Opti 82c465MV present(pri/sec autodetect) */
128static int qdi; /* Set to probe QDI controllers */
Alan Coxb8325482008-01-19 15:47:23 +0000129static int winbond; /* Set to probe Winbond controllers,
Alan Cox83972482008-02-08 15:23:38 +0000130 give I/O port if non standard */
Alan Coxdefc9cd2008-01-10 14:33:10 -0800131static int autospeed; /* Chip present which snoops speed changes */
132static int pio_mask = 0x1F; /* PIO range for autospeed devices */
Alan Coxf834e492007-02-07 13:46:00 -0800133static int iordy_mask = 0xFFFFFFFF; /* Use iordy if available */
Jeff Garzik669a5db2006-08-29 18:12:40 -0400134
135/**
Alan Coxdefc9cd2008-01-10 14:33:10 -0800136 * legacy_probe_add - Add interface to probe list
137 * @port: Controller port
138 * @irq: IRQ number
139 * @type: Controller type
140 * @private: Controller specific info
141 *
142 * Add an entry into the probe list for ATA controllers. This is used
143 * to add the default ISA slots and then to build up the table
144 * further according to other ISA/VLB/Weird device scans
145 *
146 * An I/O port list is used to keep ordering stable and sane, as we
147 * don't have any good way to talk about ordering otherwise
148 */
149
150static int legacy_probe_add(unsigned long port, unsigned int irq,
151 enum controller type, unsigned long private)
152{
153 struct legacy_probe *lp = &probe_list[0];
154 int i;
155 struct legacy_probe *free = NULL;
156
157 for (i = 0; i < NR_HOST; i++) {
158 if (lp->port == 0 && free == NULL)
159 free = lp;
160 /* Matching port, or the correct slot for ordering */
161 if (lp->port == port || legacy_port[i] == port) {
162 free = lp;
163 break;
164 }
165 lp++;
166 }
167 if (free == NULL) {
168 printk(KERN_ERR "pata_legacy: Too many interfaces.\n");
169 return -1;
170 }
171 /* Fill in the entry for later probing */
172 free->port = port;
173 free->irq = irq;
174 free->type = type;
175 free->private = private;
176 return 0;
177}
178
179
180/**
Jeff Garzik669a5db2006-08-29 18:12:40 -0400181 * legacy_set_mode - mode setting
Tejun Heo02607312007-08-06 18:36:23 +0900182 * @link: IDE link
Alanb229a7b2007-01-24 11:47:07 +0000183 * @unused: Device that failed when error is returned
Jeff Garzik669a5db2006-08-29 18:12:40 -0400184 *
185 * Use a non standard set_mode function. We don't want to be tuned.
186 *
187 * The BIOS configured everything. Our job is not to fiddle. Just use
188 * whatever PIO the hardware is using and leave it at that. When we
189 * get some kind of nice user driven API for control then we can
190 * expand on this as per hdparm in the base kernel.
191 */
192
Tejun Heo02607312007-08-06 18:36:23 +0900193static int legacy_set_mode(struct ata_link *link, struct ata_device **unused)
Jeff Garzik669a5db2006-08-29 18:12:40 -0400194{
Tejun Heof58229f2007-08-06 18:36:23 +0900195 struct ata_device *dev;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400196
Tejun Heo02607312007-08-06 18:36:23 +0900197 ata_link_for_each_dev(dev, link) {
Jeff Garzik669a5db2006-08-29 18:12:40 -0400198 if (ata_dev_enabled(dev)) {
Alan Coxdefc9cd2008-01-10 14:33:10 -0800199 ata_dev_printk(dev, KERN_INFO,
200 "configured for PIO\n");
Jeff Garzik669a5db2006-08-29 18:12:40 -0400201 dev->pio_mode = XFER_PIO_0;
202 dev->xfer_mode = XFER_PIO_0;
203 dev->xfer_shift = ATA_SHIFT_PIO;
204 dev->flags |= ATA_DFLAG_PIO;
205 }
206 }
Alanb229a7b2007-01-24 11:47:07 +0000207 return 0;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400208}
209
210static struct scsi_host_template legacy_sht = {
Tejun Heo68d1d072008-03-25 12:22:49 +0900211 ATA_PIO_SHT(DRV_NAME),
Jeff Garzik669a5db2006-08-29 18:12:40 -0400212};
213
214/*
215 * These ops are used if the user indicates the hardware
216 * snoops the commands to decide on the mode and handles the
217 * mode selection "magically" itself. Several legacy controllers
218 * do this. The mode range can be set if it is not 0x1F by setting
219 * pio_mask as well.
220 */
221
222static struct ata_port_operations simple_port_ops = {
Jeff Garzik669a5db2006-08-29 18:12:40 -0400223 .tf_load = ata_tf_load,
224 .tf_read = ata_tf_read,
225 .check_status = ata_check_status,
226 .exec_command = ata_exec_command,
227 .dev_select = ata_std_dev_select,
228
229 .freeze = ata_bmdma_freeze,
230 .thaw = ata_bmdma_thaw,
231 .error_handler = ata_bmdma_error_handler,
232 .post_internal_cmd = ata_bmdma_post_internal_cmd,
Jeff Garzika73984a2007-03-09 08:37:46 -0500233 .cable_detect = ata_cable_40wire,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400234
235 .qc_prep = ata_qc_prep,
236 .qc_issue = ata_qc_issue_prot,
Jeff Garzikbda30282006-09-27 05:41:13 -0400237
Tejun Heo0d5ff562007-02-01 15:06:36 +0900238 .data_xfer = ata_data_xfer_noirq,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400239
240 .irq_handler = ata_interrupt,
Tejun Heo358f9a72008-03-25 12:22:47 +0900241 .irq_clear = ata_noop_irq_clear,
Akira Iguchi246ce3b2007-01-26 16:27:58 +0900242 .irq_on = ata_irq_on,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400243
Alan Coxdefc9cd2008-01-10 14:33:10 -0800244 .port_start = ata_sff_port_start,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400245};
246
247static struct ata_port_operations legacy_port_ops = {
248 .set_mode = legacy_set_mode,
249
Jeff Garzik669a5db2006-08-29 18:12:40 -0400250 .tf_load = ata_tf_load,
251 .tf_read = ata_tf_read,
252 .check_status = ata_check_status,
253 .exec_command = ata_exec_command,
254 .dev_select = ata_std_dev_select,
Jeff Garzika73984a2007-03-09 08:37:46 -0500255 .cable_detect = ata_cable_40wire,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400256
Jeff Garzikbf7551c2007-03-02 18:09:05 -0500257 .freeze = ata_bmdma_freeze,
258 .thaw = ata_bmdma_thaw,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400259 .error_handler = ata_bmdma_error_handler,
Jeff Garzikbf7551c2007-03-02 18:09:05 -0500260 .post_internal_cmd = ata_bmdma_post_internal_cmd,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400261
262 .qc_prep = ata_qc_prep,
263 .qc_issue = ata_qc_issue_prot,
Jeff Garzikbda30282006-09-27 05:41:13 -0400264
Tejun Heo0d5ff562007-02-01 15:06:36 +0900265 .data_xfer = ata_data_xfer_noirq,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400266
267 .irq_handler = ata_interrupt,
Tejun Heo358f9a72008-03-25 12:22:47 +0900268 .irq_clear = ata_noop_irq_clear,
Akira Iguchi246ce3b2007-01-26 16:27:58 +0900269 .irq_on = ata_irq_on,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400270
Alan Coxdefc9cd2008-01-10 14:33:10 -0800271 .port_start = ata_sff_port_start,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400272};
273
274/*
275 * Promise 20230C and 20620 support
276 *
Alan Coxdefc9cd2008-01-10 14:33:10 -0800277 * This controller supports PIO0 to PIO2. We set PIO timings
278 * conservatively to allow for 50MHz Vesa Local Bus. The 20620 DMA
279 * support is weird being DMA to controller and PIO'd to the host
280 * and not supported.
Jeff Garzik669a5db2006-08-29 18:12:40 -0400281 */
282
283static void pdc20230_set_piomode(struct ata_port *ap, struct ata_device *adev)
284{
285 int tries = 5;
286 int pio = adev->pio_mode - XFER_PIO_0;
287 u8 rt;
288 unsigned long flags;
Jeff Garzik85cd7252006-08-31 00:03:49 -0400289
Jeff Garzik669a5db2006-08-29 18:12:40 -0400290 /* Safe as UP only. Force I/Os to occur together */
Jeff Garzik85cd7252006-08-31 00:03:49 -0400291
Jeff Garzik669a5db2006-08-29 18:12:40 -0400292 local_irq_save(flags);
Jeff Garzik85cd7252006-08-31 00:03:49 -0400293
Jeff Garzik669a5db2006-08-29 18:12:40 -0400294 /* Unlock the control interface */
Alan Coxdefc9cd2008-01-10 14:33:10 -0800295 do {
Jeff Garzik669a5db2006-08-29 18:12:40 -0400296 inb(0x1F5);
297 outb(inb(0x1F2) | 0x80, 0x1F2);
298 inb(0x1F2);
299 inb(0x3F6);
300 inb(0x3F6);
301 inb(0x1F2);
302 inb(0x1F2);
303 }
Alan Coxdefc9cd2008-01-10 14:33:10 -0800304 while ((inb(0x1F2) & 0x80) && --tries);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400305
306 local_irq_restore(flags);
Jeff Garzik85cd7252006-08-31 00:03:49 -0400307
Jeff Garzik669a5db2006-08-29 18:12:40 -0400308 outb(inb(0x1F4) & 0x07, 0x1F4);
309
310 rt = inb(0x1F3);
311 rt &= 0x07 << (3 * adev->devno);
312 if (pio)
313 rt |= (1 + 3 * pio) << (3 * adev->devno);
314
315 udelay(100);
316 outb(inb(0x1F2) | 0x01, 0x1F2);
317 udelay(100);
318 inb(0x1F5);
319
320}
321
Tejun Heo55dba312007-12-05 16:43:07 +0900322static unsigned int pdc_data_xfer_vlb(struct ata_device *dev,
Alan Coxdefc9cd2008-01-10 14:33:10 -0800323 unsigned char *buf, unsigned int buflen, int rw)
Jeff Garzik669a5db2006-08-29 18:12:40 -0400324{
Andrew Mortonc294f1b2008-01-15 15:42:37 -0800325 if (ata_id_has_dword_io(dev->id)) {
Tejun Heo55dba312007-12-05 16:43:07 +0900326 struct ata_port *ap = dev->link->ap;
327 int slop = buflen & 3;
328 unsigned long flags;
329
Jeff Garzik669a5db2006-08-29 18:12:40 -0400330 local_irq_save(flags);
331
332 /* Perform the 32bit I/O synchronization sequence */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900333 ioread8(ap->ioaddr.nsect_addr);
334 ioread8(ap->ioaddr.nsect_addr);
335 ioread8(ap->ioaddr.nsect_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400336
337 /* Now the data */
Tejun Heo55dba312007-12-05 16:43:07 +0900338 if (rw == READ)
Tejun Heo0d5ff562007-02-01 15:06:36 +0900339 ioread32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
Tejun Heo55dba312007-12-05 16:43:07 +0900340 else
341 iowrite32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400342
343 if (unlikely(slop)) {
Tejun Heo55dba312007-12-05 16:43:07 +0900344 u32 pad;
345 if (rw == READ) {
Al Virob50e56d2008-01-12 14:16:14 +0000346 pad = cpu_to_le32(ioread32(ap->ioaddr.data_addr));
Jeff Garzik669a5db2006-08-29 18:12:40 -0400347 memcpy(buf + buflen - slop, &pad, slop);
Tejun Heo55dba312007-12-05 16:43:07 +0900348 } else {
349 memcpy(&pad, buf + buflen - slop, slop);
350 iowrite32(le32_to_cpu(pad), ap->ioaddr.data_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400351 }
Tejun Heo55dba312007-12-05 16:43:07 +0900352 buflen += 4 - slop;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400353 }
354 local_irq_restore(flags);
Tejun Heo55dba312007-12-05 16:43:07 +0900355 } else
356 buflen = ata_data_xfer_noirq(dev, buf, buflen, rw);
357
358 return buflen;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400359}
360
361static struct ata_port_operations pdc20230_port_ops = {
362 .set_piomode = pdc20230_set_piomode,
363
Jeff Garzik669a5db2006-08-29 18:12:40 -0400364 .tf_load = ata_tf_load,
365 .tf_read = ata_tf_read,
366 .check_status = ata_check_status,
367 .exec_command = ata_exec_command,
368 .dev_select = ata_std_dev_select,
369
Jeff Garzikbf7551c2007-03-02 18:09:05 -0500370 .freeze = ata_bmdma_freeze,
371 .thaw = ata_bmdma_thaw,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400372 .error_handler = ata_bmdma_error_handler,
Jeff Garzikbf7551c2007-03-02 18:09:05 -0500373 .post_internal_cmd = ata_bmdma_post_internal_cmd,
Jeff Garzika73984a2007-03-09 08:37:46 -0500374 .cable_detect = ata_cable_40wire,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400375
376 .qc_prep = ata_qc_prep,
377 .qc_issue = ata_qc_issue_prot,
Jeff Garzikbda30282006-09-27 05:41:13 -0400378
Jeff Garzik669a5db2006-08-29 18:12:40 -0400379 .data_xfer = pdc_data_xfer_vlb,
380
381 .irq_handler = ata_interrupt,
Tejun Heo358f9a72008-03-25 12:22:47 +0900382 .irq_clear = ata_noop_irq_clear,
Akira Iguchi246ce3b2007-01-26 16:27:58 +0900383 .irq_on = ata_irq_on,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400384
Alan Coxdefc9cd2008-01-10 14:33:10 -0800385 .port_start = ata_sff_port_start,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400386};
387
388/*
389 * Holtek 6560A support
390 *
Alan Coxdefc9cd2008-01-10 14:33:10 -0800391 * This controller supports PIO0 to PIO2 (no IORDY even though higher
392 * timings can be loaded).
Jeff Garzik669a5db2006-08-29 18:12:40 -0400393 */
394
395static void ht6560a_set_piomode(struct ata_port *ap, struct ata_device *adev)
396{
397 u8 active, recover;
398 struct ata_timing t;
399
400 /* Get the timing data in cycles. For now play safe at 50Mhz */
401 ata_timing_compute(adev, adev->pio_mode, &t, 20000, 1000);
402
403 active = FIT(t.active, 2, 15);
404 recover = FIT(t.recover, 4, 15);
405
406 inb(0x3E6);
407 inb(0x3E6);
408 inb(0x3E6);
409 inb(0x3E6);
410
Tejun Heo0d5ff562007-02-01 15:06:36 +0900411 iowrite8(recover << 4 | active, ap->ioaddr.device_addr);
412 ioread8(ap->ioaddr.status_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400413}
414
415static struct ata_port_operations ht6560a_port_ops = {
416 .set_piomode = ht6560a_set_piomode,
417
Jeff Garzik669a5db2006-08-29 18:12:40 -0400418 .tf_load = ata_tf_load,
419 .tf_read = ata_tf_read,
420 .check_status = ata_check_status,
421 .exec_command = ata_exec_command,
422 .dev_select = ata_std_dev_select,
423
Jeff Garzikbf7551c2007-03-02 18:09:05 -0500424 .freeze = ata_bmdma_freeze,
425 .thaw = ata_bmdma_thaw,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400426 .error_handler = ata_bmdma_error_handler,
Jeff Garzikbf7551c2007-03-02 18:09:05 -0500427 .post_internal_cmd = ata_bmdma_post_internal_cmd,
Jeff Garzika73984a2007-03-09 08:37:46 -0500428 .cable_detect = ata_cable_40wire,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400429
430 .qc_prep = ata_qc_prep,
431 .qc_issue = ata_qc_issue_prot,
Jeff Garzikbda30282006-09-27 05:41:13 -0400432
Tejun Heo0d5ff562007-02-01 15:06:36 +0900433 .data_xfer = ata_data_xfer, /* Check vlb/noirq */
Jeff Garzik669a5db2006-08-29 18:12:40 -0400434
435 .irq_handler = ata_interrupt,
Tejun Heo358f9a72008-03-25 12:22:47 +0900436 .irq_clear = ata_noop_irq_clear,
Akira Iguchi246ce3b2007-01-26 16:27:58 +0900437 .irq_on = ata_irq_on,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400438
Alan Coxdefc9cd2008-01-10 14:33:10 -0800439 .port_start = ata_sff_port_start,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400440};
441
442/*
443 * Holtek 6560B support
444 *
Alan Coxdefc9cd2008-01-10 14:33:10 -0800445 * This controller supports PIO0 to PIO4. We honour the BIOS/jumper FIFO
446 * setting unless we see an ATAPI device in which case we force it off.
Jeff Garzik669a5db2006-08-29 18:12:40 -0400447 *
448 * FIXME: need to implement 2nd channel support.
449 */
450
451static void ht6560b_set_piomode(struct ata_port *ap, struct ata_device *adev)
452{
453 u8 active, recover;
454 struct ata_timing t;
455
456 /* Get the timing data in cycles. For now play safe at 50Mhz */
457 ata_timing_compute(adev, adev->pio_mode, &t, 20000, 1000);
458
459 active = FIT(t.active, 2, 15);
460 recover = FIT(t.recover, 2, 16);
461 recover &= 0x15;
462
463 inb(0x3E6);
464 inb(0x3E6);
465 inb(0x3E6);
466 inb(0x3E6);
467
Tejun Heo0d5ff562007-02-01 15:06:36 +0900468 iowrite8(recover << 4 | active, ap->ioaddr.device_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400469
470 if (adev->class != ATA_DEV_ATA) {
471 u8 rconf = inb(0x3E6);
472 if (rconf & 0x24) {
Alan Coxdefc9cd2008-01-10 14:33:10 -0800473 rconf &= ~0x24;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400474 outb(rconf, 0x3E6);
475 }
476 }
Tejun Heo0d5ff562007-02-01 15:06:36 +0900477 ioread8(ap->ioaddr.status_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400478}
479
480static struct ata_port_operations ht6560b_port_ops = {
481 .set_piomode = ht6560b_set_piomode,
482
Jeff Garzik669a5db2006-08-29 18:12:40 -0400483 .tf_load = ata_tf_load,
484 .tf_read = ata_tf_read,
485 .check_status = ata_check_status,
486 .exec_command = ata_exec_command,
487 .dev_select = ata_std_dev_select,
488
Jeff Garzikbf7551c2007-03-02 18:09:05 -0500489 .freeze = ata_bmdma_freeze,
490 .thaw = ata_bmdma_thaw,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400491 .error_handler = ata_bmdma_error_handler,
Jeff Garzikbf7551c2007-03-02 18:09:05 -0500492 .post_internal_cmd = ata_bmdma_post_internal_cmd,
Jeff Garzika73984a2007-03-09 08:37:46 -0500493 .cable_detect = ata_cable_40wire,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400494
495 .qc_prep = ata_qc_prep,
496 .qc_issue = ata_qc_issue_prot,
Jeff Garzikbda30282006-09-27 05:41:13 -0400497
Alan Coxdefc9cd2008-01-10 14:33:10 -0800498 .data_xfer = ata_data_xfer, /* FIXME: Check 32bit and noirq */
Jeff Garzik669a5db2006-08-29 18:12:40 -0400499
500 .irq_handler = ata_interrupt,
Tejun Heo358f9a72008-03-25 12:22:47 +0900501 .irq_clear = ata_noop_irq_clear,
Akira Iguchi246ce3b2007-01-26 16:27:58 +0900502 .irq_on = ata_irq_on,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400503
Alan Coxdefc9cd2008-01-10 14:33:10 -0800504 .port_start = ata_sff_port_start,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400505};
506
507/*
508 * Opti core chipset helpers
509 */
Jeff Garzik85cd7252006-08-31 00:03:49 -0400510
Jeff Garzik669a5db2006-08-29 18:12:40 -0400511/**
512 * opti_syscfg - read OPTI chipset configuration
513 * @reg: Configuration register to read
514 *
515 * Returns the value of an OPTI system board configuration register.
516 */
517
518static u8 opti_syscfg(u8 reg)
519{
520 unsigned long flags;
521 u8 r;
Jeff Garzik85cd7252006-08-31 00:03:49 -0400522
Jeff Garzik669a5db2006-08-29 18:12:40 -0400523 /* Uniprocessor chipset and must force cycles adjancent */
524 local_irq_save(flags);
525 outb(reg, 0x22);
526 r = inb(0x24);
527 local_irq_restore(flags);
528 return r;
529}
530
531/*
532 * Opti 82C611A
533 *
534 * This controller supports PIO0 to PIO3.
535 */
536
Alan Coxdefc9cd2008-01-10 14:33:10 -0800537static void opti82c611a_set_piomode(struct ata_port *ap,
538 struct ata_device *adev)
Jeff Garzik669a5db2006-08-29 18:12:40 -0400539{
540 u8 active, recover, setup;
541 struct ata_timing t;
542 struct ata_device *pair = ata_dev_pair(adev);
543 int clock;
544 int khz[4] = { 50000, 40000, 33000, 25000 };
545 u8 rc;
546
547 /* Enter configuration mode */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900548 ioread16(ap->ioaddr.error_addr);
549 ioread16(ap->ioaddr.error_addr);
550 iowrite8(3, ap->ioaddr.nsect_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400551
552 /* Read VLB clock strapping */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900553 clock = 1000000000 / khz[ioread8(ap->ioaddr.lbah_addr) & 0x03];
Jeff Garzik669a5db2006-08-29 18:12:40 -0400554
555 /* Get the timing data in cycles */
556 ata_timing_compute(adev, adev->pio_mode, &t, clock, 1000);
557
558 /* Setup timing is shared */
559 if (pair) {
560 struct ata_timing tp;
561 ata_timing_compute(pair, pair->pio_mode, &tp, clock, 1000);
562
563 ata_timing_merge(&t, &tp, &t, ATA_TIMING_SETUP);
564 }
565
566 active = FIT(t.active, 2, 17) - 2;
567 recover = FIT(t.recover, 1, 16) - 1;
568 setup = FIT(t.setup, 1, 4) - 1;
569
570 /* Select the right timing bank for write timing */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900571 rc = ioread8(ap->ioaddr.lbal_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400572 rc &= 0x7F;
573 rc |= (adev->devno << 7);
Tejun Heo0d5ff562007-02-01 15:06:36 +0900574 iowrite8(rc, ap->ioaddr.lbal_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400575
576 /* Write the timings */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900577 iowrite8(active << 4 | recover, ap->ioaddr.error_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400578
579 /* Select the right bank for read timings, also
580 load the shared timings for address */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900581 rc = ioread8(ap->ioaddr.device_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400582 rc &= 0xC0;
583 rc |= adev->devno; /* Index select */
584 rc |= (setup << 4) | 0x04;
Tejun Heo0d5ff562007-02-01 15:06:36 +0900585 iowrite8(rc, ap->ioaddr.device_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400586
587 /* Load the read timings */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900588 iowrite8(active << 4 | recover, ap->ioaddr.data_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400589
590 /* Ensure the timing register mode is right */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900591 rc = ioread8(ap->ioaddr.lbal_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400592 rc &= 0x73;
593 rc |= 0x84;
Tejun Heo0d5ff562007-02-01 15:06:36 +0900594 iowrite8(rc, ap->ioaddr.lbal_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400595
596 /* Exit command mode */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900597 iowrite8(0x83, ap->ioaddr.nsect_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400598}
599
600
601static struct ata_port_operations opti82c611a_port_ops = {
602 .set_piomode = opti82c611a_set_piomode,
603
Jeff Garzik669a5db2006-08-29 18:12:40 -0400604 .tf_load = ata_tf_load,
605 .tf_read = ata_tf_read,
606 .check_status = ata_check_status,
607 .exec_command = ata_exec_command,
608 .dev_select = ata_std_dev_select,
609
Jeff Garzikbf7551c2007-03-02 18:09:05 -0500610 .freeze = ata_bmdma_freeze,
611 .thaw = ata_bmdma_thaw,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400612 .error_handler = ata_bmdma_error_handler,
Jeff Garzikbf7551c2007-03-02 18:09:05 -0500613 .post_internal_cmd = ata_bmdma_post_internal_cmd,
Jeff Garzika73984a2007-03-09 08:37:46 -0500614 .cable_detect = ata_cable_40wire,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400615
616 .qc_prep = ata_qc_prep,
617 .qc_issue = ata_qc_issue_prot,
Jeff Garzikbda30282006-09-27 05:41:13 -0400618
Tejun Heo0d5ff562007-02-01 15:06:36 +0900619 .data_xfer = ata_data_xfer,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400620
621 .irq_handler = ata_interrupt,
Tejun Heo358f9a72008-03-25 12:22:47 +0900622 .irq_clear = ata_noop_irq_clear,
Akira Iguchi246ce3b2007-01-26 16:27:58 +0900623 .irq_on = ata_irq_on,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400624
Alan Coxdefc9cd2008-01-10 14:33:10 -0800625 .port_start = ata_sff_port_start,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400626};
627
628/*
629 * Opti 82C465MV
630 *
631 * This controller supports PIO0 to PIO3. Unlike the 611A the MVB
632 * version is dual channel but doesn't have a lot of unique registers.
633 */
634
635static void opti82c46x_set_piomode(struct ata_port *ap, struct ata_device *adev)
636{
637 u8 active, recover, setup;
638 struct ata_timing t;
639 struct ata_device *pair = ata_dev_pair(adev);
640 int clock;
641 int khz[4] = { 50000, 40000, 33000, 25000 };
642 u8 rc;
643 u8 sysclk;
644
645 /* Get the clock */
646 sysclk = opti_syscfg(0xAC) & 0xC0; /* BIOS set */
647
648 /* Enter configuration mode */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900649 ioread16(ap->ioaddr.error_addr);
650 ioread16(ap->ioaddr.error_addr);
651 iowrite8(3, ap->ioaddr.nsect_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400652
653 /* Read VLB clock strapping */
654 clock = 1000000000 / khz[sysclk];
655
656 /* Get the timing data in cycles */
657 ata_timing_compute(adev, adev->pio_mode, &t, clock, 1000);
658
659 /* Setup timing is shared */
660 if (pair) {
661 struct ata_timing tp;
662 ata_timing_compute(pair, pair->pio_mode, &tp, clock, 1000);
663
664 ata_timing_merge(&t, &tp, &t, ATA_TIMING_SETUP);
665 }
666
667 active = FIT(t.active, 2, 17) - 2;
668 recover = FIT(t.recover, 1, 16) - 1;
669 setup = FIT(t.setup, 1, 4) - 1;
670
671 /* Select the right timing bank for write timing */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900672 rc = ioread8(ap->ioaddr.lbal_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400673 rc &= 0x7F;
674 rc |= (adev->devno << 7);
Tejun Heo0d5ff562007-02-01 15:06:36 +0900675 iowrite8(rc, ap->ioaddr.lbal_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400676
677 /* Write the timings */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900678 iowrite8(active << 4 | recover, ap->ioaddr.error_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400679
680 /* Select the right bank for read timings, also
681 load the shared timings for address */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900682 rc = ioread8(ap->ioaddr.device_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400683 rc &= 0xC0;
684 rc |= adev->devno; /* Index select */
685 rc |= (setup << 4) | 0x04;
Tejun Heo0d5ff562007-02-01 15:06:36 +0900686 iowrite8(rc, ap->ioaddr.device_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400687
688 /* Load the read timings */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900689 iowrite8(active << 4 | recover, ap->ioaddr.data_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400690
691 /* Ensure the timing register mode is right */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900692 rc = ioread8(ap->ioaddr.lbal_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400693 rc &= 0x73;
694 rc |= 0x84;
Tejun Heo0d5ff562007-02-01 15:06:36 +0900695 iowrite8(rc, ap->ioaddr.lbal_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400696
697 /* Exit command mode */
Tejun Heo0d5ff562007-02-01 15:06:36 +0900698 iowrite8(0x83, ap->ioaddr.nsect_addr);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400699
700 /* We need to know this for quad device on the MVB */
701 ap->host->private_data = ap;
702}
703
704/**
705 * opt82c465mv_qc_issue_prot - command issue
706 * @qc: command pending
707 *
708 * Called when the libata layer is about to issue a command. We wrap
709 * this interface so that we can load the correct ATA timings. The
710 * MVB has a single set of timing registers and these are shared
711 * across channels. As there are two registers we really ought to
712 * track the last two used values as a sort of register window. For
713 * now we just reload on a channel switch. On the single channel
714 * setup this condition never fires so we do nothing extra.
715 *
716 * FIXME: dual channel needs ->serialize support
717 */
718
719static unsigned int opti82c46x_qc_issue_prot(struct ata_queued_cmd *qc)
720{
721 struct ata_port *ap = qc->ap;
722 struct ata_device *adev = qc->dev;
723
724 /* If timings are set and for the wrong channel (2nd test is
725 due to a libata shortcoming and will eventually go I hope) */
726 if (ap->host->private_data != ap->host
727 && ap->host->private_data != NULL)
728 opti82c46x_set_piomode(ap, adev);
729
730 return ata_qc_issue_prot(qc);
731}
732
733static struct ata_port_operations opti82c46x_port_ops = {
734 .set_piomode = opti82c46x_set_piomode,
735
Jeff Garzik669a5db2006-08-29 18:12:40 -0400736 .tf_load = ata_tf_load,
737 .tf_read = ata_tf_read,
738 .check_status = ata_check_status,
739 .exec_command = ata_exec_command,
740 .dev_select = ata_std_dev_select,
741
Jeff Garzikbf7551c2007-03-02 18:09:05 -0500742 .freeze = ata_bmdma_freeze,
743 .thaw = ata_bmdma_thaw,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400744 .error_handler = ata_bmdma_error_handler,
Jeff Garzikbf7551c2007-03-02 18:09:05 -0500745 .post_internal_cmd = ata_bmdma_post_internal_cmd,
Jeff Garzika73984a2007-03-09 08:37:46 -0500746 .cable_detect = ata_cable_40wire,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400747
748 .qc_prep = ata_qc_prep,
749 .qc_issue = opti82c46x_qc_issue_prot,
Jeff Garzikbda30282006-09-27 05:41:13 -0400750
Tejun Heo0d5ff562007-02-01 15:06:36 +0900751 .data_xfer = ata_data_xfer,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400752
753 .irq_handler = ata_interrupt,
Tejun Heo358f9a72008-03-25 12:22:47 +0900754 .irq_clear = ata_noop_irq_clear,
Akira Iguchi246ce3b2007-01-26 16:27:58 +0900755 .irq_on = ata_irq_on,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400756
Alan Coxdefc9cd2008-01-10 14:33:10 -0800757 .port_start = ata_sff_port_start,
Jeff Garzik669a5db2006-08-29 18:12:40 -0400758};
759
Alan Coxdefc9cd2008-01-10 14:33:10 -0800760static void qdi6500_set_piomode(struct ata_port *ap, struct ata_device *adev)
761{
762 struct ata_timing t;
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800763 struct legacy_data *ld_qdi = ap->host->private_data;
Alan Coxdefc9cd2008-01-10 14:33:10 -0800764 int active, recovery;
765 u8 timing;
766
767 /* Get the timing data in cycles */
768 ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
769
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800770 if (ld_qdi->fast) {
Alan Coxdefc9cd2008-01-10 14:33:10 -0800771 active = 8 - FIT(t.active, 1, 8);
772 recovery = 18 - FIT(t.recover, 3, 18);
773 } else {
774 active = 9 - FIT(t.active, 2, 9);
775 recovery = 15 - FIT(t.recover, 0, 15);
776 }
777 timing = (recovery << 4) | active | 0x08;
778
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800779 ld_qdi->clock[adev->devno] = timing;
Alan Coxdefc9cd2008-01-10 14:33:10 -0800780
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800781 outb(timing, ld_qdi->timing);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800782}
Jeff Garzik669a5db2006-08-29 18:12:40 -0400783
784/**
Alan Coxdefc9cd2008-01-10 14:33:10 -0800785 * qdi6580dp_set_piomode - PIO setup for dual channel
786 * @ap: Port
787 * @adev: Device
Jeff Garzik669a5db2006-08-29 18:12:40 -0400788 * @irq: interrupt line
789 *
Alan Coxdefc9cd2008-01-10 14:33:10 -0800790 * In dual channel mode the 6580 has one clock per channel and we have
791 * to software clockswitch in qc_issue_prot.
Jeff Garzik669a5db2006-08-29 18:12:40 -0400792 */
793
Alan Coxdefc9cd2008-01-10 14:33:10 -0800794static void qdi6580dp_set_piomode(struct ata_port *ap, struct ata_device *adev)
Jeff Garzik669a5db2006-08-29 18:12:40 -0400795{
Alan Coxdefc9cd2008-01-10 14:33:10 -0800796 struct ata_timing t;
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800797 struct legacy_data *ld_qdi = ap->host->private_data;
Alan Coxdefc9cd2008-01-10 14:33:10 -0800798 int active, recovery;
799 u8 timing;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400800
Alan Coxdefc9cd2008-01-10 14:33:10 -0800801 /* Get the timing data in cycles */
802 ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
Tejun Heo24dc5f32007-01-20 16:00:28 +0900803
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800804 if (ld_qdi->fast) {
Alan Coxdefc9cd2008-01-10 14:33:10 -0800805 active = 8 - FIT(t.active, 1, 8);
806 recovery = 18 - FIT(t.recover, 3, 18);
807 } else {
808 active = 9 - FIT(t.active, 2, 9);
809 recovery = 15 - FIT(t.recover, 0, 15);
Jeff Garzik669a5db2006-08-29 18:12:40 -0400810 }
Alan Coxdefc9cd2008-01-10 14:33:10 -0800811 timing = (recovery << 4) | active | 0x08;
Jeff Garzik669a5db2006-08-29 18:12:40 -0400812
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800813 ld_qdi->clock[adev->devno] = timing;
Jeff Garzik85cd7252006-08-31 00:03:49 -0400814
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800815 outb(timing, ld_qdi->timing + 2 * ap->port_no);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800816 /* Clear the FIFO */
817 if (adev->class != ATA_DEV_ATA)
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800818 outb(0x5F, ld_qdi->timing + 3);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800819}
820
821/**
822 * qdi6580_set_piomode - PIO setup for single channel
823 * @ap: Port
824 * @adev: Device
825 *
826 * In single channel mode the 6580 has one clock per device and we can
827 * avoid the requirement to clock switch. We also have to load the timing
828 * into the right clock according to whether we are master or slave.
829 */
830
831static void qdi6580_set_piomode(struct ata_port *ap, struct ata_device *adev)
832{
833 struct ata_timing t;
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800834 struct legacy_data *ld_qdi = ap->host->private_data;
Alan Coxdefc9cd2008-01-10 14:33:10 -0800835 int active, recovery;
836 u8 timing;
837
838 /* Get the timing data in cycles */
839 ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
840
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800841 if (ld_qdi->fast) {
Alan Coxdefc9cd2008-01-10 14:33:10 -0800842 active = 8 - FIT(t.active, 1, 8);
843 recovery = 18 - FIT(t.recover, 3, 18);
844 } else {
845 active = 9 - FIT(t.active, 2, 9);
846 recovery = 15 - FIT(t.recover, 0, 15);
847 }
848 timing = (recovery << 4) | active | 0x08;
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800849 ld_qdi->clock[adev->devno] = timing;
850 outb(timing, ld_qdi->timing + 2 * adev->devno);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800851 /* Clear the FIFO */
852 if (adev->class != ATA_DEV_ATA)
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800853 outb(0x5F, ld_qdi->timing + 3);
Alan Coxdefc9cd2008-01-10 14:33:10 -0800854}
855
856/**
857 * qdi_qc_issue_prot - command issue
858 * @qc: command pending
859 *
860 * Called when the libata layer is about to issue a command. We wrap
861 * this interface so that we can load the correct ATA timings.
862 */
863
864static unsigned int qdi_qc_issue_prot(struct ata_queued_cmd *qc)
865{
866 struct ata_port *ap = qc->ap;
867 struct ata_device *adev = qc->dev;
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800868 struct legacy_data *ld_qdi = ap->host->private_data;
Alan Coxdefc9cd2008-01-10 14:33:10 -0800869
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800870 if (ld_qdi->clock[adev->devno] != ld_qdi->last) {
Alan Coxdefc9cd2008-01-10 14:33:10 -0800871 if (adev->pio_mode) {
Harvey Harrisoncb616dd2008-02-14 09:36:32 -0800872 ld_qdi->last = ld_qdi->clock[adev->devno];
873 outb(ld_qdi->clock[adev->devno], ld_qdi->timing +
Alan Coxdefc9cd2008-01-10 14:33:10 -0800874 2 * ap->port_no);
875 }
876 }
877 return ata_qc_issue_prot(qc);
878}
879
Alan Coxb8325482008-01-19 15:47:23 +0000880static unsigned int vlb32_data_xfer(struct ata_device *adev, unsigned char *buf,
Alan Coxdefc9cd2008-01-10 14:33:10 -0800881 unsigned int buflen, int rw)
882{
883 struct ata_port *ap = adev->link->ap;
884 int slop = buflen & 3;
885
886 if (ata_id_has_dword_io(adev->id)) {
887 if (rw == WRITE)
888 iowrite32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
889 else
890 ioread32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
891
892 if (unlikely(slop)) {
893 u32 pad;
894 if (rw == WRITE) {
895 memcpy(&pad, buf + buflen - slop, slop);
896 pad = le32_to_cpu(pad);
897 iowrite32(pad, ap->ioaddr.data_addr);
898 } else {
899 pad = ioread32(ap->ioaddr.data_addr);
900 pad = cpu_to_le32(pad);
901 memcpy(buf + buflen - slop, &pad, slop);
902 }
903 }
904 return (buflen + 3) & ~3;
905 } else
906 return ata_data_xfer(adev, buf, buflen, rw);
907}
908
Alan Coxb8325482008-01-19 15:47:23 +0000909static int qdi_port(struct platform_device *dev,
910 struct legacy_probe *lp, struct legacy_data *ld)
911{
912 if (devm_request_region(&dev->dev, lp->private, 4, "qdi") == NULL)
913 return -EBUSY;
914 ld->timing = lp->private;
915 return 0;
916}
917
Alan Coxdefc9cd2008-01-10 14:33:10 -0800918static struct ata_port_operations qdi6500_port_ops = {
919 .set_piomode = qdi6500_set_piomode,
920
921 .tf_load = ata_tf_load,
922 .tf_read = ata_tf_read,
923 .check_status = ata_check_status,
924 .exec_command = ata_exec_command,
925 .dev_select = ata_std_dev_select,
926
927 .freeze = ata_bmdma_freeze,
928 .thaw = ata_bmdma_thaw,
929 .error_handler = ata_bmdma_error_handler,
930 .post_internal_cmd = ata_bmdma_post_internal_cmd,
931 .cable_detect = ata_cable_40wire,
932
933 .qc_prep = ata_qc_prep,
934 .qc_issue = qdi_qc_issue_prot,
935
Alan Coxb8325482008-01-19 15:47:23 +0000936 .data_xfer = vlb32_data_xfer,
Alan Coxdefc9cd2008-01-10 14:33:10 -0800937
938 .irq_handler = ata_interrupt,
Tejun Heo358f9a72008-03-25 12:22:47 +0900939 .irq_clear = ata_noop_irq_clear,
Alan Coxdefc9cd2008-01-10 14:33:10 -0800940 .irq_on = ata_irq_on,
941
942 .port_start = ata_sff_port_start,
943};
944
945static struct ata_port_operations qdi6580_port_ops = {
946 .set_piomode = qdi6580_set_piomode,
947
948 .tf_load = ata_tf_load,
949 .tf_read = ata_tf_read,
950 .check_status = ata_check_status,
951 .exec_command = ata_exec_command,
952 .dev_select = ata_std_dev_select,
953
954 .freeze = ata_bmdma_freeze,
955 .thaw = ata_bmdma_thaw,
956 .error_handler = ata_bmdma_error_handler,
957 .post_internal_cmd = ata_bmdma_post_internal_cmd,
958 .cable_detect = ata_cable_40wire,
959
960 .qc_prep = ata_qc_prep,
961 .qc_issue = ata_qc_issue_prot,
962
Alan Coxb8325482008-01-19 15:47:23 +0000963 .data_xfer = vlb32_data_xfer,
Alan Coxdefc9cd2008-01-10 14:33:10 -0800964
965 .irq_handler = ata_interrupt,
Tejun Heo358f9a72008-03-25 12:22:47 +0900966 .irq_clear = ata_noop_irq_clear,
Alan Coxdefc9cd2008-01-10 14:33:10 -0800967 .irq_on = ata_irq_on,
968
969 .port_start = ata_sff_port_start,
970};
971
972static struct ata_port_operations qdi6580dp_port_ops = {
973 .set_piomode = qdi6580dp_set_piomode,
974
975 .tf_load = ata_tf_load,
976 .tf_read = ata_tf_read,
977 .check_status = ata_check_status,
978 .exec_command = ata_exec_command,
979 .dev_select = ata_std_dev_select,
980
981 .freeze = ata_bmdma_freeze,
982 .thaw = ata_bmdma_thaw,
983 .error_handler = ata_bmdma_error_handler,
984 .post_internal_cmd = ata_bmdma_post_internal_cmd,
985 .cable_detect = ata_cable_40wire,
986
987 .qc_prep = ata_qc_prep,
988 .qc_issue = qdi_qc_issue_prot,
989
Alan Coxb8325482008-01-19 15:47:23 +0000990 .data_xfer = vlb32_data_xfer,
Alan Coxdefc9cd2008-01-10 14:33:10 -0800991
992 .irq_handler = ata_interrupt,
Tejun Heo358f9a72008-03-25 12:22:47 +0900993 .irq_clear = ata_noop_irq_clear,
Alan Coxdefc9cd2008-01-10 14:33:10 -0800994 .irq_on = ata_irq_on,
995
996 .port_start = ata_sff_port_start,
997};
998
Alan Coxb8325482008-01-19 15:47:23 +0000999static DEFINE_SPINLOCK(winbond_lock);
1000
1001static void winbond_writecfg(unsigned long port, u8 reg, u8 val)
1002{
1003 unsigned long flags;
1004 spin_lock_irqsave(&winbond_lock, flags);
1005 outb(reg, port + 0x01);
1006 outb(val, port + 0x02);
1007 spin_unlock_irqrestore(&winbond_lock, flags);
1008}
1009
1010static u8 winbond_readcfg(unsigned long port, u8 reg)
1011{
1012 u8 val;
1013
1014 unsigned long flags;
1015 spin_lock_irqsave(&winbond_lock, flags);
1016 outb(reg, port + 0x01);
1017 val = inb(port + 0x02);
1018 spin_unlock_irqrestore(&winbond_lock, flags);
1019
1020 return val;
1021}
1022
1023static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev)
1024{
1025 struct ata_timing t;
Harvey Harrisoncb616dd2008-02-14 09:36:32 -08001026 struct legacy_data *ld_winbond = ap->host->private_data;
Alan Coxb8325482008-01-19 15:47:23 +00001027 int active, recovery;
1028 u8 reg;
1029 int timing = 0x88 + (ap->port_no * 4) + (adev->devno * 2);
1030
Harvey Harrisoncb616dd2008-02-14 09:36:32 -08001031 reg = winbond_readcfg(ld_winbond->timing, 0x81);
Alan Coxb8325482008-01-19 15:47:23 +00001032
1033 /* Get the timing data in cycles */
1034 if (reg & 0x40) /* Fast VLB bus, assume 50MHz */
1035 ata_timing_compute(adev, adev->pio_mode, &t, 20000, 1000);
1036 else
1037 ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
1038
1039 active = (FIT(t.active, 3, 17) - 1) & 0x0F;
1040 recovery = (FIT(t.recover, 1, 15) + 1) & 0x0F;
1041 timing = (active << 4) | recovery;
Harvey Harrisoncb616dd2008-02-14 09:36:32 -08001042 winbond_writecfg(ld_winbond->timing, timing, reg);
Alan Coxb8325482008-01-19 15:47:23 +00001043
1044 /* Load the setup timing */
1045
1046 reg = 0x35;
1047 if (adev->class != ATA_DEV_ATA)
1048 reg |= 0x08; /* FIFO off */
1049 if (!ata_pio_need_iordy(adev))
1050 reg |= 0x02; /* IORDY off */
1051 reg |= (FIT(t.setup, 0, 3) << 6);
Harvey Harrisoncb616dd2008-02-14 09:36:32 -08001052 winbond_writecfg(ld_winbond->timing, timing + 1, reg);
Alan Coxb8325482008-01-19 15:47:23 +00001053}
1054
1055static int winbond_port(struct platform_device *dev,
1056 struct legacy_probe *lp, struct legacy_data *ld)
1057{
1058 if (devm_request_region(&dev->dev, lp->private, 4, "winbond") == NULL)
1059 return -EBUSY;
1060 ld->timing = lp->private;
1061 return 0;
1062}
1063
1064static struct ata_port_operations winbond_port_ops = {
1065 .set_piomode = winbond_set_piomode,
1066
1067 .tf_load = ata_tf_load,
1068 .tf_read = ata_tf_read,
1069 .check_status = ata_check_status,
1070 .exec_command = ata_exec_command,
1071 .dev_select = ata_std_dev_select,
1072
1073 .freeze = ata_bmdma_freeze,
1074 .thaw = ata_bmdma_thaw,
1075 .error_handler = ata_bmdma_error_handler,
1076 .post_internal_cmd = ata_bmdma_post_internal_cmd,
1077 .cable_detect = ata_cable_40wire,
1078
1079 .qc_prep = ata_qc_prep,
1080 .qc_issue = ata_qc_issue_prot,
1081
1082 .data_xfer = vlb32_data_xfer,
1083
Tejun Heo358f9a72008-03-25 12:22:47 +09001084 .irq_clear = ata_noop_irq_clear,
Alan Coxb8325482008-01-19 15:47:23 +00001085 .irq_on = ata_irq_on,
1086
1087 .port_start = ata_sff_port_start,
1088};
1089
Alan Coxdefc9cd2008-01-10 14:33:10 -08001090static struct legacy_controller controllers[] = {
1091 {"BIOS", &legacy_port_ops, 0x1F,
1092 ATA_FLAG_NO_IORDY, NULL },
1093 {"Snooping", &simple_port_ops, 0x1F,
1094 0 , NULL },
1095 {"PDC20230", &pdc20230_port_ops, 0x7,
1096 ATA_FLAG_NO_IORDY, NULL },
1097 {"HT6560A", &ht6560a_port_ops, 0x07,
1098 ATA_FLAG_NO_IORDY, NULL },
1099 {"HT6560B", &ht6560b_port_ops, 0x1F,
1100 ATA_FLAG_NO_IORDY, NULL },
1101 {"OPTI82C611A", &opti82c611a_port_ops, 0x0F,
1102 0 , NULL },
1103 {"OPTI82C46X", &opti82c46x_port_ops, 0x0F,
1104 0 , NULL },
1105 {"QDI6500", &qdi6500_port_ops, 0x07,
Alan Coxb8325482008-01-19 15:47:23 +00001106 ATA_FLAG_NO_IORDY, qdi_port },
Alan Coxdefc9cd2008-01-10 14:33:10 -08001107 {"QDI6580", &qdi6580_port_ops, 0x1F,
Alan Coxb8325482008-01-19 15:47:23 +00001108 0 , qdi_port },
Alan Coxdefc9cd2008-01-10 14:33:10 -08001109 {"QDI6580DP", &qdi6580dp_port_ops, 0x1F,
Alan Coxb8325482008-01-19 15:47:23 +00001110 0 , qdi_port },
1111 {"W83759A", &winbond_port_ops, 0x1F,
1112 0 , winbond_port }
Alan Coxdefc9cd2008-01-10 14:33:10 -08001113};
1114
1115/**
1116 * probe_chip_type - Discover controller
1117 * @probe: Probe entry to check
1118 *
1119 * Probe an ATA port and identify the type of controller. We don't
1120 * check if the controller appears to be driveless at this point.
1121 */
1122
Alan Coxb8325482008-01-19 15:47:23 +00001123static __init int probe_chip_type(struct legacy_probe *probe)
Alan Coxdefc9cd2008-01-10 14:33:10 -08001124{
1125 int mask = 1 << probe->slot;
1126
Alan Coxb8325482008-01-19 15:47:23 +00001127 if (winbond && (probe->port == 0x1F0 || probe->port == 0x170)) {
1128 u8 reg = winbond_readcfg(winbond, 0x81);
1129 reg |= 0x80; /* jumpered mode off */
1130 winbond_writecfg(winbond, 0x81, reg);
1131 reg = winbond_readcfg(winbond, 0x83);
1132 reg |= 0xF0; /* local control */
1133 winbond_writecfg(winbond, 0x83, reg);
1134 reg = winbond_readcfg(winbond, 0x85);
1135 reg |= 0xF0; /* programmable timing */
1136 winbond_writecfg(winbond, 0x85, reg);
1137
1138 reg = winbond_readcfg(winbond, 0x81);
1139
1140 if (reg & mask)
1141 return W83759A;
1142 }
Alan Coxdefc9cd2008-01-10 14:33:10 -08001143 if (probe->port == 0x1F0) {
Jeff Garzik669a5db2006-08-29 18:12:40 -04001144 unsigned long flags;
Jeff Garzik669a5db2006-08-29 18:12:40 -04001145 local_irq_save(flags);
Jeff Garzik669a5db2006-08-29 18:12:40 -04001146 /* Probes */
Jeff Garzik669a5db2006-08-29 18:12:40 -04001147 outb(inb(0x1F2) | 0x80, 0x1F2);
Alan Coxdefc9cd2008-01-10 14:33:10 -08001148 inb(0x1F5);
Jeff Garzik669a5db2006-08-29 18:12:40 -04001149 inb(0x1F2);
1150 inb(0x3F6);
1151 inb(0x3F6);
1152 inb(0x1F2);
1153 inb(0x1F2);
1154
1155 if ((inb(0x1F2) & 0x80) == 0) {
1156 /* PDC20230c or 20630 ? */
Alan Coxdefc9cd2008-01-10 14:33:10 -08001157 printk(KERN_INFO "PDC20230-C/20630 VLB ATA controller"
1158 " detected.\n");
Jeff Garzik669a5db2006-08-29 18:12:40 -04001159 udelay(100);
1160 inb(0x1F5);
Alan Coxdefc9cd2008-01-10 14:33:10 -08001161 local_irq_restore(flags);
1162 return PDC20230;
Jeff Garzik669a5db2006-08-29 18:12:40 -04001163 } else {
1164 outb(0x55, 0x1F2);
1165 inb(0x1F2);
1166 inb(0x1F2);
Alan Coxdefc9cd2008-01-10 14:33:10 -08001167 if (inb(0x1F2) == 0x00)
1168 printk(KERN_INFO "PDC20230-B VLB ATA "
1169 "controller detected.\n");
1170 local_irq_restore(flags);
1171 return BIOS;
Jeff Garzik669a5db2006-08-29 18:12:40 -04001172 }
1173 local_irq_restore(flags);
1174 }
1175
Alan Coxdefc9cd2008-01-10 14:33:10 -08001176 if (ht6560a & mask)
1177 return HT6560A;
1178 if (ht6560b & mask)
1179 return HT6560B;
1180 if (opti82c611a & mask)
1181 return OPTI611A;
1182 if (opti82c46x & mask)
1183 return OPTI46X;
1184 if (autospeed & mask)
1185 return SNOOP;
1186 return BIOS;
1187}
Jeff Garzik669a5db2006-08-29 18:12:40 -04001188
Alan Coxdefc9cd2008-01-10 14:33:10 -08001189
1190/**
1191 * legacy_init_one - attach a legacy interface
1192 * @pl: probe record
1193 *
1194 * Register an ISA bus IDE interface. Such interfaces are PIO and we
1195 * assume do not support IRQ sharing.
1196 */
1197
1198static __init int legacy_init_one(struct legacy_probe *probe)
1199{
1200 struct legacy_controller *controller = &controllers[probe->type];
1201 int pio_modes = controller->pio_mask;
1202 unsigned long io = probe->port;
1203 u32 mask = (1 << probe->slot);
1204 struct ata_port_operations *ops = controller->ops;
1205 struct legacy_data *ld = &legacy_data[probe->slot];
1206 struct ata_host *host = NULL;
1207 struct ata_port *ap;
1208 struct platform_device *pdev;
1209 struct ata_device *dev;
1210 void __iomem *io_addr, *ctrl_addr;
1211 u32 iordy = (iordy_mask & mask) ? 0: ATA_FLAG_NO_IORDY;
1212 int ret;
1213
1214 iordy |= controller->flags;
1215
1216 pdev = platform_device_register_simple(DRV_NAME, probe->slot, NULL, 0);
1217 if (IS_ERR(pdev))
1218 return PTR_ERR(pdev);
1219
1220 ret = -EBUSY;
1221 if (devm_request_region(&pdev->dev, io, 8, "pata_legacy") == NULL ||
1222 devm_request_region(&pdev->dev, io + 0x0206, 1,
1223 "pata_legacy") == NULL)
1224 goto fail;
Alan Coxf834e492007-02-07 13:46:00 -08001225
Tejun Heo5d728822007-04-17 23:44:08 +09001226 ret = -ENOMEM;
Alan Coxdefc9cd2008-01-10 14:33:10 -08001227 io_addr = devm_ioport_map(&pdev->dev, io, 8);
1228 ctrl_addr = devm_ioport_map(&pdev->dev, io + 0x0206, 1);
1229 if (!io_addr || !ctrl_addr)
1230 goto fail;
1231 if (controller->setup)
Alan Coxb8325482008-01-19 15:47:23 +00001232 if (controller->setup(pdev, probe, ld) < 0)
Alan Coxdefc9cd2008-01-10 14:33:10 -08001233 goto fail;
Tejun Heo5d728822007-04-17 23:44:08 +09001234 host = ata_host_alloc(&pdev->dev, 1);
1235 if (!host)
1236 goto fail;
1237 ap = host->ports[0];
Jeff Garzik669a5db2006-08-29 18:12:40 -04001238
Tejun Heo5d728822007-04-17 23:44:08 +09001239 ap->ops = ops;
1240 ap->pio_mask = pio_modes;
1241 ap->flags |= ATA_FLAG_SLAVE_POSS | iordy;
1242 ap->ioaddr.cmd_addr = io_addr;
1243 ap->ioaddr.altstatus_addr = ctrl_addr;
1244 ap->ioaddr.ctl_addr = ctrl_addr;
1245 ata_std_ports(&ap->ioaddr);
Alan Coxb8325482008-01-19 15:47:23 +00001246 ap->host->private_data = ld;
Tejun Heo5d728822007-04-17 23:44:08 +09001247
Alan Coxdefc9cd2008-01-10 14:33:10 -08001248 ata_port_desc(ap, "cmd 0x%lx ctl 0x%lx", io, io + 0x0206);
Tejun Heocbcdd872007-08-18 13:14:55 +09001249
Alan Coxdefc9cd2008-01-10 14:33:10 -08001250 ret = ata_host_activate(host, probe->irq, ata_interrupt, 0,
1251 &legacy_sht);
Tejun Heo5d728822007-04-17 23:44:08 +09001252 if (ret)
Jeff Garzik669a5db2006-08-29 18:12:40 -04001253 goto fail;
Jeff Garzik669a5db2006-08-29 18:12:40 -04001254 ld->platform_dev = pdev;
Jeff Garzik669a5db2006-08-29 18:12:40 -04001255
Alan Coxdefc9cd2008-01-10 14:33:10 -08001256 /* Nothing found means we drop the port as its probably not there */
1257
1258 ret = -ENODEV;
1259 ata_link_for_each_dev(dev, &ap->link) {
1260 if (!ata_dev_absent(dev)) {
1261 legacy_host[probe->slot] = host;
1262 ld->platform_dev = pdev;
1263 return 0;
1264 }
1265 }
Jeff Garzik669a5db2006-08-29 18:12:40 -04001266fail:
1267 platform_device_unregister(pdev);
Jeff Garzik669a5db2006-08-29 18:12:40 -04001268 return ret;
1269}
1270
1271/**
1272 * legacy_check_special_cases - ATA special cases
1273 * @p: PCI device to check
1274 * @master: set this if we find an ATA master
1275 * @master: set this if we find an ATA secondary
1276 *
Alan Coxdefc9cd2008-01-10 14:33:10 -08001277 * A small number of vendors implemented early PCI ATA interfaces
1278 * on bridge logic without the ATA interface being PCI visible.
1279 * Where we have a matching PCI driver we must skip the relevant
1280 * device here. If we don't know about it then the legacy driver
1281 * is the right driver anyway.
Jeff Garzik669a5db2006-08-29 18:12:40 -04001282 */
1283
Alan Coxb8325482008-01-19 15:47:23 +00001284static void __init legacy_check_special_cases(struct pci_dev *p, int *primary,
Alan Coxdefc9cd2008-01-10 14:33:10 -08001285 int *secondary)
Jeff Garzik669a5db2006-08-29 18:12:40 -04001286{
1287 /* Cyrix CS5510 pre SFF MWDMA ATA on the bridge */
1288 if (p->vendor == 0x1078 && p->device == 0x0000) {
1289 *primary = *secondary = 1;
1290 return;
1291 }
1292 /* Cyrix CS5520 pre SFF MWDMA ATA on the bridge */
1293 if (p->vendor == 0x1078 && p->device == 0x0002) {
1294 *primary = *secondary = 1;
1295 return;
1296 }
1297 /* Intel MPIIX - PIO ATA on non PCI side of bridge */
1298 if (p->vendor == 0x8086 && p->device == 0x1234) {
1299 u16 r;
1300 pci_read_config_word(p, 0x6C, &r);
Alan Coxdefc9cd2008-01-10 14:33:10 -08001301 if (r & 0x8000) {
1302 /* ATA port enabled */
Jeff Garzik669a5db2006-08-29 18:12:40 -04001303 if (r & 0x4000)
1304 *secondary = 1;
1305 else
1306 *primary = 1;
1307 }
1308 return;
1309 }
1310}
1311
Alan Coxdefc9cd2008-01-10 14:33:10 -08001312static __init void probe_opti_vlb(void)
1313{
1314 /* If an OPTI 82C46X is present find out where the channels are */
1315 static const char *optis[4] = {
1316 "3/463MV", "5MV",
1317 "5MVA", "5MVB"
1318 };
1319 u8 chans = 1;
1320 u8 ctrl = (opti_syscfg(0x30) & 0xC0) >> 6;
1321
1322 opti82c46x = 3; /* Assume master and slave first */
1323 printk(KERN_INFO DRV_NAME ": Opti 82C46%s chipset support.\n",
1324 optis[ctrl]);
1325 if (ctrl == 3)
1326 chans = (opti_syscfg(0x3F) & 0x20) ? 2 : 1;
1327 ctrl = opti_syscfg(0xAC);
1328 /* Check enabled and this port is the 465MV port. On the
1329 MVB we may have two channels */
1330 if (ctrl & 8) {
1331 if (chans == 2) {
1332 legacy_probe_add(0x1F0, 14, OPTI46X, 0);
1333 legacy_probe_add(0x170, 15, OPTI46X, 0);
1334 }
1335 if (ctrl & 4)
1336 legacy_probe_add(0x170, 15, OPTI46X, 0);
1337 else
1338 legacy_probe_add(0x1F0, 14, OPTI46X, 0);
1339 } else
1340 legacy_probe_add(0x1F0, 14, OPTI46X, 0);
1341}
1342
1343static __init void qdi65_identify_port(u8 r, u8 res, unsigned long port)
1344{
1345 static const unsigned long ide_port[2] = { 0x170, 0x1F0 };
1346 /* Check card type */
1347 if ((r & 0xF0) == 0xC0) {
1348 /* QD6500: single channel */
Alan Coxb8325482008-01-19 15:47:23 +00001349 if (r & 8)
Alan Coxdefc9cd2008-01-10 14:33:10 -08001350 /* Disabled ? */
Alan Coxdefc9cd2008-01-10 14:33:10 -08001351 return;
Alan Coxdefc9cd2008-01-10 14:33:10 -08001352 legacy_probe_add(ide_port[r & 0x01], 14 + (r & 0x01),
1353 QDI6500, port);
1354 }
1355 if (((r & 0xF0) == 0xA0) || (r & 0xF0) == 0x50) {
1356 /* QD6580: dual channel */
1357 if (!request_region(port + 2 , 2, "pata_qdi")) {
1358 release_region(port, 2);
1359 return;
1360 }
1361 res = inb(port + 3);
1362 /* Single channel mode ? */
1363 if (res & 1)
1364 legacy_probe_add(ide_port[r & 0x01], 14 + (r & 0x01),
1365 QDI6580, port);
1366 else { /* Dual channel mode */
1367 legacy_probe_add(0x1F0, 14, QDI6580DP, port);
1368 /* port + 0x02, r & 0x04 */
1369 legacy_probe_add(0x170, 15, QDI6580DP, port + 2);
1370 }
Alan Coxb8325482008-01-19 15:47:23 +00001371 release_region(port + 2, 2);
Alan Coxdefc9cd2008-01-10 14:33:10 -08001372 }
1373}
1374
1375static __init void probe_qdi_vlb(void)
1376{
1377 unsigned long flags;
1378 static const unsigned long qd_port[2] = { 0x30, 0xB0 };
1379 int i;
1380
1381 /*
1382 * Check each possible QD65xx base address
1383 */
1384
1385 for (i = 0; i < 2; i++) {
1386 unsigned long port = qd_port[i];
1387 u8 r, res;
1388
1389
1390 if (request_region(port, 2, "pata_qdi")) {
1391 /* Check for a card */
1392 local_irq_save(flags);
1393 /* I have no h/w that needs this delay but it
1394 is present in the historic code */
1395 r = inb(port);
1396 udelay(1);
1397 outb(0x19, port);
1398 udelay(1);
1399 res = inb(port);
1400 udelay(1);
1401 outb(r, port);
1402 udelay(1);
1403 local_irq_restore(flags);
1404
1405 /* Fail */
1406 if (res == 0x19) {
1407 release_region(port, 2);
1408 continue;
1409 }
1410 /* Passes the presence test */
1411 r = inb(port + 1);
1412 udelay(1);
1413 /* Check port agrees with port set */
Alan Coxb8325482008-01-19 15:47:23 +00001414 if ((r & 2) >> 1 == i)
1415 qdi65_identify_port(r, res, port);
1416 release_region(port, 2);
Alan Coxdefc9cd2008-01-10 14:33:10 -08001417 }
1418 }
1419}
Jeff Garzik669a5db2006-08-29 18:12:40 -04001420
1421/**
1422 * legacy_init - attach legacy interfaces
1423 *
1424 * Attach legacy IDE interfaces by scanning the usual IRQ/port suspects.
1425 * Right now we do not scan the ide0 and ide1 address but should do so
1426 * for non PCI systems or systems with no PCI IDE legacy mode devices.
1427 * If you fix that note there are special cases to consider like VLB
1428 * drivers and CS5510/20.
1429 */
1430
1431static __init int legacy_init(void)
1432{
1433 int i;
1434 int ct = 0;
1435 int primary = 0;
1436 int secondary = 0;
Alan Coxdefc9cd2008-01-10 14:33:10 -08001437 int pci_present = 0;
1438 struct legacy_probe *pl = &probe_list[0];
1439 int slot = 0;
Jeff Garzik669a5db2006-08-29 18:12:40 -04001440
1441 struct pci_dev *p = NULL;
1442
1443 for_each_pci_dev(p) {
1444 int r;
Alan Coxdefc9cd2008-01-10 14:33:10 -08001445 /* Check for any overlap of the system ATA mappings. Native
1446 mode controllers stuck on these addresses or some devices
1447 in 'raid' mode won't be found by the storage class test */
Jeff Garzik669a5db2006-08-29 18:12:40 -04001448 for (r = 0; r < 6; r++) {
1449 if (pci_resource_start(p, r) == 0x1f0)
1450 primary = 1;
1451 if (pci_resource_start(p, r) == 0x170)
1452 secondary = 1;
1453 }
1454 /* Check for special cases */
1455 legacy_check_special_cases(p, &primary, &secondary);
1456
Alan Coxdefc9cd2008-01-10 14:33:10 -08001457 /* If PCI bus is present then don't probe for tertiary
1458 legacy ports */
1459 pci_present = 1;
Jeff Garzik669a5db2006-08-29 18:12:40 -04001460 }
1461
Alan Coxb8325482008-01-19 15:47:23 +00001462 if (winbond == 1)
1463 winbond = 0x130; /* Default port, alt is 1B0 */
1464
Alan Coxdefc9cd2008-01-10 14:33:10 -08001465 if (primary == 0 || all)
1466 legacy_probe_add(0x1F0, 14, UNKNOWN, 0);
1467 if (secondary == 0 || all)
1468 legacy_probe_add(0x170, 15, UNKNOWN, 0);
Jeff Garzik85cd7252006-08-31 00:03:49 -04001469
Alan Coxdefc9cd2008-01-10 14:33:10 -08001470 if (probe_all || !pci_present) {
1471 /* ISA/VLB extra ports */
1472 legacy_probe_add(0x1E8, 11, UNKNOWN, 0);
1473 legacy_probe_add(0x168, 10, UNKNOWN, 0);
1474 legacy_probe_add(0x1E0, 8, UNKNOWN, 0);
1475 legacy_probe_add(0x160, 12, UNKNOWN, 0);
Jeff Garzik669a5db2006-08-29 18:12:40 -04001476 }
1477
Alan Coxdefc9cd2008-01-10 14:33:10 -08001478 if (opti82c46x)
1479 probe_opti_vlb();
1480 if (qdi)
1481 probe_qdi_vlb();
1482
Alan Coxdefc9cd2008-01-10 14:33:10 -08001483 for (i = 0; i < NR_HOST; i++, pl++) {
1484 if (pl->port == 0)
Jeff Garzik669a5db2006-08-29 18:12:40 -04001485 continue;
Alan Coxdefc9cd2008-01-10 14:33:10 -08001486 if (pl->type == UNKNOWN)
1487 pl->type = probe_chip_type(pl);
1488 pl->slot = slot++;
1489 if (legacy_init_one(pl) == 0)
Jeff Garzik669a5db2006-08-29 18:12:40 -04001490 ct++;
1491 }
1492 if (ct != 0)
1493 return 0;
1494 return -ENODEV;
1495}
1496
1497static __exit void legacy_exit(void)
1498{
1499 int i;
1500
1501 for (i = 0; i < nr_legacy_host; i++) {
1502 struct legacy_data *ld = &legacy_data[i];
Tejun Heo24dc5f32007-01-20 16:00:28 +09001503 ata_host_detach(legacy_host[i]);
Jeff Garzik669a5db2006-08-29 18:12:40 -04001504 platform_device_unregister(ld->platform_dev);
Jeff Garzik669a5db2006-08-29 18:12:40 -04001505 }
1506}
1507
1508MODULE_AUTHOR("Alan Cox");
1509MODULE_DESCRIPTION("low-level driver for legacy ATA");
1510MODULE_LICENSE("GPL");
1511MODULE_VERSION(DRV_VERSION);
1512
1513module_param(probe_all, int, 0);
1514module_param(autospeed, int, 0);
1515module_param(ht6560a, int, 0);
1516module_param(ht6560b, int, 0);
1517module_param(opti82c611a, int, 0);
1518module_param(opti82c46x, int, 0);
Alan Coxdefc9cd2008-01-10 14:33:10 -08001519module_param(qdi, int, 0);
Jeff Garzik669a5db2006-08-29 18:12:40 -04001520module_param(pio_mask, int, 0);
Alan Coxf834e492007-02-07 13:46:00 -08001521module_param(iordy_mask, int, 0);
Jeff Garzik669a5db2006-08-29 18:12:40 -04001522
1523module_init(legacy_init);
1524module_exit(legacy_exit);