Rework of the spin_lock calls in preparation of the rework of the data handling of the driver. Keep it straight forward with basically spin_lock protection around everything except dmaengine calls that might sleep (ex: synchronize / terminate)
Signed-off-by: Alain Volmat <[email protected]> --- drivers/media/platform/st/stm32/stm32-dcmi.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/drivers/media/platform/st/stm32/stm32-dcmi.c b/drivers/media/platform/st/stm32/stm32-dcmi.c index fa33acc34eab..1015f2d88f54 100644 --- a/drivers/media/platform/st/stm32/stm32-dcmi.c +++ b/drivers/media/platform/st/stm32/stm32-dcmi.c @@ -227,25 +227,18 @@ static int dcmi_restart_capture(struct stm32_dcmi *dcmi) { struct dcmi_buf *buf; - spin_lock_irq(&dcmi->irqlock); - - if (dcmi->state != RUNNING) { - spin_unlock_irq(&dcmi->irqlock); + if (dcmi->state != RUNNING) return -EINVAL; - } /* Restart a new DMA transfer with next buffer */ if (list_empty(&dcmi->buffers)) { dev_dbg(dcmi->dev, "Capture restart is deferred to next buffer queueing\n"); dcmi->state = WAIT_FOR_BUFFER; - spin_unlock_irq(&dcmi->irqlock); return 0; } buf = list_entry(dcmi->buffers.next, struct dcmi_buf, list); dcmi->active = buf; - spin_unlock_irq(&dcmi->irqlock); - return dcmi_start_capture(dcmi, buf); } @@ -370,8 +363,10 @@ static void dcmi_process_jpeg(struct stm32_dcmi *dcmi) * buffer payload. */ + spin_unlock_irq(&dcmi->irqlock); /* Drain DMA */ dmaengine_synchronize(dcmi->dma_chan); + spin_lock_irq(&dcmi->irqlock); /* Get DMA residue to get JPEG size */ status = dmaengine_tx_status(dcmi->dma_chan, dcmi->dma_cookie, &state); @@ -386,8 +381,10 @@ static void dcmi_process_jpeg(struct stm32_dcmi *dcmi) dcmi_buffer_done(dcmi, buf, 0, -EIO); } + spin_unlock_irq(&dcmi->irqlock); /* Abort DMA operation */ dmaengine_terminate_sync(dcmi->dma_chan); + spin_lock_irq(&dcmi->irqlock); /* Restart capture */ if (dcmi_restart_capture(dcmi)) @@ -413,8 +410,10 @@ static irqreturn_t dcmi_irq_thread(int irq, void *arg) spin_unlock_irq(&dcmi->irqlock); dmaengine_terminate_sync(dcmi->dma_chan); + spin_lock_irq(&dcmi->irqlock); if (dcmi_restart_capture(dcmi)) dev_err(dcmi->dev, "%s: Cannot restart capture\n", __func__); + spin_unlock_irq(&dcmi->irqlock); return IRQ_HANDLED; } @@ -424,8 +423,8 @@ static irqreturn_t dcmi_irq_thread(int irq, void *arg) if (dcmi->sd_format->fourcc == V4L2_PIX_FMT_JPEG && dcmi->misr & IT_FRAME) { /* JPEG received */ - spin_unlock_irq(&dcmi->irqlock); dcmi_process_jpeg(dcmi); + spin_unlock_irq(&dcmi->irqlock); return IRQ_HANDLED; } @@ -599,11 +598,9 @@ static void dcmi_buf_queue(struct vb2_buffer *vb) dev_dbg(dcmi->dev, "Starting capture on buffer[%d] queued\n", buf->vb.vb2_buf.index); - spin_unlock_irq(&dcmi->irqlock); if (dcmi_start_capture(dcmi, buf)) dev_err(dcmi->dev, "%s: Cannot restart capture on overflow or error\n", __func__); - return; } spin_unlock_irq(&dcmi->irqlock); @@ -812,11 +809,11 @@ static int dcmi_start_streaming(struct vb2_queue *vq, unsigned int count) dev_dbg(dcmi->dev, "Start streaming, starting capture\n"); - spin_unlock_irq(&dcmi->irqlock); ret = dcmi_start_capture(dcmi, buf); if (ret) { dev_err(dcmi->dev, "%s: Start streaming failed, cannot start capture\n", __func__); + spin_unlock_irq(&dcmi->irqlock); goto err_pipeline_stop; } @@ -826,6 +823,8 @@ static int dcmi_start_streaming(struct vb2_queue *vq, unsigned int count) else reg_set(dcmi->regs, DCMI_IER, IT_OVR | IT_ERR); + spin_unlock_irq(&dcmi->irqlock); + return 0; err_pipeline_stop: -- 2.34.1
