summaryrefslogtreecommitdiff
path: root/drivers/pinctrl/realtek
diff options
context:
space:
mode:
authorDan Carpenter <dan.carpenter@linaro.org>2023-10-05 17:01:25 +0300
committerLinus Walleij <linus.walleij@linaro.org>2023-10-07 00:05:28 +0300
commit8c58f51ff3c9f2bba5d2d0d01f5561f579e4f485 (patch)
tree91c38a3653d7c4369c60632d46fbb6aa1ab51865 /drivers/pinctrl/realtek
parent1c0b3cbe7fd98f54fb447e74119216f550a045b9 (diff)
downloadlinux-8c58f51ff3c9f2bba5d2d0d01f5561f579e4f485.tar.xz
pinctrl: realtek: Fix error handling in probe()
There are several issues in the probe function: 1) of_iomap() return NULL on error but the code checks for error pointers. 2) pinctrl_register() is the reverse. It returns error pointers but the code checks for NULL. 3) The error paths need to call iounmap(data->base) before returning to avoid a resource leak. Fixes: e99ce78030db ("pinctrl: realtek: Add common pinctrl driver for Realtek DHC RTD SoCs") Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org> Link: https://lore.kernel.org/r/590b337a-13ce-4391-a09d-d2b06fbc912d@moroto.mountain Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/realtek')
-rw-r--r--drivers/pinctrl/realtek/pinctrl-rtd.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/pinctrl/realtek/pinctrl-rtd.c b/drivers/pinctrl/realtek/pinctrl-rtd.c
index bafe27face80..6c6aa9c3c567 100644
--- a/drivers/pinctrl/realtek/pinctrl-rtd.c
+++ b/drivers/pinctrl/realtek/pinctrl-rtd.c
@@ -535,14 +535,15 @@ static struct regmap_config rtd_pinctrl_regmap_config = {
int rtd_pinctrl_probe(struct platform_device *pdev, const struct rtd_pinctrl_desc *desc)
{
struct rtd_pinctrl *data;
+ int ret;
data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
if (!data)
return -ENOMEM;
data->base = of_iomap(pdev->dev.of_node, 0);
- if (IS_ERR(data->base))
- return PTR_ERR(data->base);
+ if (!data->base)
+ return -ENOMEM;
data->dev = &pdev->dev;
data->info = desc;
@@ -561,18 +562,25 @@ int rtd_pinctrl_probe(struct platform_device *pdev, const struct rtd_pinctrl_des
if (IS_ERR(data->regmap_pinctrl)) {
dev_err(data->dev, "failed to init regmap: %ld\n",
PTR_ERR(data->regmap_pinctrl));
- return PTR_ERR(data->regmap_pinctrl);
+ ret = PTR_ERR(data->regmap_pinctrl);
+ goto unmap;
}
data->pcdev = pinctrl_register(&data->desc, &pdev->dev, data);
- if (!data->pcdev)
- return -ENOMEM;
+ if (IS_ERR(data->pcdev)) {
+ ret = PTR_ERR(data->pcdev);
+ goto unmap;
+ }
platform_set_drvdata(pdev, data);
dev_dbg(&pdev->dev, "probed\n");
return 0;
+
+unmap:
+ iounmap(data->base);
+ return ret;
}
EXPORT_SYMBOL(rtd_pinctrl_probe);