@@ -2236,10 +2236,30 @@ static void arm_smmu_setup_msis(struct arm_smmu_device *smmu)
2236
2236
devm_add_action (dev , arm_smmu_free_msis , dev );
2237
2237
}
2238
2238
2239
+ static int get_irq_flags (struct arm_smmu_device * smmu , int irq )
2240
+ {
2241
+ int match_count = 0 ;
2242
+
2243
+ if (irq == smmu -> evtq .q .irq )
2244
+ match_count ++ ;
2245
+ if (irq == smmu -> cmdq .q .irq )
2246
+ match_count ++ ;
2247
+ if (irq == smmu -> gerr_irq )
2248
+ match_count ++ ;
2249
+ if (irq == smmu -> priq .q .irq )
2250
+ match_count ++ ;
2251
+
2252
+ if (match_count > 1 )
2253
+ return IRQF_SHARED | IRQF_ONESHOT ;
2254
+
2255
+ return 0 ;
2256
+ }
2257
+
2239
2258
static int arm_smmu_setup_irqs (struct arm_smmu_device * smmu )
2240
2259
{
2241
2260
int ret , irq ;
2242
2261
u32 irqen_flags = IRQ_CTRL_EVTQ_IRQEN | IRQ_CTRL_GERROR_IRQEN ;
2262
+ u32 irqflags = 0 ;
2243
2263
2244
2264
/* Disable IRQs first */
2245
2265
ret = arm_smmu_write_reg_sync (smmu , 0 , ARM_SMMU_IRQ_CTRL ,
@@ -2254,37 +2274,41 @@ static int arm_smmu_setup_irqs(struct arm_smmu_device *smmu)
2254
2274
/* Request interrupt lines */
2255
2275
irq = smmu -> evtq .q .irq ;
2256
2276
if (irq ) {
2277
+ irqflags = get_irq_flags (smmu , irq );
2257
2278
ret = devm_request_threaded_irq (smmu -> dev , irq , NULL ,
2258
2279
arm_smmu_evtq_thread ,
2259
- IRQF_ONESHOT ,
2280
+ IRQF_ONESHOT | irqflags ,
2260
2281
"arm-smmu-v3-evtq" , smmu );
2261
2282
if (ret < 0 )
2262
2283
dev_warn (smmu -> dev , "failed to enable evtq irq\n" );
2263
2284
}
2264
2285
2265
2286
irq = smmu -> cmdq .q .irq ;
2266
2287
if (irq ) {
2288
+ irqflags = get_irq_flags (smmu , irq );
2267
2289
ret = devm_request_irq (smmu -> dev , irq ,
2268
- arm_smmu_cmdq_sync_handler , 0 ,
2290
+ arm_smmu_cmdq_sync_handler , irqflags ,
2269
2291
"arm-smmu-v3-cmdq-sync" , smmu );
2270
2292
if (ret < 0 )
2271
2293
dev_warn (smmu -> dev , "failed to enable cmdq-sync irq\n" );
2272
2294
}
2273
2295
2274
2296
irq = smmu -> gerr_irq ;
2275
2297
if (irq ) {
2298
+ irqflags = get_irq_flags (smmu , irq );
2276
2299
ret = devm_request_irq (smmu -> dev , irq , arm_smmu_gerror_handler ,
2277
- 0 , "arm-smmu-v3-gerror" , smmu );
2300
+ irqflags , "arm-smmu-v3-gerror" , smmu );
2278
2301
if (ret < 0 )
2279
2302
dev_warn (smmu -> dev , "failed to enable gerror irq\n" );
2280
2303
}
2281
2304
2282
2305
if (smmu -> features & ARM_SMMU_FEAT_PRI ) {
2283
2306
irq = smmu -> priq .q .irq ;
2284
2307
if (irq ) {
2308
+ irqflags = get_irq_flags (smmu , irq );
2285
2309
ret = devm_request_threaded_irq (smmu -> dev , irq , NULL ,
2286
2310
arm_smmu_priq_thread ,
2287
- IRQF_ONESHOT ,
2311
+ IRQF_ONESHOT | irqflags ,
2288
2312
"arm-smmu-v3-priq" ,
2289
2313
smmu );
2290
2314
if (ret < 0 )
0 commit comments