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;
        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);