[Sound-open-firmware] [PATCH] host: remove first_copy workaround for HDA DMA
Keyon Jie
yang.jie at linux.intel.com
Tue May 15 17:36:40 CEST 2018
Here remove the first_copy workaround(it was needed as HDA DMA is not
available at the trigger start stage).
This require the fix from host driver side:
ASoC: SOF: hw-apl: start HDA DMA at stream_prepare() stage and remove
stream_trigger()
Signed-off-by: Keyon Jie <yang.jie at linux.intel.com>
---
Test with:
Mininow max rt5651 and APL GPMRB and CNL nocodec
SOF master: 7c5dd8cfdf4f8ca1fa5cfdd7352b81cbfc8edb88
SOF-Tool master: 86fe688a2b4f68a1ce87e0951686be12a00f1a3c
https://github.com/plbossart/sound/tree/topic/sof-v4.14:
22c8b2b68186e6af83f21c302d8086559b5d2e23
note: this need be merged with driver patch together:
'ASoC: SOF: start HDA DMA at hw_params() stage and remove stream_trigger()'
---
src/audio/host.c | 41 ++++++++++++-----------------------------
1 file changed, 12 insertions(+), 29 deletions(-)
diff --git a/src/audio/host.c b/src/audio/host.c
index 998c5ca..a0956b3 100644
--- a/src/audio/host.c
+++ b/src/audio/host.c
@@ -84,9 +84,6 @@ struct host_data {
uint32_t period_bytes;
uint32_t period_count;
-#if defined CONFIG_DMA_GW
- uint32_t first_copy;
-#endif
/* stream info */
struct sof_ipc_stream_posn posn; /* TODO: update this */
};
@@ -477,12 +474,12 @@ static int host_trigger(struct comp_dev *dev, int cmd)
goto out;
}
- /* preload first playback period for preloader task */
+ /*
+ * host dma will copy the first period once it is started,
+ * automatically.
+ * Here update the pointers to reflect the real case.
+ */
if (dev->params.direction == SOF_IPC_STREAM_PLAYBACK) {
- /*
- * host dma will not start copy at this point yet,
- * just produce empty period bytes for it.
- */
comp_update_buffer_produce(hd->dma_buffer,
hd->period_bytes);
}
@@ -736,10 +733,6 @@ static int host_prepare(struct comp_dev *dev)
hd->split_remaining = 0;
dev->position = 0;
-#if defined CONFIG_DMA_GW
- hd->first_copy = 1;
-#endif
-
return 0;
}
@@ -863,19 +856,6 @@ static int host_copy(struct comp_dev *dev)
if (dev->state != COMP_STATE_ACTIVE)
return 0;
-#if defined CONFIG_DMA_GW
- if (dev->params.direction == SOF_IPC_STREAM_PLAYBACK &&
- hd->first_copy) {
- /*
- * host dma will not start copy at this point yet, just produce
- * empty period bytes for it.
- */
- comp_update_buffer_produce(hd->dma_buffer,
- hd->period_bytes);
- hd->first_copy = 0;
- return 0;
- }
-#endif
local_elem = list_first_item(&hd->config.elem_list,
struct dma_sg_elem, list);
@@ -896,14 +876,17 @@ static int host_copy(struct comp_dev *dev)
}
#if defined CONFIG_DMA_GW
-
- /* update host pointers from last period */
- host_gw_dma_update(dev);
-
/* tell gateway to copy another period */
ret = dma_copy(hd->dma, hd->chan, hd->period_bytes);
if (ret < 0)
goto out;
+
+ /*
+ * update host pointers for the new copied period.
+ * fixme: do we need wait and check to make sure
+ * the new copy is finished here?
+ */
+ host_gw_dma_update(dev);
#else
/* do DMA transfer */
ret = dma_set_config(hd->dma, hd->chan, &hd->config);
--
2.14.1
More information about the Sound-open-firmware
mailing list