Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mfashe...
[pandora-kernel.git] / drivers / ide / pci / sl82c105.c
1 /*
2  * linux/drivers/ide/pci/sl82c105.c
3  *
4  * SL82C105/Winbond 553 IDE driver
5  *
6  * Maintainer unknown.
7  *
8  * Drive tuning added from Rebel.com's kernel sources
9  *  -- Russell King (15/11/98) linux@arm.linux.org.uk
10  * 
11  * Merge in Russell's HW workarounds, fix various problems
12  * with the timing registers setup.
13  *  -- Benjamin Herrenschmidt (01/11/03) benh@kernel.crashing.org
14  *
15  * Copyright (C) 2006-2007 MontaVista Software, Inc. <source@mvista.com>
16  */
17
18 #include <linux/types.h>
19 #include <linux/module.h>
20 #include <linux/kernel.h>
21 #include <linux/timer.h>
22 #include <linux/mm.h>
23 #include <linux/ioport.h>
24 #include <linux/interrupt.h>
25 #include <linux/blkdev.h>
26 #include <linux/hdreg.h>
27 #include <linux/pci.h>
28 #include <linux/ide.h>
29
30 #include <asm/io.h>
31 #include <asm/dma.h>
32
33 #undef DEBUG
34
35 #ifdef DEBUG
36 #define DBG(arg) printk arg
37 #else
38 #define DBG(fmt,...)
39 #endif
40 /*
41  * SL82C105 PCI config register 0x40 bits.
42  */
43 #define CTRL_IDE_IRQB   (1 << 30)
44 #define CTRL_IDE_IRQA   (1 << 28)
45 #define CTRL_LEGIRQ     (1 << 11)
46 #define CTRL_P1F16      (1 << 5)
47 #define CTRL_P1EN       (1 << 4)
48 #define CTRL_P0F16      (1 << 1)
49 #define CTRL_P0EN       (1 << 0)
50
51 /*
52  * Convert a PIO mode and cycle time to the required on/off times
53  * for the interface.  This has protection against runaway timings.
54  */
55 static unsigned int get_pio_timings(ide_drive_t *drive, u8 pio)
56 {
57         unsigned int cmd_on, cmd_off;
58         u8 iordy = 0;
59
60         cmd_on  = (ide_pio_timings[pio].active_time + 29) / 30;
61         cmd_off = (ide_pio_cycle_time(drive, pio) - 30 * cmd_on + 29) / 30;
62
63         if (cmd_on == 0)
64                 cmd_on = 1;
65
66         if (cmd_off == 0)
67                 cmd_off = 1;
68
69         if (pio > 2 || ide_dev_has_iordy(drive->id))
70                 iordy = 0x40;
71
72         return (cmd_on - 1) << 8 | (cmd_off - 1) | iordy;
73 }
74
75 /*
76  * Configure the chipset for PIO mode.
77  */
78 static void sl82c105_set_pio_mode(ide_drive_t *drive, const u8 pio)
79 {
80         struct pci_dev *dev     = HWIF(drive)->pci_dev;
81         int reg                 = 0x44 + drive->dn * 4;
82         u16 drv_ctrl;
83
84         drv_ctrl = get_pio_timings(drive, pio);
85
86         /*
87          * Store the PIO timings so that we can restore them
88          * in case DMA will be turned off...
89          */
90         drive->drive_data &= 0xffff0000;
91         drive->drive_data |= drv_ctrl;
92
93         if (!drive->using_dma) {
94                 /*
95                  * If we are actually using MW DMA, then we can not
96                  * reprogram the interface drive control register.
97                  */
98                 pci_write_config_word(dev, reg,  drv_ctrl);
99                 pci_read_config_word (dev, reg, &drv_ctrl);
100         }
101
102         printk(KERN_DEBUG "%s: selected %s (%dns) (%04X)\n", drive->name,
103                           ide_xfer_verbose(pio + XFER_PIO_0),
104                           ide_pio_cycle_time(drive, pio), drv_ctrl);
105 }
106
107 /*
108  * Configure the chipset for DMA mode.
109  */
110 static void sl82c105_set_dma_mode(ide_drive_t *drive, const u8 speed)
111 {
112         static u16 mwdma_timings[] = {0x0707, 0x0201, 0x0200};
113         u16 drv_ctrl;
114
115         DBG(("sl82c105_tune_chipset(drive:%s, speed:%s)\n",
116              drive->name, ide_xfer_verbose(speed)));
117
118         drv_ctrl = mwdma_timings[speed - XFER_MW_DMA_0];
119
120         /*
121          * Store the DMA timings so that we can actually program
122          * them when DMA will be turned on...
123          */
124         drive->drive_data &= 0x0000ffff;
125         drive->drive_data |= (unsigned long)drv_ctrl << 16;
126
127         /*
128          * If we are already using DMA, we just reprogram
129          * the drive control register.
130          */
131         if (drive->using_dma) {
132                 struct pci_dev *dev     = HWIF(drive)->pci_dev;
133                 int reg                 = 0x44 + drive->dn * 4;
134
135                 pci_write_config_word(dev, reg, drv_ctrl);
136         }
137 }
138
139 /*
140  * The SL82C105 holds off all IDE interrupts while in DMA mode until
141  * all DMA activity is completed.  Sometimes this causes problems (eg,
142  * when the drive wants to report an error condition).
143  *
144  * 0x7e is a "chip testing" register.  Bit 2 resets the DMA controller
145  * state machine.  We need to kick this to work around various bugs.
146  */
147 static inline void sl82c105_reset_host(struct pci_dev *dev)
148 {
149         u16 val;
150
151         pci_read_config_word(dev, 0x7e, &val);
152         pci_write_config_word(dev, 0x7e, val | (1 << 2));
153         pci_write_config_word(dev, 0x7e, val & ~(1 << 2));
154 }
155
156 /*
157  * If we get an IRQ timeout, it might be that the DMA state machine
158  * got confused.  Fix from Todd Inglett.  Details from Winbond.
159  *
160  * This function is called when the IDE timer expires, the drive
161  * indicates that it is READY, and we were waiting for DMA to complete.
162  */
163 static void sl82c105_dma_lost_irq(ide_drive_t *drive)
164 {
165         ide_hwif_t *hwif        = HWIF(drive);
166         struct pci_dev *dev     = hwif->pci_dev;
167         u32 val, mask           = hwif->channel ? CTRL_IDE_IRQB : CTRL_IDE_IRQA;
168         u8 dma_cmd;
169
170         printk("sl82c105: lost IRQ, resetting host\n");
171
172         /*
173          * Check the raw interrupt from the drive.
174          */
175         pci_read_config_dword(dev, 0x40, &val);
176         if (val & mask)
177                 printk("sl82c105: drive was requesting IRQ, but host lost it\n");
178
179         /*
180          * Was DMA enabled?  If so, disable it - we're resetting the
181          * host.  The IDE layer will be handling the drive for us.
182          */
183         dma_cmd = inb(hwif->dma_command);
184         if (dma_cmd & 1) {
185                 outb(dma_cmd & ~1, hwif->dma_command);
186                 printk("sl82c105: DMA was enabled\n");
187         }
188
189         sl82c105_reset_host(dev);
190 }
191
192 /*
193  * ATAPI devices can cause the SL82C105 DMA state machine to go gaga.
194  * Winbond recommend that the DMA state machine is reset prior to
195  * setting the bus master DMA enable bit.
196  *
197  * The generic IDE core will have disabled the BMEN bit before this
198  * function is called.
199  */
200 static void sl82c105_dma_start(ide_drive_t *drive)
201 {
202         ide_hwif_t *hwif        = HWIF(drive);
203         struct pci_dev *dev     = hwif->pci_dev;
204
205         sl82c105_reset_host(dev);
206         ide_dma_start(drive);
207 }
208
209 static void sl82c105_dma_timeout(ide_drive_t *drive)
210 {
211         DBG(("sl82c105_dma_timeout(drive:%s)\n", drive->name));
212
213         sl82c105_reset_host(HWIF(drive)->pci_dev);
214         ide_dma_timeout(drive);
215 }
216
217 static int sl82c105_ide_dma_on(ide_drive_t *drive)
218 {
219         struct pci_dev *dev     = HWIF(drive)->pci_dev;
220         int rc, reg             = 0x44 + drive->dn * 4;
221
222         DBG(("sl82c105_ide_dma_on(drive:%s)\n", drive->name));
223
224         rc = __ide_dma_on(drive);
225         if (rc == 0) {
226                 pci_write_config_word(dev, reg, drive->drive_data >> 16);
227
228                 printk(KERN_INFO "%s: DMA enabled\n", drive->name);
229         }
230         return rc;
231 }
232
233 static void sl82c105_dma_off_quietly(ide_drive_t *drive)
234 {
235         struct pci_dev *dev     = HWIF(drive)->pci_dev;
236         int reg                 = 0x44 + drive->dn * 4;
237
238         DBG(("sl82c105_dma_off_quietly(drive:%s)\n", drive->name));
239
240         pci_write_config_word(dev, reg, drive->drive_data);
241
242         ide_dma_off_quietly(drive);
243 }
244
245 /*
246  * Ok, that is nasty, but we must make sure the DMA timings
247  * won't be used for a PIO access. The solution here is
248  * to make sure the 16 bits mode is diabled on the channel
249  * when DMA is enabled, thus causing the chip to use PIO0
250  * timings for those operations.
251  */
252 static void sl82c105_selectproc(ide_drive_t *drive)
253 {
254         ide_hwif_t *hwif        = HWIF(drive);
255         struct pci_dev *dev     = hwif->pci_dev;
256         u32 val, old, mask;
257
258         //DBG(("sl82c105_selectproc(drive:%s)\n", drive->name));
259
260         mask = hwif->channel ? CTRL_P1F16 : CTRL_P0F16;
261         old = val = (u32)pci_get_drvdata(dev);
262         if (drive->using_dma)
263                 val &= ~mask;
264         else
265                 val |= mask;
266         if (old != val) {
267                 pci_write_config_dword(dev, 0x40, val); 
268                 pci_set_drvdata(dev, (void *)val);
269         }
270 }
271
272 /*
273  * ATA reset will clear the 16 bits mode in the control
274  * register, we need to update our cache
275  */
276 static void sl82c105_resetproc(ide_drive_t *drive)
277 {
278         struct pci_dev *dev = HWIF(drive)->pci_dev;
279         u32 val;
280
281         DBG(("sl82c105_resetproc(drive:%s)\n", drive->name));
282
283         pci_read_config_dword(dev, 0x40, &val);
284         pci_set_drvdata(dev, (void *)val);
285 }
286
287 /*
288  * Return the revision of the Winbond bridge
289  * which this function is part of.
290  */
291 static unsigned int sl82c105_bridge_revision(struct pci_dev *dev)
292 {
293         struct pci_dev *bridge;
294
295         /*
296          * The bridge should be part of the same device, but function 0.
297          */
298         bridge = pci_get_bus_and_slot(dev->bus->number,
299                                PCI_DEVFN(PCI_SLOT(dev->devfn), 0));
300         if (!bridge)
301                 return -1;
302
303         /*
304          * Make sure it is a Winbond 553 and is an ISA bridge.
305          */
306         if (bridge->vendor != PCI_VENDOR_ID_WINBOND ||
307             bridge->device != PCI_DEVICE_ID_WINBOND_83C553 ||
308             bridge->class >> 8 != PCI_CLASS_BRIDGE_ISA) {
309                 pci_dev_put(bridge);
310                 return -1;
311         }
312         /*
313          * We need to find function 0's revision, not function 1
314          */
315         pci_dev_put(bridge);
316
317         return bridge->revision;
318 }
319
320 /*
321  * Enable the PCI device
322  * 
323  * --BenH: It's arch fixup code that should enable channels that
324  * have not been enabled by firmware. I decided we can still enable
325  * channel 0 here at least, but channel 1 has to be enabled by
326  * firmware or arch code. We still set both to 16 bits mode.
327  */
328 static unsigned int __devinit init_chipset_sl82c105(struct pci_dev *dev, const char *msg)
329 {
330         u32 val;
331
332         DBG(("init_chipset_sl82c105()\n"));
333
334         pci_read_config_dword(dev, 0x40, &val);
335         val |= CTRL_P0EN | CTRL_P0F16 | CTRL_P1F16;
336         pci_write_config_dword(dev, 0x40, val);
337         pci_set_drvdata(dev, (void *)val);
338
339         return dev->irq;
340 }
341
342 /*
343  * Initialise IDE channel
344  */
345 static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif)
346 {
347         unsigned int rev;
348
349         DBG(("init_hwif_sl82c105(hwif: ide%d)\n", hwif->index));
350
351         hwif->set_pio_mode      = &sl82c105_set_pio_mode;
352         hwif->set_dma_mode      = &sl82c105_set_dma_mode;
353         hwif->selectproc        = &sl82c105_selectproc;
354         hwif->resetproc         = &sl82c105_resetproc;
355
356         if (!hwif->dma_base)
357                 return;
358
359         rev = sl82c105_bridge_revision(hwif->pci_dev);
360         if (rev <= 5) {
361                 /*
362                  * Never ever EVER under any circumstances enable
363                  * DMA when the bridge is this old.
364                  */
365                 printk("    %s: Winbond W83C553 bridge revision %d, "
366                        "BM-DMA disabled\n", hwif->name, rev);
367                 return;
368         }
369
370         hwif->mwdma_mask = ATA_MWDMA2;
371
372         hwif->ide_dma_on                = &sl82c105_ide_dma_on;
373         hwif->dma_off_quietly           = &sl82c105_dma_off_quietly;
374         hwif->dma_lost_irq              = &sl82c105_dma_lost_irq;
375         hwif->dma_start                 = &sl82c105_dma_start;
376         hwif->dma_timeout               = &sl82c105_dma_timeout;
377
378         if (hwif->mate)
379                 hwif->serialized = hwif->mate->serialized = 1;
380 }
381
382 static const struct ide_port_info sl82c105_chipset __devinitdata = {
383         .name           = "W82C105",
384         .init_chipset   = init_chipset_sl82c105,
385         .init_hwif      = init_hwif_sl82c105,
386         .enablebits     = {{0x40,0x01,0x01}, {0x40,0x10,0x10}},
387         .host_flags     = IDE_HFLAG_IO_32BIT |
388                           IDE_HFLAG_UNMASK_IRQS |
389                           IDE_HFLAG_NO_AUTODMA |
390                           IDE_HFLAG_BOOTABLE,
391         .pio_mask       = ATA_PIO5,
392 };
393
394 static int __devinit sl82c105_init_one(struct pci_dev *dev, const struct pci_device_id *id)
395 {
396         return ide_setup_pci_device(dev, &sl82c105_chipset);
397 }
398
399 static const struct pci_device_id sl82c105_pci_tbl[] = {
400         { PCI_VDEVICE(WINBOND, PCI_DEVICE_ID_WINBOND_82C105), 0 },
401         { 0, },
402 };
403 MODULE_DEVICE_TABLE(pci, sl82c105_pci_tbl);
404
405 static struct pci_driver driver = {
406         .name           = "W82C105_IDE",
407         .id_table       = sl82c105_pci_tbl,
408         .probe          = sl82c105_init_one,
409 };
410
411 static int __init sl82c105_ide_init(void)
412 {
413         return ide_pci_register_driver(&driver);
414 }
415
416 module_init(sl82c105_ide_init);
417
418 MODULE_DESCRIPTION("PCI driver module for W82C105 IDE");
419 MODULE_LICENSE("GPL");