diff options
Diffstat (limited to 'drivers/ide/pci/pdc202xx_new.c')
-rw-r--r-- | drivers/ide/pci/pdc202xx_new.c | 201 |
1 files changed, 67 insertions, 134 deletions
diff --git a/drivers/ide/pci/pdc202xx_new.c b/drivers/ide/pci/pdc202xx_new.c index 8704b6f33312..d1e7823454f3 100644 --- a/drivers/ide/pci/pdc202xx_new.c +++ b/drivers/ide/pci/pdc202xx_new.c | |||
@@ -332,16 +332,12 @@ static long __devinit detect_pll_input_clock(unsigned long dma_base) | |||
332 | static void __devinit apple_kiwi_init(struct pci_dev *pdev) | 332 | static void __devinit apple_kiwi_init(struct pci_dev *pdev) |
333 | { | 333 | { |
334 | struct device_node *np = pci_device_to_OF_node(pdev); | 334 | struct device_node *np = pci_device_to_OF_node(pdev); |
335 | unsigned int class_rev = 0; | ||
336 | u8 conf; | 335 | u8 conf; |
337 | 336 | ||
338 | if (np == NULL || !of_device_is_compatible(np, "kiwi-root")) | 337 | if (np == NULL || !of_device_is_compatible(np, "kiwi-root")) |
339 | return; | 338 | return; |
340 | 339 | ||
341 | pci_read_config_dword(pdev, PCI_CLASS_REVISION, &class_rev); | 340 | if (pdev->revision >= 0x03) { |
342 | class_rev &= 0xff; | ||
343 | |||
344 | if (class_rev >= 0x03) { | ||
345 | /* Setup chip magic config stuff (from darwin) */ | 341 | /* Setup chip magic config stuff (from darwin) */ |
346 | pci_read_config_byte (pdev, 0x40, &conf); | 342 | pci_read_config_byte (pdev, 0x40, &conf); |
347 | pci_write_config_byte(pdev, 0x40, (conf | 0x01)); | 343 | pci_write_config_byte(pdev, 0x40, (conf | 0x01)); |
@@ -475,32 +471,76 @@ static void __devinit init_hwif_pdc202new(ide_hwif_t *hwif) | |||
475 | hwif->quirkproc = &pdcnew_quirkproc; | 471 | hwif->quirkproc = &pdcnew_quirkproc; |
476 | hwif->resetproc = &pdcnew_reset; | 472 | hwif->resetproc = &pdcnew_reset; |
477 | 473 | ||
478 | hwif->err_stops_fifo = 1; | ||
479 | |||
480 | hwif->drives[0].autotune = hwif->drives[1].autotune = 1; | ||
481 | |||
482 | if (hwif->dma_base == 0) | 474 | if (hwif->dma_base == 0) |
483 | return; | 475 | return; |
484 | 476 | ||
485 | hwif->atapi_dma = 1; | ||
486 | |||
487 | hwif->ultra_mask = hwif->cds->udma_mask; | ||
488 | hwif->mwdma_mask = 0x07; | ||
489 | |||
490 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) | 477 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) |
491 | hwif->cbl = pdcnew_cable_detect(hwif); | 478 | hwif->cbl = pdcnew_cable_detect(hwif); |
492 | } | 479 | } |
493 | 480 | ||
494 | static int __devinit init_setup_pdcnew(struct pci_dev *dev, ide_pci_device_t *d) | 481 | static struct pci_dev * __devinit pdc20270_get_dev2(struct pci_dev *dev) |
495 | { | 482 | { |
496 | return ide_setup_pci_device(dev, d); | 483 | struct pci_dev *dev2; |
484 | |||
485 | dev2 = pci_get_slot(dev->bus, PCI_DEVFN(PCI_SLOT(dev->devfn) + 2, | ||
486 | PCI_FUNC(dev->devfn))); | ||
487 | if (dev2 && | ||
488 | dev2->vendor == dev->vendor && | ||
489 | dev2->device == dev->device) { | ||
490 | |||
491 | if (dev2->irq != dev->irq) { | ||
492 | dev2->irq = dev->irq; | ||
493 | printk(KERN_INFO "PDC20270: PCI config space " | ||
494 | "interrupt fixed\n"); | ||
495 | } | ||
496 | |||
497 | return dev2; | ||
498 | } | ||
499 | |||
500 | return NULL; | ||
497 | } | 501 | } |
498 | 502 | ||
499 | static int __devinit init_setup_pdc20270(struct pci_dev *dev, ide_pci_device_t *d) | 503 | #define DECLARE_PDCNEW_DEV(name_str, udma) \ |
504 | { \ | ||
505 | .name = name_str, \ | ||
506 | .init_chipset = init_chipset_pdcnew, \ | ||
507 | .init_hwif = init_hwif_pdc202new, \ | ||
508 | .host_flags = IDE_HFLAG_POST_SET_MODE | \ | ||
509 | IDE_HFLAG_ERROR_STOPS_FIFO | \ | ||
510 | IDE_HFLAG_OFF_BOARD, \ | ||
511 | .pio_mask = ATA_PIO4, \ | ||
512 | .mwdma_mask = ATA_MWDMA2, \ | ||
513 | .udma_mask = udma, \ | ||
514 | } | ||
515 | |||
516 | static ide_pci_device_t pdcnew_chipsets[] __devinitdata = { | ||
517 | /* 0 */ DECLARE_PDCNEW_DEV("PDC20268", ATA_UDMA5), | ||
518 | /* 1 */ DECLARE_PDCNEW_DEV("PDC20269", ATA_UDMA6), | ||
519 | /* 2 */ DECLARE_PDCNEW_DEV("PDC20270", ATA_UDMA5), | ||
520 | /* 3 */ DECLARE_PDCNEW_DEV("PDC20271", ATA_UDMA6), | ||
521 | /* 4 */ DECLARE_PDCNEW_DEV("PDC20275", ATA_UDMA6), | ||
522 | /* 5 */ DECLARE_PDCNEW_DEV("PDC20276", ATA_UDMA6), | ||
523 | /* 6 */ DECLARE_PDCNEW_DEV("PDC20277", ATA_UDMA6), | ||
524 | }; | ||
525 | |||
526 | /** | ||
527 | * pdc202new_init_one - called when a pdc202xx is found | ||
528 | * @dev: the pdc202new device | ||
529 | * @id: the matching pci id | ||
530 | * | ||
531 | * Called when the PCI registration layer (or the IDE initialization) | ||
532 | * finds a device matching our IDE device tables. | ||
533 | */ | ||
534 | |||
535 | static int __devinit pdc202new_init_one(struct pci_dev *dev, const struct pci_device_id *id) | ||
500 | { | 536 | { |
537 | ide_pci_device_t *d; | ||
501 | struct pci_dev *bridge = dev->bus->self; | 538 | struct pci_dev *bridge = dev->bus->self; |
539 | u8 idx = id->driver_data; | ||
540 | |||
541 | d = &pdcnew_chipsets[idx]; | ||
502 | 542 | ||
503 | if (bridge != NULL && | 543 | if (idx == 2 && bridge && |
504 | bridge->vendor == PCI_VENDOR_ID_DEC && | 544 | bridge->vendor == PCI_VENDOR_ID_DEC && |
505 | bridge->device == PCI_DEVICE_ID_DEC_21150) { | 545 | bridge->device == PCI_DEVICE_ID_DEC_21150) { |
506 | struct pci_dev *dev2; | 546 | struct pci_dev *dev2; |
@@ -508,133 +548,26 @@ static int __devinit init_setup_pdc20270(struct pci_dev *dev, ide_pci_device_t * | |||
508 | if (PCI_SLOT(dev->devfn) & 2) | 548 | if (PCI_SLOT(dev->devfn) & 2) |
509 | return -ENODEV; | 549 | return -ENODEV; |
510 | 550 | ||
511 | dev2 = pci_get_slot(dev->bus, PCI_DEVFN(PCI_SLOT(dev->devfn) + 2, | 551 | dev2 = pdc20270_get_dev2(dev); |
512 | PCI_FUNC(dev->devfn))); | ||
513 | if (dev2 != NULL && | ||
514 | dev2->vendor == dev->vendor && | ||
515 | dev2->device == dev->device) { | ||
516 | int ret; | ||
517 | |||
518 | if (dev2->irq != dev->irq) { | ||
519 | dev2->irq = dev->irq; | ||
520 | 552 | ||
521 | printk(KERN_WARNING "%s: PCI config space " | 553 | if (dev2) { |
522 | "interrupt fixed.\n", d->name); | 554 | int ret = ide_setup_pci_devices(dev, dev2, d); |
523 | } | ||
524 | |||
525 | ret = ide_setup_pci_devices(dev, dev2, d); | ||
526 | if (ret < 0) | 555 | if (ret < 0) |
527 | pci_dev_put(dev2); | 556 | pci_dev_put(dev2); |
528 | return ret; | 557 | return ret; |
529 | } | 558 | } |
530 | } | 559 | } |
531 | return ide_setup_pci_device(dev, d); | ||
532 | } | ||
533 | 560 | ||
534 | static int __devinit init_setup_pdc20276(struct pci_dev *dev, ide_pci_device_t *d) | 561 | if (idx == 5 && bridge && |
535 | { | ||
536 | struct pci_dev *bridge = dev->bus->self; | ||
537 | |||
538 | if (bridge != NULL && | ||
539 | bridge->vendor == PCI_VENDOR_ID_INTEL && | 562 | bridge->vendor == PCI_VENDOR_ID_INTEL && |
540 | (bridge->device == PCI_DEVICE_ID_INTEL_I960 || | 563 | (bridge->device == PCI_DEVICE_ID_INTEL_I960 || |
541 | bridge->device == PCI_DEVICE_ID_INTEL_I960RM)) { | 564 | bridge->device == PCI_DEVICE_ID_INTEL_I960RM)) { |
542 | 565 | printk(KERN_INFO "PDC20276: attached to I2O RAID controller, " | |
543 | printk(KERN_INFO "%s: attached to I2O RAID controller, " | 566 | "skipping\n"); |
544 | "skipping.\n", d->name); | ||
545 | return -ENODEV; | 567 | return -ENODEV; |
546 | } | 568 | } |
547 | return ide_setup_pci_device(dev, d); | ||
548 | } | ||
549 | |||
550 | static ide_pci_device_t pdcnew_chipsets[] __devinitdata = { | ||
551 | { /* 0 */ | ||
552 | .name = "PDC20268", | ||
553 | .init_setup = init_setup_pdcnew, | ||
554 | .init_chipset = init_chipset_pdcnew, | ||
555 | .init_hwif = init_hwif_pdc202new, | ||
556 | .autodma = AUTODMA, | ||
557 | .bootable = OFF_BOARD, | ||
558 | .pio_mask = ATA_PIO4, | ||
559 | .udma_mask = 0x3f, /* udma0-5 */ | ||
560 | .host_flags = IDE_HFLAG_POST_SET_MODE, | ||
561 | },{ /* 1 */ | ||
562 | .name = "PDC20269", | ||
563 | .init_setup = init_setup_pdcnew, | ||
564 | .init_chipset = init_chipset_pdcnew, | ||
565 | .init_hwif = init_hwif_pdc202new, | ||
566 | .autodma = AUTODMA, | ||
567 | .bootable = OFF_BOARD, | ||
568 | .pio_mask = ATA_PIO4, | ||
569 | .udma_mask = 0x7f, /* udma0-6*/ | ||
570 | .host_flags = IDE_HFLAG_POST_SET_MODE, | ||
571 | },{ /* 2 */ | ||
572 | .name = "PDC20270", | ||
573 | .init_setup = init_setup_pdc20270, | ||
574 | .init_chipset = init_chipset_pdcnew, | ||
575 | .init_hwif = init_hwif_pdc202new, | ||
576 | .autodma = AUTODMA, | ||
577 | .bootable = OFF_BOARD, | ||
578 | .pio_mask = ATA_PIO4, | ||
579 | .udma_mask = 0x3f, /* udma0-5 */ | ||
580 | .host_flags = IDE_HFLAG_POST_SET_MODE, | ||
581 | },{ /* 3 */ | ||
582 | .name = "PDC20271", | ||
583 | .init_setup = init_setup_pdcnew, | ||
584 | .init_chipset = init_chipset_pdcnew, | ||
585 | .init_hwif = init_hwif_pdc202new, | ||
586 | .autodma = AUTODMA, | ||
587 | .bootable = OFF_BOARD, | ||
588 | .pio_mask = ATA_PIO4, | ||
589 | .udma_mask = 0x7f, /* udma0-6*/ | ||
590 | .host_flags = IDE_HFLAG_POST_SET_MODE, | ||
591 | },{ /* 4 */ | ||
592 | .name = "PDC20275", | ||
593 | .init_setup = init_setup_pdcnew, | ||
594 | .init_chipset = init_chipset_pdcnew, | ||
595 | .init_hwif = init_hwif_pdc202new, | ||
596 | .autodma = AUTODMA, | ||
597 | .bootable = OFF_BOARD, | ||
598 | .pio_mask = ATA_PIO4, | ||
599 | .udma_mask = 0x7f, /* udma0-6*/ | ||
600 | .host_flags = IDE_HFLAG_POST_SET_MODE, | ||
601 | },{ /* 5 */ | ||
602 | .name = "PDC20276", | ||
603 | .init_setup = init_setup_pdc20276, | ||
604 | .init_chipset = init_chipset_pdcnew, | ||
605 | .init_hwif = init_hwif_pdc202new, | ||
606 | .autodma = AUTODMA, | ||
607 | .bootable = OFF_BOARD, | ||
608 | .pio_mask = ATA_PIO4, | ||
609 | .udma_mask = 0x7f, /* udma0-6*/ | ||
610 | .host_flags = IDE_HFLAG_POST_SET_MODE, | ||
611 | },{ /* 6 */ | ||
612 | .name = "PDC20277", | ||
613 | .init_setup = init_setup_pdcnew, | ||
614 | .init_chipset = init_chipset_pdcnew, | ||
615 | .init_hwif = init_hwif_pdc202new, | ||
616 | .autodma = AUTODMA, | ||
617 | .bootable = OFF_BOARD, | ||
618 | .pio_mask = ATA_PIO4, | ||
619 | .udma_mask = 0x7f, /* udma0-6*/ | ||
620 | .host_flags = IDE_HFLAG_POST_SET_MODE, | ||
621 | } | ||
622 | }; | ||
623 | 569 | ||
624 | /** | 570 | return ide_setup_pci_device(dev, d); |
625 | * pdc202new_init_one - called when a pdc202xx is found | ||
626 | * @dev: the pdc202new device | ||
627 | * @id: the matching pci id | ||
628 | * | ||
629 | * Called when the PCI registration layer (or the IDE initialization) | ||
630 | * finds a device matching our IDE device tables. | ||
631 | */ | ||
632 | |||
633 | static int __devinit pdc202new_init_one(struct pci_dev *dev, const struct pci_device_id *id) | ||
634 | { | ||
635 | ide_pci_device_t *d = &pdcnew_chipsets[id->driver_data]; | ||
636 | |||
637 | return d->init_setup(dev, d); | ||
638 | } | 571 | } |
639 | 572 | ||
640 | static const struct pci_device_id pdc202new_pci_tbl[] = { | 573 | static const struct pci_device_id pdc202new_pci_tbl[] = { |