@@ -260,7 +260,7 @@ v3d_hub_irq(int irq, void *arg)
260
260
int
261
261
v3d_irq_init (struct v3d_dev * v3d )
262
262
{
263
- int irq1 , ret , core ;
263
+ int irq , ret , core ;
264
264
265
265
INIT_WORK (& v3d -> overflow_mem_work , v3d_overflow_mem_work );
266
266
@@ -271,26 +271,37 @@ v3d_irq_init(struct v3d_dev *v3d)
271
271
V3D_CORE_WRITE (core , V3D_CTL_INT_CLR , V3D_CORE_IRQS (v3d -> ver ));
272
272
V3D_WRITE (V3D_HUB_INT_CLR , V3D_HUB_IRQS (v3d -> ver ));
273
273
274
- irq1 = platform_get_irq_optional (v3d_to_pdev (v3d ), 1 );
275
- if (irq1 == - EPROBE_DEFER )
276
- return irq1 ;
277
- if (irq1 > 0 ) {
278
- ret = devm_request_irq (v3d -> drm .dev , irq1 ,
274
+ irq = platform_get_irq_optional (v3d_to_pdev (v3d ), 1 );
275
+ if (irq == - EPROBE_DEFER )
276
+ return irq ;
277
+ if (irq > 0 ) {
278
+ v3d -> irq [V3D_CORE_IRQ ] = irq ;
279
+
280
+ ret = devm_request_irq (v3d -> drm .dev , v3d -> irq [V3D_CORE_IRQ ],
279
281
v3d_irq , IRQF_SHARED ,
280
282
"v3d_core0" , v3d );
281
283
if (ret )
282
284
goto fail ;
283
- ret = devm_request_irq (v3d -> drm .dev ,
284
- platform_get_irq (v3d_to_pdev (v3d ), 0 ),
285
+
286
+ irq = platform_get_irq (v3d_to_pdev (v3d ), 0 );
287
+ if (irq < 0 )
288
+ return irq ;
289
+ v3d -> irq [V3D_HUB_IRQ ] = irq ;
290
+
291
+ ret = devm_request_irq (v3d -> drm .dev , v3d -> irq [V3D_HUB_IRQ ],
285
292
v3d_hub_irq , IRQF_SHARED ,
286
293
"v3d_hub" , v3d );
287
294
if (ret )
288
295
goto fail ;
289
296
} else {
290
297
v3d -> single_irq_line = true;
291
298
292
- ret = devm_request_irq (v3d -> drm .dev ,
293
- platform_get_irq (v3d_to_pdev (v3d ), 0 ),
299
+ irq = platform_get_irq (v3d_to_pdev (v3d ), 0 );
300
+ if (irq < 0 )
301
+ return irq ;
302
+ v3d -> irq [V3D_CORE_IRQ ] = irq ;
303
+
304
+ ret = devm_request_irq (v3d -> drm .dev , v3d -> irq [V3D_CORE_IRQ ],
294
305
v3d_irq , IRQF_SHARED ,
295
306
"v3d" , v3d );
296
307
if (ret )
@@ -331,6 +342,12 @@ v3d_irq_disable(struct v3d_dev *v3d)
331
342
V3D_CORE_WRITE (core , V3D_CTL_INT_MSK_SET , ~0 );
332
343
V3D_WRITE (V3D_HUB_INT_MSK_SET , ~0 );
333
344
345
+ /* Finish any interrupt handler still in flight. */
346
+ for (int i = 0 ; i < V3D_MAX_IRQS ; i ++ ) {
347
+ if (v3d -> irq [i ])
348
+ synchronize_irq (v3d -> irq [i ]);
349
+ }
350
+
334
351
/* Clear any pending interrupts we might have left. */
335
352
for (core = 0 ; core < v3d -> cores ; core ++ )
336
353
V3D_CORE_WRITE (core , V3D_CTL_INT_CLR , V3D_CORE_IRQS (v3d -> ver ));
0 commit comments