Merge master.kernel.org:/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog
[pandora-kernel.git] / drivers / ide / pci / pdc202xx_old.c
index 1e209d8..730e8d1 100644 (file)
@@ -28,7 +28,6 @@
  *  Released under terms of General Public License
  */
 
-#include <linux/config.h>
 #include <linux/types.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
@@ -124,26 +123,6 @@ static u8 pdc202xx_ratemask (ide_drive_t *drive)
        return mode;
 }
 
-static int check_in_drive_lists (ide_drive_t *drive, const char **list)
-{
-       struct hd_driveid *id = drive->id;
-
-       if (pdc_quirk_drives == list) {
-               while (*list) {
-                       if (strstr(id->model, *list++)) {
-                               return 2;
-                       }
-               }
-       } else {
-               while (*list) {
-                       if (!strcmp(*list++,id->model)) {
-                               return 1;
-                       }
-               }
-       }
-       return 0;
-}
-
 static int pdc202xx_tune_chipset (ide_drive_t *drive, u8 xferspeed)
 {
        ide_hwif_t *hwif        = HWIF(drive);
@@ -155,7 +134,8 @@ static int pdc202xx_tune_chipset (ide_drive_t *drive, u8 xferspeed)
        u8                      AP, BP, CP, DP;
        u8                      TA = 0, TB = 0, TC = 0;
 
-       if ((drive->media != ide_disk) && (speed < XFER_SW_DMA_0))
+       if (drive->media != ide_disk &&
+               drive->media != ide_cdrom && speed < XFER_SW_DMA_0)
                return -1;
 
        pci_read_config_dword(dev, drive_pci, &drive_conf);
@@ -331,14 +311,12 @@ static int config_chipset_for_dma (ide_drive_t *drive)
 
 chipset_is_set:
 
-       if (drive->media == ide_disk) {
-               pci_read_config_byte(dev, (drive_pci), &AP);
-               if (id->capability & 4) /* IORDY_EN */
-                       pci_write_config_byte(dev, (drive_pci), AP|IORDY_EN);
-               pci_read_config_byte(dev, (drive_pci), &AP);
-               if (drive->media == ide_disk)   /* PREFETCH_EN */
-                       pci_write_config_byte(dev, (drive_pci), AP|PREFETCH_EN);
-       }
+       pci_read_config_byte(dev, (drive_pci), &AP);
+       if (id->capability & 4) /* IORDY_EN */
+               pci_write_config_byte(dev, (drive_pci), AP|IORDY_EN);
+       pci_read_config_byte(dev, (drive_pci), &AP);
+       if (drive->media == ide_disk)   /* PREFETCH_EN */
+               pci_write_config_byte(dev, (drive_pci), AP|PREFETCH_EN);
 
        speed = ide_dma_speed(drive, pdc202xx_ratemask(drive));
 
@@ -379,14 +357,19 @@ fast_ata_pio:
 
 static int pdc202xx_quirkproc (ide_drive_t *drive)
 {
-       return ((int) check_in_drive_lists(drive, pdc_quirk_drives));
+       const char **list, *model = drive->id->model;
+
+       for (list = pdc_quirk_drives; *list != NULL; list++)
+               if (strstr(model, *list) != NULL)
+                       return 2;
+       return 0;
 }
 
 static void pdc202xx_old_ide_dma_start(ide_drive_t *drive)
 {
        if (drive->current_speed > XFER_UDMA_2)
                pdc_old_enable_66MHz_clock(drive->hwif);
-       if (drive->addressing == 1) {
+       if (drive->media != ide_disk || drive->addressing == 1) {
                struct request *rq      = HWGROUP(drive)->rq;
                ide_hwif_t *hwif        = HWIF(drive);
                unsigned long high_16   = hwif->dma_master;
@@ -406,7 +389,7 @@ static void pdc202xx_old_ide_dma_start(ide_drive_t *drive)
 
 static int pdc202xx_old_ide_dma_end(ide_drive_t *drive)
 {
-       if (drive->addressing == 1) {
+       if (drive->media != ide_disk || drive->addressing == 1) {
                ide_hwif_t *hwif        = HWIF(drive);
                unsigned long high_16   = hwif->dma_master;
                unsigned long atapi_reg = high_16 + (hwif->channel ? 0x24 : 0x20);
@@ -520,6 +503,7 @@ static void __devinit init_hwif_pdc202xx(ide_hwif_t *hwif)
        hwif->ultra_mask = 0x3f;
        hwif->mwdma_mask = 0x07;
        hwif->swdma_mask = 0x07;
+       hwif->atapi_dma = 1;
 
        hwif->err_stops_fifo = 1;
 
@@ -720,7 +704,7 @@ static struct pci_driver driver = {
        .probe          = pdc202xx_init_one,
 };
 
-static int pdc202xx_ide_init(void)
+static int __init pdc202xx_ide_init(void)
 {
        return ide_pci_register_driver(&driver);
 }