@@ -260,7 +260,7 @@ v3d_hub_irq(int irq, void *arg)
260260int
261261v3d_irq_init (struct v3d_dev * v3d )
262262{
263- int irq1 , ret , core ;
263+ int irq , ret , core ;
264264
265265 INIT_WORK (& v3d -> overflow_mem_work , v3d_overflow_mem_work );
266266
@@ -271,26 +271,37 @@ v3d_irq_init(struct v3d_dev *v3d)
271271 V3D_CORE_WRITE (core , V3D_CTL_INT_CLR , V3D_CORE_IRQS (v3d -> ver ));
272272 V3D_WRITE (V3D_HUB_INT_CLR , V3D_HUB_IRQS (v3d -> ver ));
273273
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 ],
279281 v3d_irq , IRQF_SHARED ,
280282 "v3d_core0" , v3d );
281283 if (ret )
282284 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 ],
285292 v3d_hub_irq , IRQF_SHARED ,
286293 "v3d_hub" , v3d );
287294 if (ret )
288295 goto fail ;
289296 } else {
290297 v3d -> single_irq_line = true;
291298
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 ],
294305 v3d_irq , IRQF_SHARED ,
295306 "v3d" , v3d );
296307 if (ret )
@@ -331,6 +342,12 @@ v3d_irq_disable(struct v3d_dev *v3d)
331342 V3D_CORE_WRITE (core , V3D_CTL_INT_MSK_SET , ~0 );
332343 V3D_WRITE (V3D_HUB_INT_MSK_SET , ~0 );
333344
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+
334351 /* Clear any pending interrupts we might have left. */
335352 for (core = 0 ; core < v3d -> cores ; core ++ )
336353 V3D_CORE_WRITE (core , V3D_CTL_INT_CLR , V3D_CORE_IRQS (v3d -> ver ));
0 commit comments