| From e131f7b639a0ccfb937767d7947a95be91b3003e Mon Sep 17 00:00:00 2001 |
| From: Wen Yang <wenyang@linux.alibaba.com> |
| Date: Sun, 29 Sep 2019 15:00:47 +0800 |
| Subject: [PATCH] net: dsa: rtl8366rb: add missing of_node_put after calling |
| of_get_child_by_name |
| |
| commit f32eb9d80470dab05df26b6efd02d653c72e6a11 upstream. |
| |
| of_node_put needs to be called when the device node which is got |
| from of_get_child_by_name finished using. |
| irq_domain_add_linear() also calls of_node_get() to increase refcount, |
| so irq_domain will not be affected when it is released. |
| |
| Fixes: d8652956cf37 ("net: dsa: realtek-smi: Add Realtek SMI driver") |
| Signed-off-by: Wen Yang <wenyang@linux.alibaba.com> |
| Cc: Linus Walleij <linus.walleij@linaro.org> |
| Cc: Andrew Lunn <andrew@lunn.ch> |
| Cc: Vivien Didelot <vivien.didelot@gmail.com> |
| Cc: Florian Fainelli <f.fainelli@gmail.com> |
| Cc: "David S. Miller" <davem@davemloft.net> |
| Cc: netdev@vger.kernel.org |
| Cc: linux-kernel@vger.kernel.org |
| Reviewed-by: Linus Walleij <linus.walleij@linaro.org> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/net/dsa/rtl8366rb.c b/drivers/net/dsa/rtl8366rb.c |
| index a268085ffad2..f5cc8b0a7c74 100644 |
| --- a/drivers/net/dsa/rtl8366rb.c |
| +++ b/drivers/net/dsa/rtl8366rb.c |
| @@ -507,7 +507,8 @@ static int rtl8366rb_setup_cascaded_irq(struct realtek_smi *smi) |
| irq = of_irq_get(intc, 0); |
| if (irq <= 0) { |
| dev_err(smi->dev, "failed to get parent IRQ\n"); |
| - return irq ? irq : -EINVAL; |
| + ret = irq ? irq : -EINVAL; |
| + goto out_put_node; |
| } |
| |
| /* This clears the IRQ status register */ |
| @@ -515,7 +516,7 @@ static int rtl8366rb_setup_cascaded_irq(struct realtek_smi *smi) |
| &val); |
| if (ret) { |
| dev_err(smi->dev, "can't read interrupt status\n"); |
| - return ret; |
| + goto out_put_node; |
| } |
| |
| /* Fetch IRQ edge information from the descriptor */ |
| @@ -537,7 +538,7 @@ static int rtl8366rb_setup_cascaded_irq(struct realtek_smi *smi) |
| val); |
| if (ret) { |
| dev_err(smi->dev, "could not configure IRQ polarity\n"); |
| - return ret; |
| + goto out_put_node; |
| } |
| |
| ret = devm_request_threaded_irq(smi->dev, irq, NULL, |
| @@ -545,7 +546,7 @@ static int rtl8366rb_setup_cascaded_irq(struct realtek_smi *smi) |
| "RTL8366RB", smi); |
| if (ret) { |
| dev_err(smi->dev, "unable to request irq: %d\n", ret); |
| - return ret; |
| + goto out_put_node; |
| } |
| smi->irqdomain = irq_domain_add_linear(intc, |
| RTL8366RB_NUM_INTERRUPT, |
| @@ -553,12 +554,15 @@ static int rtl8366rb_setup_cascaded_irq(struct realtek_smi *smi) |
| smi); |
| if (!smi->irqdomain) { |
| dev_err(smi->dev, "failed to create IRQ domain\n"); |
| - return -EINVAL; |
| + ret = -EINVAL; |
| + goto out_put_node; |
| } |
| for (i = 0; i < smi->num_ports; i++) |
| irq_set_parent(irq_create_mapping(smi->irqdomain, i), irq); |
| |
| - return 0; |
| +out_put_node: |
| + of_node_put(intc); |
| + return ret; |
| } |
| |
| static int rtl8366rb_set_addr(struct realtek_smi *smi) |
| -- |
| 2.7.4 |
| |