| .. | .. | 
|---|
| 38 | 38 | struct device_node *par_np = of_irq_find_parent(np); | 
|---|
| 39 | 39 | of_irq_init_cb_t irq_init_cb = of_device_get_match_data(&pdev->dev); | 
|---|
| 40 | 40 |  | 
|---|
| 41 |  | -	if (!irq_init_cb) | 
|---|
|  | 41 | +	if (!irq_init_cb) { | 
|---|
|  | 42 | +		of_node_put(par_np); | 
|---|
| 42 | 43 | return -EINVAL; | 
|---|
|  | 44 | +	} | 
|---|
| 43 | 45 |  | 
|---|
| 44 | 46 | if (par_np == np) | 
|---|
| 45 | 47 | par_np = NULL; | 
|---|
| .. | .. | 
|---|
| 52 | 54 | * interrupt controller. The actual initialization callback of this | 
|---|
| 53 | 55 | * interrupt controller can check for specific domains as necessary. | 
|---|
| 54 | 56 | */ | 
|---|
| 55 |  | -	if (par_np && !irq_find_matching_host(par_np, DOMAIN_BUS_ANY)) | 
|---|
|  | 57 | +	if (par_np && !irq_find_matching_host(par_np, DOMAIN_BUS_ANY)) { | 
|---|
|  | 58 | +		of_node_put(par_np); | 
|---|
| 56 | 59 | return -EPROBE_DEFER; | 
|---|
|  | 60 | +	} | 
|---|
| 57 | 61 |  | 
|---|
| 58 | 62 | return irq_init_cb(np, par_np); | 
|---|
| 59 | 63 | } | 
|---|