Commit 7c6daeaf authored by WangBo's avatar WangBo Committed by Linus Walleij
Browse files

pinctrl: nomadik: fix possible object reference leak



The of_find_device_by_node takes a reference to the struct device
when find the match device ,we should release it when fail.

Signed-off-by: default avatarWangBo <wang.bo116@zte.com.cn>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent e003ec6a
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -1056,17 +1056,22 @@ static struct nmk_gpio_chip *nmk_gpio_populate_chip(struct device_node *np,
	}
	if (of_property_read_u32(np, "gpio-bank", &id)) {
		dev_err(&pdev->dev, "populate: gpio-bank property not found\n");
		platform_device_put(gpio_pdev);
		return ERR_PTR(-EINVAL);
	}

	/* Already populated? */
	nmk_chip = nmk_gpio_chips[id];
	if (nmk_chip)
	if (nmk_chip) {
		platform_device_put(gpio_pdev);
		return nmk_chip;
	}

	nmk_chip = devm_kzalloc(&pdev->dev, sizeof(*nmk_chip), GFP_KERNEL);
	if (!nmk_chip)
	if (!nmk_chip) {
		platform_device_put(gpio_pdev);
		return ERR_PTR(-ENOMEM);
	}

	nmk_chip->bank = id;
	chip = &nmk_chip->chip;
@@ -1077,13 +1082,17 @@ static struct nmk_gpio_chip *nmk_gpio_populate_chip(struct device_node *np,

	res = platform_get_resource(gpio_pdev, IORESOURCE_MEM, 0);
	base = devm_ioremap_resource(&pdev->dev, res);
	if (IS_ERR(base))
	if (IS_ERR(base)) {
		platform_device_put(gpio_pdev);
		return ERR_CAST(base);
	}
	nmk_chip->addr = base;

	clk = clk_get(&gpio_pdev->dev, NULL);
	if (IS_ERR(clk))
	if (IS_ERR(clk)) {
		platform_device_put(gpio_pdev);
		return (void *) clk;
	}
	clk_prepare(clk);
	nmk_chip->clk = clk;