aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/remoteproc/Kconfig2
-rw-r--r--drivers/remoteproc/remoteproc_core.c6
-rw-r--r--drivers/remoteproc/ste_modem_rproc.c7
3 files changed, 11 insertions, 4 deletions
diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig
index cc1f7bf53fd0..c6d77e20622c 100644
--- a/drivers/remoteproc/Kconfig
+++ b/drivers/remoteproc/Kconfig
@@ -4,7 +4,7 @@ menu "Remoteproc drivers"
4config REMOTEPROC 4config REMOTEPROC
5 tristate 5 tristate
6 depends on HAS_DMA 6 depends on HAS_DMA
7 select FW_CONFIG 7 select FW_LOADER
8 select VIRTIO 8 select VIRTIO
9 9
10config OMAP_REMOTEPROC 10config OMAP_REMOTEPROC
diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
index 29387df4bfc9..8edb4aed5d36 100644
--- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c
@@ -217,7 +217,7 @@ int rproc_alloc_vring(struct rproc_vdev *rvdev, int i)
217 * TODO: support predefined notifyids (via resource table) 217 * TODO: support predefined notifyids (via resource table)
218 */ 218 */
219 ret = idr_alloc(&rproc->notifyids, rvring, 0, 0, GFP_KERNEL); 219 ret = idr_alloc(&rproc->notifyids, rvring, 0, 0, GFP_KERNEL);
220 if (ret) { 220 if (ret < 0) {
221 dev_err(dev, "idr_alloc failed: %d\n", ret); 221 dev_err(dev, "idr_alloc failed: %d\n", ret);
222 dma_free_coherent(dev->parent, size, va, dma); 222 dma_free_coherent(dev->parent, size, va, dma);
223 return ret; 223 return ret;
@@ -366,10 +366,12 @@ static int rproc_handle_vdev(struct rproc *rproc, struct fw_rsc_vdev *rsc,
366 /* it is now safe to add the virtio device */ 366 /* it is now safe to add the virtio device */
367 ret = rproc_add_virtio_dev(rvdev, rsc->id); 367 ret = rproc_add_virtio_dev(rvdev, rsc->id);
368 if (ret) 368 if (ret)
369 goto free_rvdev; 369 goto remove_rvdev;
370 370
371 return 0; 371 return 0;
372 372
373remove_rvdev:
374 list_del(&rvdev->node);
373free_rvdev: 375free_rvdev:
374 kfree(rvdev); 376 kfree(rvdev);
375 return ret; 377 return ret;
diff --git a/drivers/remoteproc/ste_modem_rproc.c b/drivers/remoteproc/ste_modem_rproc.c
index a7743c069339..fb95c4220052 100644
--- a/drivers/remoteproc/ste_modem_rproc.c
+++ b/drivers/remoteproc/ste_modem_rproc.c
@@ -240,6 +240,8 @@ static int sproc_drv_remove(struct platform_device *pdev)
240 240
241 /* Unregister as remoteproc device */ 241 /* Unregister as remoteproc device */
242 rproc_del(sproc->rproc); 242 rproc_del(sproc->rproc);
243 dma_free_coherent(sproc->rproc->dev.parent, SPROC_FW_SIZE,
244 sproc->fw_addr, sproc->fw_dma_addr);
243 rproc_put(sproc->rproc); 245 rproc_put(sproc->rproc);
244 246
245 mdev->drv_data = NULL; 247 mdev->drv_data = NULL;
@@ -297,10 +299,13 @@ static int sproc_probe(struct platform_device *pdev)
297 /* Register as a remoteproc device */ 299 /* Register as a remoteproc device */
298 err = rproc_add(rproc); 300 err = rproc_add(rproc);
299 if (err) 301 if (err)
300 goto free_rproc; 302 goto free_mem;
301 303
302 return 0; 304 return 0;
303 305
306free_mem:
307 dma_free_coherent(rproc->dev.parent, SPROC_FW_SIZE,
308 sproc->fw_addr, sproc->fw_dma_addr);
304free_rproc: 309free_rproc:
305 /* Reset device data upon error */ 310 /* Reset device data upon error */
306 mdev->drv_data = NULL; 311 mdev->drv_data = NULL;