media: ti: cal: Fix cal_camerarx_create() error handling
authorTomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Mon, 19 Jun 2023 11:40:05 +0000 (14:40 +0300)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>
Tue, 25 Jul 2023 07:24:30 +0000 (09:24 +0200)
We don't do a proper job at freeing resources in cal_camerarx_create's
error paths.

Fix these, and also switch the phy allcation from kzalloc to
devm_kzalloc to simplify the code further.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
drivers/media/platform/ti/cal/cal-camerarx.c

index 267089b..97208d5 100644 (file)
@@ -864,7 +864,7 @@ struct cal_camerarx *cal_camerarx_create(struct cal_dev *cal,
        unsigned int i;
        int ret;
 
-       phy = kzalloc(sizeof(*phy), GFP_KERNEL);
+       phy = devm_kzalloc(cal->dev, sizeof(*phy), GFP_KERNEL);
        if (!phy)
                return ERR_PTR(-ENOMEM);
 
@@ -882,7 +882,7 @@ struct cal_camerarx *cal_camerarx_create(struct cal_dev *cal,
        if (IS_ERR(phy->base)) {
                cal_err(cal, "failed to ioremap\n");
                ret = PTR_ERR(phy->base);
-               goto error;
+               goto err_destroy_mutex;
        }
 
        cal_dbg(1, cal, "ioresource %s at %pa - %pa\n",
@@ -890,11 +890,11 @@ struct cal_camerarx *cal_camerarx_create(struct cal_dev *cal,
 
        ret = cal_camerarx_regmap_init(cal, phy);
        if (ret)
-               goto error;
+               goto err_destroy_mutex;
 
        ret = cal_camerarx_parse_dt(phy);
        if (ret)
-               goto error;
+               goto err_destroy_mutex;
 
        /* Initialize the V4L2 subdev and media entity. */
        sd = &phy->subdev;
@@ -911,21 +911,25 @@ struct cal_camerarx *cal_camerarx_create(struct cal_dev *cal,
        ret = media_entity_pads_init(&sd->entity, ARRAY_SIZE(phy->pads),
                                     phy->pads);
        if (ret)
-               goto error;
+               goto err_node_put;
 
        ret = cal_camerarx_sd_init_cfg(sd, NULL);
        if (ret)
-               goto error;
+               goto err_entity_cleanup;
 
        ret = v4l2_device_register_subdev(&cal->v4l2_dev, sd);
        if (ret)
-               goto error;
+               goto err_entity_cleanup;
 
        return phy;
 
-error:
+err_entity_cleanup:
        media_entity_cleanup(&phy->subdev.entity);
-       kfree(phy);
+err_node_put:
+       of_node_put(phy->source_ep_node);
+       of_node_put(phy->source_node);
+err_destroy_mutex:
+       mutex_destroy(&phy->mutex);
        return ERR_PTR(ret);
 }
 
@@ -939,5 +943,4 @@ void cal_camerarx_destroy(struct cal_camerarx *phy)
        of_node_put(phy->source_ep_node);
        of_node_put(phy->source_node);
        mutex_destroy(&phy->mutex);
-       kfree(phy);
 }