Messages in this thread | | | Subject | Re: [PATCH] ASoC: bcm2835-i2s: substream alignment now independent in hwparams | From | Matt Flax <> | Date | Fri, 27 Mar 2020 10:56:50 +1100 |
| |
Should this patch be handled through the ALSA team the R. Pi team or the BCM team ?
thanks
Matt
On 24/3/20 8:08 pm, Matt Flax wrote: > Substream sample alignment was being set in hwparams for both > substreams at the same time. This became a problem when the Audio > Injector isolated sound card needed to offset sample alignment > for high sample rates. The latency difference between playback > and capture occurs because of the digital isolation chip > propagation time, particularly when the codec is master and > the DAC return is twice delayed. > > This patch sets sample alignment registers based on the substream > direction in hwparams. This gives the machine driver more control > over sample alignment in the bcm2835 i2s driver. > > Signed-off-by: Matt Flax <flatmax@flatmax.org> > --- > sound/soc/bcm/bcm2835-i2s.c | 36 +++++++++++++++++++----------------- > 1 file changed, 19 insertions(+), 17 deletions(-) > > diff --git a/sound/soc/bcm/bcm2835-i2s.c b/sound/soc/bcm/bcm2835-i2s.c > index e6a12e271b07..9db542699a13 100644 > --- a/sound/soc/bcm/bcm2835-i2s.c > +++ b/sound/soc/bcm/bcm2835-i2s.c > @@ -493,11 +493,6 @@ static int bcm2835_i2s_hw_params(struct snd_pcm_substream *substream, > return -EINVAL; > } > > - bcm2835_i2s_calc_channel_pos(&rx_ch1_pos, &rx_ch2_pos, > - rx_mask, slot_width, data_delay, odd_slot_offset); > - bcm2835_i2s_calc_channel_pos(&tx_ch1_pos, &tx_ch2_pos, > - tx_mask, slot_width, data_delay, odd_slot_offset); > - > /* > * Transmitting data immediately after frame start, eg > * in left-justified or DSP mode A, only works stable > @@ -508,19 +503,26 @@ static int bcm2835_i2s_hw_params(struct snd_pcm_substream *substream, > "Unstable slave config detected, L/R may be swapped"); > > /* > - * Set format for both streams. > - * We cannot set another frame length > - * (and therefore word length) anyway, > - * so the format will be the same. > + * Set format on a per stream basis. > + * The alignment format can be different depending on direction. > */ > - regmap_write(dev->i2s_regmap, BCM2835_I2S_RXC_A_REG, > - format > - | BCM2835_I2S_CH1_POS(rx_ch1_pos) > - | BCM2835_I2S_CH2_POS(rx_ch2_pos)); > - regmap_write(dev->i2s_regmap, BCM2835_I2S_TXC_A_REG, > - format > - | BCM2835_I2S_CH1_POS(tx_ch1_pos) > - | BCM2835_I2S_CH2_POS(tx_ch2_pos)); > + if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { > + bcm2835_i2s_calc_channel_pos(&rx_ch1_pos, &rx_ch2_pos, > + rx_mask, slot_width, data_delay, odd_slot_offset); > + regmap_write(dev->i2s_regmap, BCM2835_I2S_RXC_A_REG, > + format > + | BCM2835_I2S_CH1_POS(rx_ch1_pos) > + | BCM2835_I2S_CH2_POS(rx_ch2_pos)); > + } > + > + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { > + bcm2835_i2s_calc_channel_pos(&tx_ch1_pos, &tx_ch2_pos, > + tx_mask, slot_width, data_delay, odd_slot_offset); > + regmap_write(dev->i2s_regmap, BCM2835_I2S_TXC_A_REG, > + format > + | BCM2835_I2S_CH1_POS(tx_ch1_pos) > + | BCM2835_I2S_CH2_POS(tx_ch2_pos)); > + } > > /* Setup the I2S mode */ >
| |