Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5697b7ca authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by Len Brown
Browse files

ACPI: PCI: combine lookup and derive



This folds acpi_pci_irq_derive() into acpi_pci_irq_lookup() so it
can be easily used by both acpi_pci_irq_enable() and acpi_pci_irq_disable().

Signed-off-by: default avatarBjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent ee401363
Loading
Loading
Loading
Loading
+11 −44
Original line number Diff line number Diff line
@@ -382,6 +382,8 @@ static struct acpi_prt_entry *
acpi_pci_irq_lookup(struct pci_dev *dev, int pin)
{
	struct acpi_prt_entry *entry;
	struct pci_dev *bridge;
	u8 bridge_pin, orig_pin = pin;

	entry = acpi_pci_irq_find_prt_entry(dev, pin);
	if (entry) {
@@ -390,19 +392,6 @@ acpi_pci_irq_lookup(struct pci_dev *dev, int pin)
		return entry;
	}

	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No %s[%c] _PRT entry\n",
			  pci_name(dev), pin_name(pin)));
	return NULL;
}

static struct acpi_prt_entry *
acpi_pci_irq_derive(struct pci_dev *dev, int pin)
{
	struct acpi_prt_entry *entry = NULL;
	struct pci_dev *bridge;
	u8 bridge_pin = 0, orig_pin = pin;


	/* 
	 * Attempt to derive an IRQ for this device from a parent bridge's
	 * PCI interrupt routing entry (eg. yenta bridge and add-in card bridge).
@@ -423,7 +412,7 @@ acpi_pci_irq_derive(struct pci_dev *dev, int pin)
			pin = bridge_pin;
		}

		entry = acpi_pci_irq_lookup(bridge, pin);
		entry = acpi_pci_irq_find_prt_entry(bridge, pin);
		if (entry) {
			ACPI_DEBUG_PRINT((ACPI_DB_INFO,
					 "Derived GSI for %s INT %c from %s\n",
@@ -467,18 +456,16 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
		return 0;
	}

	/* 
	 * First we check the PCI IRQ routing table (PRT) for an IRQ.  PRT
	 * values override any BIOS-assigned IRQs set during boot.
	 */
	entry = acpi_pci_irq_lookup(dev, pin);

	if (!entry) {
		/*
	 * If no PRT entry was found, we'll try to derive an IRQ from the
	 * device's parent bridge.
		 * IDE legacy mode controller IRQs are magic. Why do compat
		 * extensions always make such a nasty mess.
		 */
	if (!entry)
		entry = acpi_pci_irq_derive(dev, pin);
		if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE &&
				(dev->class & 0x05) == 0)
			return 0;
	}

	if (entry)
		gsi = acpi_pci_allocate_irq(entry, &triggering, &polarity,
@@ -486,15 +473,6 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
	else
		gsi = -1;

	if (gsi < 0) {
		/*
		 * IDE legacy mode controller IRQs are magic. Why do compat
		 * extensions always make such a nasty mess.
		 */
		if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE &&
				(dev->class & 0x05) == 0)
			return 0;
	}
	/*
	 * No IRQ known to the ACPI subsystem - maybe the BIOS / 
	 * driver reported one, then use it. Exit in any case.
@@ -550,18 +528,7 @@ void acpi_pci_irq_disable(struct pci_dev *dev)
	if (!pin)
		return;

	/*
	 * First we check the PCI IRQ routing table (PRT) for an IRQ.
	 */
	entry = acpi_pci_irq_lookup(dev, pin);

	/*
	 * If no PRT entry was found, we'll try to derive an IRQ from the
	 * device's parent bridge.
	 */
	if (!entry)
		entry = acpi_pci_irq_derive(dev, pin);

	if (!entry)
		return;