On 2019-09-18 10:14, Jon Hunter wrote:
On 17/09/2019 19:12, Ben Dooks wrote:
If the hw_params uses a different bit or channel count, then we
need to change both the I2S unit's CIF configuration as well as
the APBIF one.
To allow changing the APBIF, add a call to reconfigure the RX or
TX FIFO without changing the DMA or allocation, and get the I2S
driver to call it once the hw params have been calculate.
Signed-off-by: Ben Dooks <ben.dooks@xxxxxxxxxxxxxxx>
---
sound/soc/tegra/tegra30_ahub.c | 114
++++++++++++++++++---------------
sound/soc/tegra/tegra30_ahub.h | 5 ++
sound/soc/tegra/tegra30_i2s.c | 2 +
3 files changed, 69 insertions(+), 52 deletions(-)
diff --git a/sound/soc/tegra/tegra30_ahub.c
b/sound/soc/tegra/tegra30_ahub.c
index 952381260dc3..58e05ceb86da 100644
--- a/sound/soc/tegra/tegra30_ahub.c
+++ b/sound/soc/tegra/tegra30_ahub.c
@@ -84,12 +84,40 @@ static int tegra30_ahub_runtime_resume(struct
device *dev)
return 0;
}
+int tegra30_ahub_setup_rx_fifo(enum tegra30_ahub_rxcif rxcif,
+ struct tegra30_ahub_cif_conf *cif_conf)
+{
+ int channel = rxcif - TEGRA30_AHUB_RXCIF_APBIF_RX0;
+ u32 reg, val;
+
+ pm_runtime_get_sync(ahub->dev);
+
+ reg = TEGRA30_AHUB_CHANNEL_CTRL +
+ (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE);
+ val = tegra30_apbif_read(reg);
+ val &= ~(TEGRA30_AHUB_CHANNEL_CTRL_RX_THRESHOLD_MASK |
+ TEGRA30_AHUB_CHANNEL_CTRL_RX_PACK_MASK);
+ val |= (7 << TEGRA30_AHUB_CHANNEL_CTRL_RX_THRESHOLD_SHIFT) |
+ TEGRA30_AHUB_CHANNEL_CTRL_RX_PACK_EN |
+ TEGRA30_AHUB_CHANNEL_CTRL_RX_PACK_16;
+ tegra30_apbif_write(reg, val);
Aren't you just programming the same value to the APBIF here that was
previously programmed by the allocate function? I don't see the point
in
moving this? What am I missing here?
IIRC, this was due to trying different types of playback with a 4ch
32bit
sound output. The ahub and the i2s unit don't have to agreet.