diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/platforms/85xx/mpc85xx_cds.c | 76 |
1 files changed, 34 insertions, 42 deletions
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_cds.c b/arch/powerpc/platforms/85xx/mpc85xx_cds.c index 2a80c1d0afbc..50c8d6458362 100644 --- a/arch/powerpc/platforms/85xx/mpc85xx_cds.c +++ b/arch/powerpc/platforms/85xx/mpc85xx_cds.c | |||
@@ -69,52 +69,44 @@ static int mpc85xx_exclude_device(struct pci_controller *hose, | |||
69 | return PCIBIOS_SUCCESSFUL; | 69 | return PCIBIOS_SUCCESSFUL; |
70 | } | 70 | } |
71 | 71 | ||
72 | static void __init mpc85xx_cds_pcibios_fixup(void) | 72 | static void __init mpc85xx_cds_pci_irq_fixup(struct pci_dev *dev) |
73 | { | 73 | { |
74 | struct pci_dev *dev; | 74 | u_char c; |
75 | u_char c; | 75 | if (dev->vendor == PCI_VENDOR_ID_VIA) { |
76 | 76 | switch (dev->device) { | |
77 | if ((dev = pci_get_device(PCI_VENDOR_ID_VIA, | 77 | case PCI_DEVICE_ID_VIA_82C586_1: |
78 | PCI_DEVICE_ID_VIA_82C586_1, NULL))) { | 78 | /* |
79 | * U-Boot does not set the enable bits | ||
80 | * for the IDE device. Force them on here. | ||
81 | */ | ||
82 | pci_read_config_byte(dev, 0x40, &c); | ||
83 | c |= 0x03; /* IDE: Chip Enable Bits */ | ||
84 | pci_write_config_byte(dev, 0x40, c); | ||
85 | |||
86 | /* | ||
87 | * Since only primary interface works, force the | ||
88 | * IDE function to standard primary IDE interrupt | ||
89 | * w/ 8259 offset | ||
90 | */ | ||
91 | dev->irq = 14; | ||
92 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq); | ||
93 | break; | ||
79 | /* | 94 | /* |
80 | * U-Boot does not set the enable bits | 95 | * Force legacy USB interrupt routing |
81 | * for the IDE device. Force them on here. | ||
82 | */ | 96 | */ |
83 | pci_read_config_byte(dev, 0x40, &c); | 97 | case PCI_DEVICE_ID_VIA_82C586_2: |
84 | c |= 0x03; /* IDE: Chip Enable Bits */ | 98 | /* There are two USB controllers. |
85 | pci_write_config_byte(dev, 0x40, c); | 99 | * Identify them by functon number |
86 | |||
87 | /* | ||
88 | * Since only primary interface works, force the | ||
89 | * IDE function to standard primary IDE interrupt | ||
90 | * w/ 8259 offset | ||
91 | */ | 100 | */ |
92 | dev->irq = 14; | 101 | if (PCI_FUNC(dev->devfn)) |
93 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq); | 102 | dev->irq = 11; |
94 | pci_dev_put(dev); | 103 | else |
95 | } | 104 | dev->irq = 10; |
96 | 105 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq); | |
97 | /* | 106 | default: |
98 | * Force legacy USB interrupt routing | 107 | break; |
99 | */ | 108 | } |
100 | if ((dev = pci_get_device(PCI_VENDOR_ID_VIA, | ||
101 | PCI_DEVICE_ID_VIA_82C586_2, NULL))) { | ||
102 | dev->irq = 10; | ||
103 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, 10); | ||
104 | pci_dev_put(dev); | ||
105 | } | ||
106 | |||
107 | if ((dev = pci_get_device(PCI_VENDOR_ID_VIA, | ||
108 | PCI_DEVICE_ID_VIA_82C586_2, dev))) { | ||
109 | dev->irq = 11; | ||
110 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, 11); | ||
111 | pci_dev_put(dev); | ||
112 | } | 109 | } |
113 | |||
114 | /* Now map all the PCI irqs */ | ||
115 | dev = NULL; | ||
116 | for_each_pci_dev(dev) | ||
117 | pci_read_irq_line(dev); | ||
118 | } | 110 | } |
119 | 111 | ||
120 | #ifdef CONFIG_PPC_I8259 | 112 | #ifdef CONFIG_PPC_I8259 |
@@ -229,7 +221,7 @@ static void __init mpc85xx_cds_setup_arch(void) | |||
229 | for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;) | 221 | for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;) |
230 | mpc85xx_add_bridge(np); | 222 | mpc85xx_add_bridge(np); |
231 | 223 | ||
232 | ppc_md.pcibios_fixup = mpc85xx_cds_pcibios_fixup; | 224 | ppc_md.pci_irq_fixup = mpc85xx_cds_pci_irq_fixup; |
233 | ppc_md.pci_exclude_device = mpc85xx_exclude_device; | 225 | ppc_md.pci_exclude_device = mpc85xx_exclude_device; |
234 | #endif | 226 | #endif |
235 | } | 227 | } |