Merge branch 'linux-4.15' of git://github.com/skeggsb/linux into drm-fixes

Single irq regression fix
* 'linux-4.15' of git://github.com/skeggsb/linux:
drm/nouveau: Move irq setup/teardown to pci ctor/dtor

Changed files
+31 -15
drivers
gpu
drm
nouveau
nvkm
subdev
pci
+31 -15
drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c
··· 71 71 struct nvkm_pci *pci = arg; 72 72 struct nvkm_device *device = pci->subdev.device; 73 73 bool handled = false; 74 + 75 + if (pci->irq < 0) 76 + return IRQ_HANDLED; 77 + 74 78 nvkm_mc_intr_unarm(device); 75 79 if (pci->msi) 76 80 pci->func->msi_rearm(pci); ··· 87 83 nvkm_pci_fini(struct nvkm_subdev *subdev, bool suspend) 88 84 { 89 85 struct nvkm_pci *pci = nvkm_pci(subdev); 90 - 91 - if (pci->irq >= 0) { 92 - free_irq(pci->irq, pci); 93 - pci->irq = -1; 94 - } 95 86 96 87 if (pci->agp.bridge) 97 88 nvkm_agp_fini(pci); ··· 107 108 nvkm_pci_oneinit(struct nvkm_subdev *subdev) 108 109 { 109 110 struct nvkm_pci *pci = nvkm_pci(subdev); 110 - if (pci_is_pcie(pci->pdev)) 111 - return nvkm_pcie_oneinit(pci); 111 + struct pci_dev *pdev = pci->pdev; 112 + int ret; 113 + 114 + if (pci_is_pcie(pci->pdev)) { 115 + ret = nvkm_pcie_oneinit(pci); 116 + if (ret) 117 + return ret; 118 + } 119 + 120 + ret = request_irq(pdev->irq, nvkm_pci_intr, IRQF_SHARED, "nvkm", pci); 121 + if (ret) 122 + return ret; 123 + 124 + pci->irq = pdev->irq; 112 125 return 0; 113 126 } 114 127 ··· 128 117 nvkm_pci_init(struct nvkm_subdev *subdev) 129 118 { 130 119 struct nvkm_pci *pci = nvkm_pci(subdev); 131 - struct pci_dev *pdev = pci->pdev; 132 120 int ret; 133 121 134 122 if (pci->agp.bridge) { ··· 141 131 if (pci->func->init) 142 132 pci->func->init(pci); 143 133 144 - ret = request_irq(pdev->irq, nvkm_pci_intr, IRQF_SHARED, "nvkm", pci); 145 - if (ret) 146 - return ret; 147 - 148 - pci->irq = pdev->irq; 149 - 150 134 /* Ensure MSI interrupts are armed, for the case where there are 151 135 * already interrupts pending (for whatever reason) at load time. 152 136 */ 153 137 if (pci->msi) 154 138 pci->func->msi_rearm(pci); 155 139 156 - return ret; 140 + return 0; 157 141 } 158 142 159 143 static void * 160 144 nvkm_pci_dtor(struct nvkm_subdev *subdev) 161 145 { 162 146 struct nvkm_pci *pci = nvkm_pci(subdev); 147 + 163 148 nvkm_agp_dtor(pci); 149 + 150 + if (pci->irq >= 0) { 151 + /* freq_irq() will call the handler, we use pci->irq == -1 152 + * to signal that it's been torn down and should be a noop. 153 + */ 154 + int irq = pci->irq; 155 + pci->irq = -1; 156 + free_irq(irq, pci); 157 + } 158 + 164 159 if (pci->msi) 165 160 pci_disable_msi(pci->pdev); 161 + 166 162 return nvkm_pci(subdev); 167 163 } 168 164