remoteproc: Get rid of tedious error path
authorMathieu Poirier <mathieu.poirier@linaro.org>
Mon, 20 Apr 2020 23:16:01 +0000 (17:16 -0600)
committerBjorn Andersson <bjorn.andersson@linaro.org>
Tue, 21 Apr 2020 02:29:59 +0000 (19:29 -0700)
Get rid of tedious error management by moving firmware and operation
allocation after calling device_initialize().  That way we take advantage
of the automatic call to rproc_type_release() to cleanup after ourselves
when put_device() is called.

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Reviewed-by: Alex Elder <elder@linaro.org>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Acked-by: Suman Anna <s-anna@ti.com>
Link: https://lore.kernel.org/r/20200420231601.16781-5-mathieu.poirier@linaro.org
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
drivers/remoteproc/remoteproc_core.c

index 1531850..6fca4e2 100644 (file)
@@ -2084,12 +2084,6 @@ struct rproc *rproc_alloc(struct device *dev, const char *name,
        if (!rproc)
                return NULL;
 
-       if (rproc_alloc_firmware(rproc, name, firmware))
-               goto free_rproc;
-
-       if (rproc_alloc_ops(rproc, ops))
-               goto free_firmware;
-
        rproc->name = name;
        rproc->priv = &rproc[1];
        rproc->auto_boot = true;
@@ -2103,12 +2097,17 @@ struct rproc *rproc_alloc(struct device *dev, const char *name,
        rproc->dev.driver_data = rproc;
        idr_init(&rproc->notifyids);
 
+       if (rproc_alloc_firmware(rproc, name, firmware))
+               goto put_device;
+
+       if (rproc_alloc_ops(rproc, ops))
+               goto put_device;
+
        /* Assign a unique device index and name */
        rproc->index = ida_simple_get(&rproc_dev_index, 0, 0, GFP_KERNEL);
        if (rproc->index < 0) {
                dev_err(dev, "ida_simple_get failed: %d\n", rproc->index);
-               put_device(&rproc->dev);
-               return NULL;
+               goto put_device;
        }
 
        dev_set_name(&rproc->dev, "remoteproc%d", rproc->index);
@@ -2130,10 +2129,8 @@ struct rproc *rproc_alloc(struct device *dev, const char *name,
 
        return rproc;
 
-free_firmware:
-       kfree_const(rproc->firmware);
-free_rproc:
-       kfree(rproc);
+put_device:
+       put_device(&rproc->dev);
        return NULL;
 }
 EXPORT_SYMBOL(rproc_alloc);