pdc202xx_new: PLL initialization support
PATCH 1/3 pdc202xx_new: PLL initialization support
Hi Bart,
These are the patches for pdc202xx_new PLL initialization support. It is to fix
the problem when there are more than two pdc202xx adapters, the on board firmware does not initialize the PLL for the 3rd/4th... adapters. As in:
http://marc.theaimsgroup.com/?l=linux-ide&m=110902518625384&w=2
Attached please find the patch 1/3 against the ide-2.6 tree for your review. Thanks.
Changes:
1/3: Remove spaces in function declaration and add new lines. 2/3: Replace the index register macros with functions 3/3: Add PLL initialization code
Albert
Signed-off-by Albert Lee <[email protected]>
-----------------------------------------------------------------------------------------------------------
drivers/ide/pci/pdc202xx_new.c +14 -8
@@ -77,7 +77,7 @@set_2regs (0x13 ,(c)); \ }while (0 ) -static u8 pdcnew_ratemask (ide_drive_t *drive) +static u8 pdcnew_ratemask(ide_drive_t *drive) {u8 mode;
@@ -96,12 +96,14 @@default :return 0 ; } +if (!eighty_ninty_three (drive)) mode =min (mode, (u8 )1 ); +return mode; } -static int check_in_drive_lists (ide_drive_t *drive,const char **list) +static int check_in_drive_lists (ide_drive_t *drive,const char **list) {struct hd_driveid *id = drive->id;
@@ -121,7 +123,7 @@return 0 ; } -static int pdcnew_new_tune_chipset (ide_drive_t *drive,u8 xferspeed) +static int pdcnew_new_tune_chipset (ide_drive_t *drive,u8 xferspeed) {ide_hwif_t *hwif =HWIF (drive);unsigned long indexreg = hwif->dma_vendor1;
@@ -177,12 +179,12 @@ (void )pdcnew_new_tune_chipset (drive, speed); } -static u8 pdcnew_new_cable_detect (ide_hwif_t *hwif) +static u8 pdcnew_new_cable_detect (ide_hwif_t *hwif) { hwif->OUTB (0x0b , hwif->dma_vendor1);return ((u8)((hwif->INB (hwif->dma_vendor3) &0x04 ))); } -static int config_chipset_for_dma (ide_drive_t *drive) +static int config_chipset_for_dma (ide_drive_t *drive) {struct hd_driveid *id = drive->id;ide_hwif_t *hwif =HWIF (drive);
@@ -201,6 +203,7 @@if (drive->media != ide_disk)return 0 ; +if (id->capability &4 ) {/* IORDY_EN & PREFETCH_EN */ hwif->OUTB ((0x13 + ((drive->dn%2 ) ?0x08 :0x00 )), hwif->dma_vendor1); hwif->OUTB ((hwif->INB (hwif->dma_vendor3)|0x03 ), hwif->dma_vendor3);
@@ -217,7 +220,7 @@return ide_dma_enable (drive); } -static int pdcnew_config_drive_xfer_rate (ide_drive_t *drive) +static int pdcnew_config_drive_xfer_rate (ide_drive_t *drive) {ide_hwif_t *hwif =HWIF (drive);struct hd_driveid *id = drive->id;
@@ -242,7 +245,7 @@return 0 ; } -static int pdcnew_quirkproc (ide_drive_t *drive) +static int pdcnew_quirkproc (ide_drive_t *drive) {return ((int )check_in_drive_lists (drive, pdc_quirk_drives)); }
@@ -261,7 +264,7 @@return __ide_dma_timeout (drive); } -static void pdcnew_new_reset (ide_drive_t *drive) +static void pdcnew_new_reset (ide_drive_t *drive) {/* * Deleted this because it is redundant from the caller.
@@ -341,10 +344,13 @@ hwif->ide_dma_check = &pdcnew_config_drive_xfer_rate; hwif->ide_dma_lostirq = &pdcnew_ide_dma_lostirq; hwif->ide_dma_timeout = &pdcnew_ide_dma_timeout; +if (!(hwif->udma_four)) hwif->udma_four = (pdcnew_new_cable_detect (hwif)) ?0 :1 ; +if (!noautodma) hwif->autodma =1 ; + hwif->drives[0 ].autodma = hwif->drives[1 ].autodma = hwif->autodma;#if PDC202_DEBUG_CABLE printk(KERN_DEBUG "%s: %s-pin cable\n",