@@ -419,6 +419,11 @@ static int rzv2h_icu_parse_interrupts(struct rzv2h_icu_priv *priv, struct device
419
419
return 0 ;
420
420
}
421
421
422
+ static void rzv2h_icu_put_device (void * data )
423
+ {
424
+ put_device (data );
425
+ }
426
+
422
427
static int rzv2h_icu_init (struct device_node * node , struct device_node * parent )
423
428
{
424
429
struct irq_domain * irq_domain , * parent_domain ;
@@ -431,41 +436,39 @@ static int rzv2h_icu_init(struct device_node *node, struct device_node *parent)
431
436
if (!pdev )
432
437
return - ENODEV ;
433
438
439
+ ret = devm_add_action_or_reset (& pdev -> dev , rzv2h_icu_put_device ,
440
+ & pdev -> dev );
441
+ if (ret < 0 )
442
+ return ret ;
443
+
434
444
parent_domain = irq_find_host (parent );
435
445
if (!parent_domain ) {
436
446
dev_err (& pdev -> dev , "cannot find parent domain\n" );
437
- ret = - ENODEV ;
438
- goto put_dev ;
447
+ return - ENODEV ;
439
448
}
440
449
441
450
rzv2h_icu_data = devm_kzalloc (& pdev -> dev , sizeof (* rzv2h_icu_data ), GFP_KERNEL );
442
- if (!rzv2h_icu_data ) {
443
- ret = - ENOMEM ;
444
- goto put_dev ;
445
- }
451
+ if (!rzv2h_icu_data )
452
+ return - ENOMEM ;
446
453
447
454
rzv2h_icu_data -> base = devm_of_iomap (& pdev -> dev , pdev -> dev .of_node , 0 , NULL );
448
- if (IS_ERR (rzv2h_icu_data -> base )) {
449
- ret = PTR_ERR (rzv2h_icu_data -> base );
450
- goto put_dev ;
451
- }
455
+ if (IS_ERR (rzv2h_icu_data -> base ))
456
+ return PTR_ERR (rzv2h_icu_data -> base );
452
457
453
458
ret = rzv2h_icu_parse_interrupts (rzv2h_icu_data , node );
454
459
if (ret ) {
455
460
dev_err (& pdev -> dev , "cannot parse interrupts: %d\n" , ret );
456
- goto put_dev ;
461
+ return ret ;
457
462
}
458
463
459
464
resetn = devm_reset_control_get_exclusive (& pdev -> dev , NULL );
460
- if (IS_ERR (resetn )) {
461
- ret = PTR_ERR (resetn );
462
- goto put_dev ;
463
- }
465
+ if (IS_ERR (resetn ))
466
+ return PTR_ERR (resetn );
464
467
465
468
ret = reset_control_deassert (resetn );
466
469
if (ret ) {
467
470
dev_err (& pdev -> dev , "failed to deassert resetn pin, %d\n" , ret );
468
- goto put_dev ;
471
+ return ret ;
469
472
}
470
473
471
474
pm_runtime_enable (& pdev -> dev );
@@ -496,8 +499,6 @@ static int rzv2h_icu_init(struct device_node *node, struct device_node *parent)
496
499
pm_disable :
497
500
pm_runtime_disable (& pdev -> dev );
498
501
reset_control_assert (resetn );
499
- put_dev :
500
- put_device (& pdev -> dev );
501
502
502
503
return ret ;
503
504
}
0 commit comments