/* Get basic io resource and map it */
        dws->paddr = pci_resource_start(pdev, pci_bar);
+       pci_set_master(pdev);
 
        ret = pcim_iomap_regions(pdev, 1 << pci_bar, pci_name(pdev));
        if (ret)
                return ret;
 
+       ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES);
+       if (ret < 0)
+               return ret;
+
        dws->regs = pcim_iomap_table(pdev)[pci_bar];
-       dws->irq = pdev->irq;
+       dws->irq = pci_irq_vector(pdev, 0);
 
        /*
         * Specific handling for platforms, like dma setup,
                                return ret;
                }
        } else {
+               pci_free_irq_vectors(pdev);
                return -ENODEV;
        }
 
        ret = dw_spi_add_host(&pdev->dev, dws);
-       if (ret)
+       if (ret) {
+               pci_free_irq_vectors(pdev);
                return ret;
+       }
 
        /* PCI hook and SPI hook use the same drv data */
        pci_set_drvdata(pdev, dws);
        struct dw_spi *dws = pci_get_drvdata(pdev);
 
        dw_spi_remove_host(dws);
+       pci_free_irq_vectors(pdev);
 }
 
 #ifdef CONFIG_PM_SLEEP