diff options
Diffstat (limited to 'arch/powerpc/platforms/powermac/pci.c')
| -rw-r--r-- | arch/powerpc/platforms/powermac/pci.c | 42 | 
1 files changed, 26 insertions, 16 deletions
diff --git a/arch/powerpc/platforms/powermac/pci.c b/arch/powerpc/platforms/powermac/pci.c index 3bc075c788e..cf7009b8c7b 100644 --- a/arch/powerpc/platforms/powermac/pci.c +++ b/arch/powerpc/platforms/powermac/pci.c @@ -17,6 +17,7 @@  #include <linux/init.h>  #include <linux/bootmem.h>  #include <linux/irq.h> +#include <linux/of_pci.h>  #include <asm/sections.h>  #include <asm/io.h> @@ -235,7 +236,7 @@ static int chaos_validate_dev(struct pci_bus *bus, int devfn, int offset)  	if (offset >= 0x100)  		return  PCIBIOS_BAD_REGISTER_NUMBER; -	np = pci_busdev_to_OF_node(bus, devfn); +	np = of_pci_find_child_device(bus->dev.of_node, devfn);  	if (np == NULL)  		return PCIBIOS_DEVICE_NOT_FOUND; @@ -299,7 +300,7 @@ static void __init setup_chaos(struct pci_controller *hose,   * This function deals with some "special cases" devices.   *   *  0 -> No special case - *  1 -> Skip the device but act as if the access was successfull + *  1 -> Skip the device but act as if the access was successful   *       (return 0xff's on reads, eventually, cache config space   *       accesses in a later version)   * -1 -> Hide the device (unsuccessful access) @@ -560,6 +561,20 @@ static struct pci_ops u4_pcie_pci_ops =  	.write = u4_pcie_write_config,  }; +static void pmac_pci_fixup_u4_of_node(struct pci_dev *dev) +{ +	/* Apple's device-tree "hides" the root complex virtual P2P bridge +	 * on U4. However, Linux sees it, causing the PCI <-> OF matching +	 * code to fail to properly match devices below it. This works around +	 * it by setting the node of the bridge to point to the PHB node, +	 * which is not entirely correct but fixes the matching code and +	 * doesn't break anything else. It's also the simplest possible fix. +	 */ +	if (dev->dev.of_node == NULL) +		dev->dev.of_node = pcibios_get_phb_of_node(dev->bus); +} +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_APPLE, 0x5b, pmac_pci_fixup_u4_of_node); +  #endif /* CONFIG_PPC64 */  #ifdef CONFIG_PPC32 @@ -731,7 +746,7 @@ static void __init setup_bandit(struct pci_controller *hose,  static int __init setup_uninorth(struct pci_controller *hose,  				 struct resource *addr)  { -	ppc_pci_add_flags(PPC_PCI_REASSIGN_ALL_BUS); +	pci_add_flags(PCI_REASSIGN_ALL_BUS);  	has_uninorth = 1;  	hose->ops = ¯isc_pci_ops;  	hose->cfg_addr = ioremap(addr->start + 0x800000, 0x1000); @@ -809,6 +824,7 @@ static void __init parse_region_decode(struct pci_controller *hose,  			hose->mem_resources[cur].name = hose->dn->full_name;  			hose->mem_resources[cur].start = base;  			hose->mem_resources[cur].end = end; +			hose->mem_offset[cur] = 0;  			DBG("  %d: 0x%08lx-0x%08lx\n", cur, base, end);  		} else {  			DBG("   :           -0x%08lx\n", end); @@ -838,8 +854,7 @@ static void __init setup_u3_ht(struct pci_controller* hose)  	 * into cfg_addr  	 */  	hose->cfg_data = ioremap(cfg_res.start, 0x02000000); -	hose->cfg_addr = ioremap(self_res.start, -				 self_res.end - self_res.start + 1); +	hose->cfg_addr = ioremap(self_res.start, resource_size(&self_res));  	/*  	 * /ht node doesn't expose a "ranges" property, we read the register @@ -852,7 +867,6 @@ static void __init setup_u3_ht(struct pci_controller* hose)  	hose->io_resource.start = 0;  	hose->io_resource.end = 0x003fffff;  	hose->io_resource.flags = IORESOURCE_IO; -	hose->pci_mem_offset = 0;  	hose->first_busno = 0;  	hose->last_busno = 0xef; @@ -974,7 +988,7 @@ static int __init pmac_add_bridge(struct device_node *dev)  	return 0;  } -void __devinit pmac_pci_irq_fixup(struct pci_dev *dev) +void pmac_pci_irq_fixup(struct pci_dev *dev)  {  #ifdef CONFIG_PPC32  	/* Fixup interrupt for the modem/ethernet combo controller. @@ -988,7 +1002,7 @@ void __devinit pmac_pci_irq_fixup(struct pci_dev *dev)  	    dev->vendor == PCI_VENDOR_ID_DEC &&  	    dev->device == PCI_DEVICE_ID_DEC_TULIP_PLUS) {  		dev->irq = irq_create_mapping(NULL, 60); -		set_irq_type(dev->irq, IRQ_TYPE_LEVEL_LOW); +		irq_set_irq_type(dev->irq, IRQ_TYPE_LEVEL_LOW);  	}  #endif /* CONFIG_PPC32 */  } @@ -998,7 +1012,7 @@ void __init pmac_pci_init(void)  	struct device_node *np, *root;  	struct device_node *ht = NULL; -	ppc_pci_set_flags(PPC_PCI_CAN_SKIP_ISA_ALIGN); +	pci_set_flags(PCI_CAN_SKIP_ISA_ALIGN);  	root = of_find_node_by_path("/");  	if (root == NULL) { @@ -1045,9 +1059,6 @@ void __init pmac_pci_init(void)  	}  	/* pmac_check_ht_link(); */ -	/* We can allocate missing resources if any */ -	pci_probe_only = 0; -  #else /* CONFIG_PPC64 */  	init_p2pbridge();  	init_second_ohare(); @@ -1057,7 +1068,7 @@ void __init pmac_pci_init(void)  	 * some offset between bus number and domains for now when we  	 * assign all busses should help for now  	 */ -	if (ppc_pci_has_flag(PPC_PCI_REASSIGN_ALL_BUS)) +	if (pci_has_flag(PCI_REASSIGN_ALL_BUS))  		pcibios_assign_bus_offset = 0x10;  #endif  } @@ -1127,7 +1138,7 @@ int pmac_pci_enable_device_hook(struct pci_dev *dev)  	return 0;  } -void __devinit pmac_pci_fixup_ohci(struct pci_dev *dev) +void pmac_pci_fixup_ohci(struct pci_dev *dev)  {  	struct device_node *node = pci_device_to_OF_node(dev); @@ -1323,8 +1334,7 @@ static void fixup_u4_pcie(struct pci_dev* dev)  		 */  		if (r->start >= 0xf0000000 && r->start < 0xf3000000)  			continue; -		if (!region || (r->end - r->start) > -		    (region->end - region->start)) +		if (!region || resource_size(r) > resource_size(region))  			region = r;  	}  	/* Nothing found, bail */  | 
