diff options
Diffstat (limited to 'drivers/remoteproc/stm32_rproc.c')
| -rw-r--r-- | drivers/remoteproc/stm32_rproc.c | 14 | 
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c index 7d782ed9e589..8746cbb1f168 100644 --- a/drivers/remoteproc/stm32_rproc.c +++ b/drivers/remoteproc/stm32_rproc.c @@ -223,11 +223,13 @@ static int stm32_rproc_prepare(struct rproc *rproc)  	while (of_phandle_iterator_next(&it) == 0) {  		rmem = of_reserved_mem_lookup(it.node);  		if (!rmem) { +			of_node_put(it.node);  			dev_err(dev, "unable to acquire memory-region\n");  			return -EINVAL;  		}  		if (stm32_rproc_pa_to_da(rproc, rmem->base, &da) < 0) { +			of_node_put(it.node);  			dev_err(dev, "memory region not valid %pa\n",  				&rmem->base);  			return -EINVAL; @@ -254,8 +256,10 @@ static int stm32_rproc_prepare(struct rproc *rproc)  							   it.node->name);  		} -		if (!mem) +		if (!mem) { +			of_node_put(it.node);  			return -ENOMEM; +		}  		rproc_add_carveout(rproc, mem);  		index++; @@ -287,8 +291,16 @@ static void stm32_rproc_mb_vq_work(struct work_struct *work)  	struct stm32_mbox *mb = container_of(work, struct stm32_mbox, vq_work);  	struct rproc *rproc = dev_get_drvdata(mb->client.dev); +	mutex_lock(&rproc->lock); + +	if (rproc->state != RPROC_RUNNING) +		goto unlock_mutex; +  	if (rproc_vq_interrupt(rproc, mb->vq_id) == IRQ_NONE)  		dev_dbg(&rproc->dev, "no message found in vq%d\n", mb->vq_id); + +unlock_mutex: +	mutex_unlock(&rproc->lock);  }  static void stm32_rproc_mb_callback(struct mbox_client *cl, void *data)  |