Commit 14b9e26c authored by Liang He's avatar Liang He Committed by Michael Ellerman

powerpc/85xx: Add missing of_node_put() in sgy_cst1000

In gpio_halt_probe(), of_find_matching_node() will return a node
pointer with refcount incremented. The reference should be dropped with
of_node_put() in the failure path.
Signed-off-by: default avatarLiang He <windhl@126.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220617105011.4041123-1-windhl@126.com
parent 593d7b89
...@@ -71,6 +71,7 @@ static int gpio_halt_probe(struct platform_device *pdev) ...@@ -71,6 +71,7 @@ static int gpio_halt_probe(struct platform_device *pdev)
{ {
enum of_gpio_flags flags; enum of_gpio_flags flags;
struct device_node *node = pdev->dev.of_node; struct device_node *node = pdev->dev.of_node;
struct device_node *child_node;
int gpio, err, irq; int gpio, err, irq;
int trigger; int trigger;
...@@ -78,26 +79,29 @@ static int gpio_halt_probe(struct platform_device *pdev) ...@@ -78,26 +79,29 @@ static int gpio_halt_probe(struct platform_device *pdev)
return -ENODEV; return -ENODEV;
/* If there's no matching child, this isn't really an error */ /* If there's no matching child, this isn't really an error */
halt_node = of_find_matching_node(node, child_match); child_node = of_find_matching_node(node, child_match);
if (!halt_node) if (!child_node)
return 0; return 0;
/* Technically we could just read the first one, but punish /* Technically we could just read the first one, but punish
* DT writers for invalid form. */ * DT writers for invalid form. */
if (of_gpio_count(halt_node) != 1) if (of_gpio_count(child_node) != 1) {
return -EINVAL; err = -EINVAL;
goto err_put;
}
/* Get the gpio number relative to the dynamic base. */ /* Get the gpio number relative to the dynamic base. */
gpio = of_get_gpio_flags(halt_node, 0, &flags); gpio = of_get_gpio_flags(child_node, 0, &flags);
if (!gpio_is_valid(gpio)) if (!gpio_is_valid(gpio)) {
return -EINVAL; err = -EINVAL;
goto err_put;
}
err = gpio_request(gpio, "gpio-halt"); err = gpio_request(gpio, "gpio-halt");
if (err) { if (err) {
printk(KERN_ERR "gpio-halt: error requesting GPIO %d.\n", printk(KERN_ERR "gpio-halt: error requesting GPIO %d.\n",
gpio); gpio);
halt_node = NULL; goto err_put;
return err;
} }
trigger = (flags == OF_GPIO_ACTIVE_LOW); trigger = (flags == OF_GPIO_ACTIVE_LOW);
...@@ -105,15 +109,14 @@ static int gpio_halt_probe(struct platform_device *pdev) ...@@ -105,15 +109,14 @@ static int gpio_halt_probe(struct platform_device *pdev)
gpio_direction_output(gpio, !trigger); gpio_direction_output(gpio, !trigger);
/* Now get the IRQ which tells us when the power button is hit */ /* Now get the IRQ which tells us when the power button is hit */
irq = irq_of_parse_and_map(halt_node, 0); irq = irq_of_parse_and_map(child_node, 0);
err = request_irq(irq, gpio_halt_irq, IRQF_TRIGGER_RISING | err = request_irq(irq, gpio_halt_irq, IRQF_TRIGGER_RISING |
IRQF_TRIGGER_FALLING, "gpio-halt", halt_node); IRQF_TRIGGER_FALLING, "gpio-halt", child_node);
if (err) { if (err) {
printk(KERN_ERR "gpio-halt: error requesting IRQ %d for " printk(KERN_ERR "gpio-halt: error requesting IRQ %d for "
"GPIO %d.\n", irq, gpio); "GPIO %d.\n", irq, gpio);
gpio_free(gpio); gpio_free(gpio);
halt_node = NULL; goto err_put;
return err;
} }
/* Register our halt function */ /* Register our halt function */
...@@ -123,7 +126,12 @@ static int gpio_halt_probe(struct platform_device *pdev) ...@@ -123,7 +126,12 @@ static int gpio_halt_probe(struct platform_device *pdev)
printk(KERN_INFO "gpio-halt: registered GPIO %d (%d trigger, %d" printk(KERN_INFO "gpio-halt: registered GPIO %d (%d trigger, %d"
" irq).\n", gpio, trigger, irq); " irq).\n", gpio, trigger, irq);
halt_node = child_node;
return 0; return 0;
err_put:
of_node_put(child_node);
return err;
} }
static int gpio_halt_remove(struct platform_device *pdev) static int gpio_halt_remove(struct platform_device *pdev)
...@@ -139,6 +147,7 @@ static int gpio_halt_remove(struct platform_device *pdev) ...@@ -139,6 +147,7 @@ static int gpio_halt_remove(struct platform_device *pdev)
gpio_free(gpio); gpio_free(gpio);
of_node_put(halt_node);
halt_node = NULL; halt_node = NULL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment