diff options
| author | Alain Volmat <alain.volmat@foss.st.com> | 2026-01-06 14:34:30 +0300 |
|---|---|---|
| committer | Mauro Carvalho Chehab <mchehab+huawei@kernel.org> | 2026-03-11 03:05:32 +0300 |
| commit | bc901885fae0a0273288666609d143e960b6ad3a (patch) | |
| tree | 3382a1dbaa1af31e5bd9e3af4c744822611cc32e | |
| parent | 9ab2bd7760a9edc23dfef71bb94092359ce94024 (diff) | |
| download | linux-bc901885fae0a0273288666609d143e960b6ad3a.tar.xz | |
media: stm32: dcmi: perform dmaengine_slave_config at probe
Perform the dma channel configuration at probe time right after
the channel allocation since this is fixed for the whole lifetime
of the driver.
Signed-off-by: Alain Volmat <alain.volmat@foss.st.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
| -rw-r--r-- | drivers/media/platform/st/stm32/stm32-dcmi.c | 32 |
1 files changed, 15 insertions, 17 deletions
diff --git a/drivers/media/platform/st/stm32/stm32-dcmi.c b/drivers/media/platform/st/stm32/stm32-dcmi.c index 619b0d981211..787c5d778db2 100644 --- a/drivers/media/platform/st/stm32/stm32-dcmi.c +++ b/drivers/media/platform/st/stm32/stm32-dcmi.c @@ -301,23 +301,6 @@ static int dcmi_start_dma(struct stm32_dcmi *dcmi, struct dcmi_buf *buf) { struct dma_async_tx_descriptor *desc = NULL; - struct dma_slave_config config; - int ret; - - memset(&config, 0, sizeof(config)); - - config.src_addr = (dma_addr_t)dcmi->res->start + DCMI_DR; - config.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; - config.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; - config.dst_maxburst = 4; - - /* Configure DMA channel */ - ret = dmaengine_slave_config(dcmi->dma_chan, &config); - if (ret < 0) { - dev_err(dcmi->dev, "%s: DMA channel config failed (%d)\n", - __func__, ret); - return ret; - } /* * Avoid call of dmaengine_terminate_sync() between @@ -1888,6 +1871,7 @@ static int dcmi_probe(struct platform_device *pdev) struct vb2_queue *q; struct dma_chan *chan; struct dma_slave_caps caps; + struct dma_slave_config dma_config; struct clk *mclk; int ret = 0; @@ -1954,6 +1938,19 @@ static int dcmi_probe(struct platform_device *pdev) if (!ret && caps.max_sg_burst) dcmi->dma_max_burst = caps.max_sg_burst * DMA_SLAVE_BUSWIDTH_4_BYTES; + memset(&dma_config, 0, sizeof(dma_config)); + + dma_config.src_addr = (dma_addr_t)dcmi->res->start + DCMI_DR; + dma_config.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; + + /* Configure DMA channel */ + ret = dmaengine_slave_config(chan, &dma_config); + if (ret < 0) { + dev_err(dcmi->dev, "%s: DMA channel config failed (%d)\n", + __func__, ret); + goto err_dma_slave_config; + } + spin_lock_init(&dcmi->irqlock); mutex_init(&dcmi->lock); mutex_init(&dcmi->dma_lock); @@ -2072,6 +2069,7 @@ err_device_unregister: v4l2_device_unregister(&dcmi->v4l2_dev); err_media_device_cleanup: media_device_cleanup(&dcmi->mdev); +err_dma_slave_config: dma_release_channel(dcmi->dma_chan); return ret; |
