@@ -215,7 +215,7 @@ v3d_hub_irq(int irq, void *arg)
215
215
int
216
216
v3d_irq_init (struct v3d_dev * v3d )
217
217
{
218
- int irq1 , ret , core ;
218
+ int irq , ret , core ;
219
219
220
220
INIT_WORK (& v3d -> overflow_mem_work , v3d_overflow_mem_work );
221
221
@@ -226,26 +226,37 @@ v3d_irq_init(struct v3d_dev *v3d)
226
226
V3D_CORE_WRITE (core , V3D_CTL_INT_CLR , V3D_CORE_IRQS );
227
227
V3D_WRITE (V3D_HUB_INT_CLR , V3D_HUB_IRQS );
228
228
229
- irq1 = platform_get_irq_optional (v3d_to_pdev (v3d ), 1 );
230
- if (irq1 == - EPROBE_DEFER )
231
- return irq1 ;
232
- if (irq1 > 0 ) {
233
- ret = devm_request_irq (v3d -> drm .dev , irq1 ,
229
+ irq = platform_get_irq_optional (v3d_to_pdev (v3d ), 1 );
230
+ if (irq == - EPROBE_DEFER )
231
+ return irq ;
232
+ if (irq > 0 ) {
233
+ v3d -> irq [V3D_CORE_IRQ ] = irq ;
234
+
235
+ ret = devm_request_irq (v3d -> drm .dev , v3d -> irq [V3D_CORE_IRQ ],
234
236
v3d_irq , IRQF_SHARED ,
235
237
"v3d_core0" , v3d );
236
238
if (ret )
237
239
goto fail ;
238
- ret = devm_request_irq (v3d -> drm .dev ,
239
- platform_get_irq (v3d_to_pdev (v3d ), 0 ),
240
+
241
+ irq = platform_get_irq (v3d_to_pdev (v3d ), 0 );
242
+ if (irq < 0 )
243
+ return irq ;
244
+ v3d -> irq [V3D_HUB_IRQ ] = irq ;
245
+
246
+ ret = devm_request_irq (v3d -> drm .dev , v3d -> irq [V3D_HUB_IRQ ],
240
247
v3d_hub_irq , IRQF_SHARED ,
241
248
"v3d_hub" , v3d );
242
249
if (ret )
243
250
goto fail ;
244
251
} else {
245
252
v3d -> single_irq_line = true;
246
253
247
- ret = devm_request_irq (v3d -> drm .dev ,
248
- platform_get_irq (v3d_to_pdev (v3d ), 0 ),
254
+ irq = platform_get_irq (v3d_to_pdev (v3d ), 0 );
255
+ if (irq < 0 )
256
+ return irq ;
257
+ v3d -> irq [V3D_CORE_IRQ ] = irq ;
258
+
259
+ ret = devm_request_irq (v3d -> drm .dev , v3d -> irq [V3D_CORE_IRQ ],
249
260
v3d_irq , IRQF_SHARED ,
250
261
"v3d" , v3d );
251
262
if (ret )
@@ -286,6 +297,12 @@ v3d_irq_disable(struct v3d_dev *v3d)
286
297
V3D_CORE_WRITE (core , V3D_CTL_INT_MSK_SET , ~0 );
287
298
V3D_WRITE (V3D_HUB_INT_MSK_SET , ~0 );
288
299
300
+ /* Finish any interrupt handler still in flight. */
301
+ for (int i = 0 ; i < V3D_MAX_IRQS ; i ++ ) {
302
+ if (v3d -> irq [i ])
303
+ synchronize_irq (v3d -> irq [i ]);
304
+ }
305
+
289
306
/* Clear any pending interrupts we might have left. */
290
307
for (core = 0 ; core < v3d -> cores ; core ++ )
291
308
V3D_CORE_WRITE (core , V3D_CTL_INT_CLR , V3D_CORE_IRQS );
0 commit comments