@@ -228,7 +228,7 @@ v3d_hub_irq(int irq, void *arg)
228
228
int
229
229
v3d_irq_init (struct v3d_dev * v3d )
230
230
{
231
- int irq1 , ret , core ;
231
+ int irq , ret , core ;
232
232
233
233
INIT_WORK (& v3d -> overflow_mem_work , v3d_overflow_mem_work );
234
234
@@ -239,26 +239,37 @@ v3d_irq_init(struct v3d_dev *v3d)
239
239
V3D_CORE_WRITE (core , V3D_CTL_INT_CLR , V3D_CORE_IRQS (v3d -> ver ));
240
240
V3D_WRITE (V3D_HUB_INT_CLR , V3D_HUB_IRQS (v3d -> ver ));
241
241
242
- irq1 = platform_get_irq_optional (v3d_to_pdev (v3d ), 1 );
243
- if (irq1 == - EPROBE_DEFER )
244
- return irq1 ;
245
- if (irq1 > 0 ) {
246
- ret = devm_request_irq (v3d -> drm .dev , irq1 ,
242
+ irq = platform_get_irq_optional (v3d_to_pdev (v3d ), 1 );
243
+ if (irq == - EPROBE_DEFER )
244
+ return irq ;
245
+ if (irq > 0 ) {
246
+ v3d -> irq [V3D_CORE_IRQ ] = irq ;
247
+
248
+ ret = devm_request_irq (v3d -> drm .dev , v3d -> irq [V3D_CORE_IRQ ],
247
249
v3d_irq , IRQF_SHARED ,
248
250
"v3d_core0" , v3d );
249
251
if (ret )
250
252
goto fail ;
251
- ret = devm_request_irq (v3d -> drm .dev ,
252
- platform_get_irq (v3d_to_pdev (v3d ), 0 ),
253
+
254
+ irq = platform_get_irq (v3d_to_pdev (v3d ), 0 );
255
+ if (irq < 0 )
256
+ return irq ;
257
+ v3d -> irq [V3D_HUB_IRQ ] = irq ;
258
+
259
+ ret = devm_request_irq (v3d -> drm .dev , v3d -> irq [V3D_HUB_IRQ ],
253
260
v3d_hub_irq , IRQF_SHARED ,
254
261
"v3d_hub" , v3d );
255
262
if (ret )
256
263
goto fail ;
257
264
} else {
258
265
v3d -> single_irq_line = true;
259
266
260
- ret = devm_request_irq (v3d -> drm .dev ,
261
- platform_get_irq (v3d_to_pdev (v3d ), 0 ),
267
+ irq = platform_get_irq (v3d_to_pdev (v3d ), 0 );
268
+ if (irq < 0 )
269
+ return irq ;
270
+ v3d -> irq [V3D_CORE_IRQ ] = irq ;
271
+
272
+ ret = devm_request_irq (v3d -> drm .dev , v3d -> irq [V3D_CORE_IRQ ],
262
273
v3d_irq , IRQF_SHARED ,
263
274
"v3d" , v3d );
264
275
if (ret )
@@ -299,6 +310,12 @@ v3d_irq_disable(struct v3d_dev *v3d)
299
310
V3D_CORE_WRITE (core , V3D_CTL_INT_MSK_SET , ~0 );
300
311
V3D_WRITE (V3D_HUB_INT_MSK_SET , ~0 );
301
312
313
+ /* Finish any interrupt handler still in flight. */
314
+ for (int i = 0 ; i < V3D_MAX_IRQS ; i ++ ) {
315
+ if (v3d -> irq [i ])
316
+ synchronize_irq (v3d -> irq [i ]);
317
+ }
318
+
302
319
/* Clear any pending interrupts we might have left. */
303
320
for (core = 0 ; core < v3d -> cores ; core ++ )
304
321
V3D_CORE_WRITE (core , V3D_CTL_INT_CLR , V3D_CORE_IRQS (v3d -> ver ));
0 commit comments