|
@@ -215,16 +215,23 @@ static int intel_mid_pci_irq_enable(struct pci_dev *dev)
|
|
|
struct irq_alloc_info info;
|
|
|
int polarity;
|
|
|
int ret;
|
|
|
+ u8 gsi;
|
|
|
|
|
|
if (dev->irq_managed && dev->irq > 0)
|
|
|
return 0;
|
|
|
|
|
|
+ ret = pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &gsi);
|
|
|
+ if (ret < 0) {
|
|
|
+ dev_warn(&dev->dev, "Failed to read interrupt line: %d\n", ret);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
switch (intel_mid_identify_cpu()) {
|
|
|
case INTEL_MID_CPU_CHIP_TANGIER:
|
|
|
polarity = IOAPIC_POL_HIGH;
|
|
|
|
|
|
/* Special treatment for IRQ0 */
|
|
|
- if (dev->irq == 0) {
|
|
|
+ if (gsi == 0) {
|
|
|
/*
|
|
|
* Skip HS UART common registers device since it has
|
|
|
* IRQ0 assigned and not used by the kernel.
|
|
@@ -253,10 +260,11 @@ static int intel_mid_pci_irq_enable(struct pci_dev *dev)
|
|
|
* MRST only have IOAPIC, the PCI irq lines are 1:1 mapped to
|
|
|
* IOAPIC RTE entries, so we just enable RTE for the device.
|
|
|
*/
|
|
|
- ret = mp_map_gsi_to_irq(dev->irq, IOAPIC_MAP_ALLOC, &info);
|
|
|
+ ret = mp_map_gsi_to_irq(gsi, IOAPIC_MAP_ALLOC, &info);
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
|
|
|
|
+ dev->irq = ret;
|
|
|
dev->irq_managed = 1;
|
|
|
|
|
|
return 0;
|