+31
-15
drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c
+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