2017-11-06 15:22:46

by Olivier Moysan

[permalink] [raw]
Subject: [PATCH 0/2] ASoC: stm32: spdifrx: DMA management fixes

This patch-set gathers DMA management fixes for STM32 SPDIFRX.

Olivier Moysan (2):
ASoC: stm32: spdifrx: fix 16 bits capture
ASoC: stm32: spdifrx: fix control DMA error management

sound/soc/stm/stm32_spdifrx.c | 23 +++++++++++++----------
1 file changed, 13 insertions(+), 10 deletions(-)

--
1.9.1


From 1583347316688767459@xxx Mon Nov 06 19:47:49 +0000 2017
X-GM-THRID: 1583347316688767459
X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread


2017-11-06 16:55:48

by Olivier Moysan

[permalink] [raw]
Subject: [PATCH 1/2] ASoC: stm32: spdifrx: fix 16 bits capture

Change DMA bus width to manage properly 16 bits packed format.

Signed-off-by: Olivier Moysan <[email protected]>
---
sound/soc/stm/stm32_spdifrx.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/sound/soc/stm/stm32_spdifrx.c b/sound/soc/stm/stm32_spdifrx.c
index 84cc567..d7dbe84 100644
--- a/sound/soc/stm/stm32_spdifrx.c
+++ b/sound/soc/stm/stm32_spdifrx.c
@@ -750,17 +750,21 @@ static int stm32_spdifrx_hw_params(struct snd_pcm_substream *substream,
switch (data_size) {
case 16:
fmt = SPDIFRX_DRFMT_PACKED;
- spdifrx->dma_params.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
break;
case 32:
fmt = SPDIFRX_DRFMT_LEFT;
- spdifrx->dma_params.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
break;
default:
dev_err(&spdifrx->pdev->dev, "Unexpected data format\n");
return -EINVAL;
}

+ /*
+ * Set buswidth to 4 bytes for all data formats.
+ * Packed format: transfer 2 x 2 bytes samples
+ * Left format: transfer 1 x 3 bytes samples + 1 dummy byte
+ */
+ spdifrx->dma_params.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
snd_soc_dai_init_dma_data(cpu_dai, NULL, &spdifrx->dma_params);

return regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
--
1.9.1


From 1583363541200162938@xxx Tue Nov 07 00:05:42 +0000 2017
X-GM-THRID: 1583362017037431971
X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread

2017-11-06 15:23:47

by Olivier Moysan

[permalink] [raw]
Subject: [PATCH 2/2] ASoC: stm32: spdifrx: fix control DMA error management

Fix DMA channel request error handling.

Signed-off-by: Olivier Moysan <[email protected]>
---
sound/soc/stm/stm32_spdifrx.c | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/sound/soc/stm/stm32_spdifrx.c b/sound/soc/stm/stm32_spdifrx.c
index d7dbe84..b9bdefc 100644
--- a/sound/soc/stm/stm32_spdifrx.c
+++ b/sound/soc/stm/stm32_spdifrx.c
@@ -392,6 +392,12 @@ static int stm32_spdifrx_dma_ctrl_register(struct device *dev,
{
int ret;

+ spdifrx->ctrl_chan = dma_request_chan(dev, "rx-ctrl");
+ if (IS_ERR(spdifrx->ctrl_chan)) {
+ dev_err(dev, "dma_request_slave_channel failed\n");
+ return PTR_ERR(spdifrx->ctrl_chan);
+ }
+
spdifrx->dmab = devm_kzalloc(dev, sizeof(struct snd_dma_buffer),
GFP_KERNEL);
if (!spdifrx->dmab)
@@ -406,12 +412,6 @@ static int stm32_spdifrx_dma_ctrl_register(struct device *dev,
return ret;
}

- spdifrx->ctrl_chan = dma_request_chan(dev, "rx-ctrl");
- if (!spdifrx->ctrl_chan) {
- dev_err(dev, "dma_request_slave_channel failed\n");
- return -EINVAL;
- }
-
spdifrx->slave_config.direction = DMA_DEV_TO_MEM;
spdifrx->slave_config.src_addr = (dma_addr_t)(spdifrx->phys_addr +
STM32_SPDIFRX_CSR);
@@ -423,7 +423,6 @@ static int stm32_spdifrx_dma_ctrl_register(struct device *dev,
&spdifrx->slave_config);
if (ret < 0) {
dev_err(dev, "dmaengine_slave_config returned error %d\n", ret);
- dma_release_channel(spdifrx->ctrl_chan);
spdifrx->ctrl_chan = NULL;
}

@@ -962,7 +961,7 @@ static int stm32_spdifrx_probe(struct platform_device *pdev)
return 0;

error:
- if (spdifrx->ctrl_chan)
+ if (!IS_ERR(spdifrx->ctrl_chan))
dma_release_channel(spdifrx->ctrl_chan);
if (spdifrx->dmab)
snd_dma_free_pages(spdifrx->dmab);
--
1.9.1


From 1583287020051559288@xxx Mon Nov 06 03:49:26 +0000 2017
X-GM-THRID: 1583287020051559288
X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread