edac: mv64x60 add pci fixup

Fixup of missing bit 0 on 64360 PCIx_ERR_MASK and errata FEr-#11 and
FEr-#16 for the 64460. Bit 0 must remain 0.

Signed-off-by: Dave Jiang <djiang@mvista.com>
Signed-off-by: Doug Thompson <dougthompson.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Dave Jiang and committed by
Linus Torvalds
fcb19171 596d3941

+35
+35
drivers/edac/mv64x60_edac.c
··· 71 71 return IRQ_HANDLED; 72 72 } 73 73 74 + /* 75 + * Bit 0 of MV64x60_PCIx_ERR_MASK does not exist on the 64360 and because of 76 + * errata FEr-#11 and FEr-##16 for the 64460, it should be 0 on that chip as 77 + * well. IOW, don't set bit 0. 78 + */ 79 + 80 + /* Erratum FEr PCI-#16: clear bit 0 of PCI SERRn Mask reg. */ 81 + static int __init mv64x60_pci_fixup(struct platform_device *pdev) 82 + { 83 + struct resource *r; 84 + void __iomem *pci_serr; 85 + 86 + r = platform_get_resource(pdev, IORESOURCE_MEM, 1); 87 + if (!r) { 88 + printk(KERN_ERR "%s: Unable to get resource for " 89 + "PCI err regs\n", __func__); 90 + return -ENOENT; 91 + } 92 + 93 + pci_serr = ioremap(r->start, r->end - r->start + 1); 94 + if (!pci_serr) 95 + return -ENOMEM; 96 + 97 + out_le32(pci_serr, in_le32(pci_serr) & ~0x1); 98 + iounmap(pci_serr); 99 + 100 + return 0; 101 + } 102 + 74 103 static int __devinit mv64x60_pci_err_probe(struct platform_device *pdev) 75 104 { 76 105 struct edac_pci_ctl_info *pci; ··· 154 125 if (!pdata->pci_vbase) { 155 126 printk(KERN_ERR "%s: Unable to setup PCI err regs\n", __func__); 156 127 res = -ENOMEM; 128 + goto err; 129 + } 130 + 131 + res = mv64x60_pci_fixup(pdev); 132 + if (res < 0) { 133 + printk(KERN_ERR "%s: PCI fixup failed\n", __func__); 157 134 goto err; 158 135 } 159 136