From: Ben Dooks <ben.dooks@codethink.co.uk> To: linux-tegra@vger.kernel.org, alsa-devel@alsa-project.org, Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.com>, Liam Girdwood <lgirdwood@gmail.com>, Mark Brown <broonie@kernel.org>, Thierry Reding <thierry.reding@gmail.com>, Jonathan Hunter <jonathanh@nvidia.com> Cc: linux-kernel@lists.codethink.co.uk, Edward Cragg <edward.cragg@codethink.co.uk> Subject: [PATCH 3/8] ASoC: tegra: i2s: Add support for more than 2 channels Date: Tue, 17 Sep 2019 19:12:28 +0100 [thread overview] Message-ID: <20190917181233.534-4-ben.dooks@codethink.co.uk> (raw) In-Reply-To: <20190917181233.534-1-ben.dooks@codethink.co.uk> From: Edward Cragg <edward.cragg@codethink.co.uk> The CIF configuration and clock setting is currently hard coded for 2 channels. Since the hardware is capable of supporting 1-8 channels add support for reading the channel count from the supplied parameters to allow for better TDM support. It seems the original implementation of this driver was fixed at 2 channels for simplicity, and not implementing TDM. Signed-off-by: Edward Cragg <edward.cragg@codethink.co.uk> [ben.dooks@codethink.co.uk: added is_tdm and channel nr check] --- sound/soc/tegra/tegra30_i2s.c | 21 +++++++++++++-------- sound/soc/tegra/tegra30_i2s.h | 1 + 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/sound/soc/tegra/tegra30_i2s.c b/sound/soc/tegra/tegra30_i2s.c index b5372839f672..40bcc05a9dbb 100644 --- a/sound/soc/tegra/tegra30_i2s.c +++ b/sound/soc/tegra/tegra30_i2s.c @@ -86,14 +86,17 @@ static int tegra30_i2s_set_fmt(struct snd_soc_dai *dai, return -EINVAL; } + i2s->is_tdm = false; mask |= TEGRA30_I2S_CTRL_FRAME_FORMAT_MASK | TEGRA30_I2S_CTRL_LRCK_MASK; switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_DSP_A: + i2s->is_tdm = true; val |= TEGRA30_I2S_CTRL_FRAME_FORMAT_FSYNC; val |= TEGRA30_I2S_CTRL_LRCK_L_LOW; break; case SND_SOC_DAIFMT_DSP_B: + i2s->is_tdm = true; val |= TEGRA30_I2S_CTRL_FRAME_FORMAT_FSYNC; val |= TEGRA30_I2S_CTRL_LRCK_R_LOW; break; @@ -127,10 +130,13 @@ static int tegra30_i2s_hw_params(struct snd_pcm_substream *substream, struct device *dev = dai->dev; struct tegra30_i2s *i2s = snd_soc_dai_get_drvdata(dai); unsigned int mask, val, reg; - int ret, sample_size, srate, i2sclock, bitcnt, audio_bits; + int ret, sample_size, srate, i2sclock, bitcnt, audio_bits, channels; struct tegra30_ahub_cif_conf cif_conf; - if (params_channels(params) != 2) + channels = params_channels(params); + if (channels > 8) + return -EINVAL; + if (channels != 2 && !i2s->is_tdm) return -EINVAL; mask = TEGRA30_I2S_CTRL_BIT_SIZE_MASK; @@ -157,9 +163,8 @@ static int tegra30_i2s_hw_params(struct snd_pcm_substream *substream, regmap_update_bits(i2s->regmap, TEGRA30_I2S_CTRL, mask, val); srate = params_rate(params); - /* Final "* 2" required by Tegra hardware */ - i2sclock = srate * params_channels(params) * sample_size * 2; + i2sclock = srate * channels * sample_size * 2; bitcnt = (i2sclock / (2 * srate)) - 1; if (bitcnt < 0 || bitcnt > TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US) @@ -179,8 +184,8 @@ static int tegra30_i2s_hw_params(struct snd_pcm_substream *substream, regmap_write(i2s->regmap, TEGRA30_I2S_TIMING, val); cif_conf.threshold = 0; - cif_conf.audio_channels = 2; - cif_conf.client_channels = 2; + cif_conf.audio_channels = channels; + cif_conf.client_channels = channels; cif_conf.audio_bits = audio_bits; cif_conf.client_bits = audio_bits; cif_conf.expand = 0; @@ -319,7 +324,7 @@ static const struct snd_soc_dai_driver tegra30_i2s_dai_template = { .playback = { .stream_name = "Playback", .channels_min = 2, - .channels_max = 2, + .channels_max = 8, .rates = SNDRV_PCM_RATE_8000_96000, .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S24_LE | @@ -328,7 +333,7 @@ static const struct snd_soc_dai_driver tegra30_i2s_dai_template = { .capture = { .stream_name = "Capture", .channels_min = 2, - .channels_max = 2, + .channels_max = 8, .rates = SNDRV_PCM_RATE_8000_96000, .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S24_LE | diff --git a/sound/soc/tegra/tegra30_i2s.h b/sound/soc/tegra/tegra30_i2s.h index 0b1f3125a7c0..ae30e3c96337 100644 --- a/sound/soc/tegra/tegra30_i2s.h +++ b/sound/soc/tegra/tegra30_i2s.h @@ -224,6 +224,7 @@ struct tegra30_i2s { const struct tegra30_i2s_soc_data *soc_data; struct snd_soc_dai_driver dai; int cif_id; + bool is_tdm; struct clk *clk_i2s; enum tegra30_ahub_txcif capture_i2s_cif; enum tegra30_ahub_rxcif capture_fifo_cif; -- 2.23.0
WARNING: multiple messages have this Message-ID (diff)
From: Ben Dooks <ben.dooks@codethink.co.uk> To: linux-tegra@vger.kernel.org, alsa-devel@alsa-project.org, Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.com>, Liam Girdwood <lgirdwood@gmail.com>, Mark Brown <broonie@kernel.org>, Thierry Reding <thierry.reding@gmail.com>, Jonathan Hunter <jonathanh@nvidia.com> Cc: linux-kernel@lists.codethink.co.uk, Edward Cragg <edward.cragg@codethink.co.uk> Subject: [alsa-devel] [PATCH 3/8] ASoC: tegra: i2s: Add support for more than 2 channels Date: Tue, 17 Sep 2019 19:12:28 +0100 [thread overview] Message-ID: <20190917181233.534-4-ben.dooks@codethink.co.uk> (raw) In-Reply-To: <20190917181233.534-1-ben.dooks@codethink.co.uk> From: Edward Cragg <edward.cragg@codethink.co.uk> The CIF configuration and clock setting is currently hard coded for 2 channels. Since the hardware is capable of supporting 1-8 channels add support for reading the channel count from the supplied parameters to allow for better TDM support. It seems the original implementation of this driver was fixed at 2 channels for simplicity, and not implementing TDM. Signed-off-by: Edward Cragg <edward.cragg@codethink.co.uk> [ben.dooks@codethink.co.uk: added is_tdm and channel nr check] --- sound/soc/tegra/tegra30_i2s.c | 21 +++++++++++++-------- sound/soc/tegra/tegra30_i2s.h | 1 + 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/sound/soc/tegra/tegra30_i2s.c b/sound/soc/tegra/tegra30_i2s.c index b5372839f672..40bcc05a9dbb 100644 --- a/sound/soc/tegra/tegra30_i2s.c +++ b/sound/soc/tegra/tegra30_i2s.c @@ -86,14 +86,17 @@ static int tegra30_i2s_set_fmt(struct snd_soc_dai *dai, return -EINVAL; } + i2s->is_tdm = false; mask |= TEGRA30_I2S_CTRL_FRAME_FORMAT_MASK | TEGRA30_I2S_CTRL_LRCK_MASK; switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_DSP_A: + i2s->is_tdm = true; val |= TEGRA30_I2S_CTRL_FRAME_FORMAT_FSYNC; val |= TEGRA30_I2S_CTRL_LRCK_L_LOW; break; case SND_SOC_DAIFMT_DSP_B: + i2s->is_tdm = true; val |= TEGRA30_I2S_CTRL_FRAME_FORMAT_FSYNC; val |= TEGRA30_I2S_CTRL_LRCK_R_LOW; break; @@ -127,10 +130,13 @@ static int tegra30_i2s_hw_params(struct snd_pcm_substream *substream, struct device *dev = dai->dev; struct tegra30_i2s *i2s = snd_soc_dai_get_drvdata(dai); unsigned int mask, val, reg; - int ret, sample_size, srate, i2sclock, bitcnt, audio_bits; + int ret, sample_size, srate, i2sclock, bitcnt, audio_bits, channels; struct tegra30_ahub_cif_conf cif_conf; - if (params_channels(params) != 2) + channels = params_channels(params); + if (channels > 8) + return -EINVAL; + if (channels != 2 && !i2s->is_tdm) return -EINVAL; mask = TEGRA30_I2S_CTRL_BIT_SIZE_MASK; @@ -157,9 +163,8 @@ static int tegra30_i2s_hw_params(struct snd_pcm_substream *substream, regmap_update_bits(i2s->regmap, TEGRA30_I2S_CTRL, mask, val); srate = params_rate(params); - /* Final "* 2" required by Tegra hardware */ - i2sclock = srate * params_channels(params) * sample_size * 2; + i2sclock = srate * channels * sample_size * 2; bitcnt = (i2sclock / (2 * srate)) - 1; if (bitcnt < 0 || bitcnt > TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US) @@ -179,8 +184,8 @@ static int tegra30_i2s_hw_params(struct snd_pcm_substream *substream, regmap_write(i2s->regmap, TEGRA30_I2S_TIMING, val); cif_conf.threshold = 0; - cif_conf.audio_channels = 2; - cif_conf.client_channels = 2; + cif_conf.audio_channels = channels; + cif_conf.client_channels = channels; cif_conf.audio_bits = audio_bits; cif_conf.client_bits = audio_bits; cif_conf.expand = 0; @@ -319,7 +324,7 @@ static const struct snd_soc_dai_driver tegra30_i2s_dai_template = { .playback = { .stream_name = "Playback", .channels_min = 2, - .channels_max = 2, + .channels_max = 8, .rates = SNDRV_PCM_RATE_8000_96000, .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S24_LE | @@ -328,7 +333,7 @@ static const struct snd_soc_dai_driver tegra30_i2s_dai_template = { .capture = { .stream_name = "Capture", .channels_min = 2, - .channels_max = 2, + .channels_max = 8, .rates = SNDRV_PCM_RATE_8000_96000, .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S24_LE | diff --git a/sound/soc/tegra/tegra30_i2s.h b/sound/soc/tegra/tegra30_i2s.h index 0b1f3125a7c0..ae30e3c96337 100644 --- a/sound/soc/tegra/tegra30_i2s.h +++ b/sound/soc/tegra/tegra30_i2s.h @@ -224,6 +224,7 @@ struct tegra30_i2s { const struct tegra30_i2s_soc_data *soc_data; struct snd_soc_dai_driver dai; int cif_id; + bool is_tdm; struct clk *clk_i2s; enum tegra30_ahub_txcif capture_i2s_cif; enum tegra30_ahub_rxcif capture_fifo_cif; -- 2.23.0 _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org https://mailman.alsa-project.org/mailman/listinfo/alsa-devel
next prev parent reply other threads:[~2019-09-17 18:12 UTC|newest] Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-09-17 18:12 RFC: TDM mode support on the tegra30 Ben Dooks 2019-09-17 18:12 ` [alsa-devel] " Ben Dooks 2019-09-17 18:12 ` [PATCH 1/8] ASoC: tegra: Add a TDM configuration callback Ben Dooks 2019-09-17 18:12 ` [alsa-devel] " Ben Dooks 2019-09-17 18:22 ` Pierre-Louis Bossart 2019-09-17 18:22 ` [alsa-devel] " Pierre-Louis Bossart 2019-09-18 8:42 ` Jon Hunter 2019-09-18 8:42 ` [alsa-devel] " Jon Hunter 2019-09-18 10:11 ` Ben Dooks 2019-09-18 10:11 ` [alsa-devel] " Ben Dooks 2019-09-18 10:25 ` Jon Hunter 2019-09-18 10:25 ` [alsa-devel] " Jon Hunter 2019-09-18 10:48 ` Mark Brown 2019-09-18 10:48 ` [alsa-devel] " Mark Brown 2019-09-18 11:44 ` Ben Dooks 2019-09-18 11:44 ` [alsa-devel] " Ben Dooks 2019-09-18 13:33 ` Pierre-Louis Bossart 2019-09-18 13:33 ` [alsa-devel] " Pierre-Louis Bossart 2019-09-18 15:02 ` Mark Brown 2019-09-18 15:02 ` [alsa-devel] " Mark Brown 2019-09-17 18:12 ` [PATCH 2/8] ASoC: tegra: Allow 24bit and 32bit samples Ben Dooks 2019-09-17 18:12 ` [alsa-devel] " Ben Dooks 2019-09-17 18:26 ` Pierre-Louis Bossart 2019-09-17 18:26 ` [alsa-devel] " Pierre-Louis Bossart 2019-09-18 7:44 ` Ben Dooks 2019-09-18 7:44 ` [alsa-devel] " Ben Dooks 2019-09-18 10:08 ` Mark Brown 2019-09-18 10:08 ` [alsa-devel] " Mark Brown 2019-09-18 11:50 ` Ben Dooks 2019-09-18 11:50 ` [alsa-devel] " Ben Dooks 2019-09-18 12:05 ` Mark Brown 2019-09-18 12:05 ` [alsa-devel] " Mark Brown 2019-09-17 18:12 ` Ben Dooks [this message] 2019-09-17 18:12 ` [alsa-devel] [PATCH 3/8] ASoC: tegra: i2s: Add support for more than 2 channels Ben Dooks 2019-09-18 8:50 ` Jon Hunter 2019-09-18 8:50 ` [alsa-devel] " Jon Hunter 2019-09-18 10:12 ` Ben Dooks 2019-09-18 10:12 ` [alsa-devel] " Ben Dooks 2019-09-17 18:12 ` [PATCH 4/8] ASoC: tegra: disable rx_fifo after disable stream Ben Dooks 2019-09-17 18:12 ` [alsa-devel] " Ben Dooks 2019-09-17 18:12 ` [PATCH 5/8] ASoC: tegra: set edge mode for TDM correctly Ben Dooks 2019-09-17 18:12 ` [alsa-devel] " Ben Dooks 2019-09-17 19:33 ` kbuild test robot 2019-09-17 19:33 ` [alsa-devel] " kbuild test robot 2019-09-18 8:54 ` Jon Hunter 2019-09-18 8:54 ` [alsa-devel] " Jon Hunter 2019-09-18 9:02 ` Jon Hunter 2019-09-18 9:02 ` [alsa-devel] " Jon Hunter 2019-09-18 10:15 ` Ben Dooks 2019-09-18 10:15 ` [alsa-devel] " Ben Dooks 2019-09-17 18:12 ` [PATCH 6/8] ASoC: tegra: set i2s_offset to 0 for tdm Ben Dooks 2019-09-17 18:12 ` [alsa-devel] " Ben Dooks 2019-09-18 9:02 ` Jon Hunter 2019-09-18 9:02 ` [alsa-devel] " Jon Hunter 2019-09-18 11:30 ` Ben Dooks 2019-09-18 11:30 ` [alsa-devel] " Ben Dooks 2019-09-17 18:12 ` [PATCH 7/8] ASoC: tegra: config fifos on hw_param changes Ben Dooks 2019-09-17 18:12 ` [alsa-devel] " Ben Dooks 2019-09-18 9:14 ` Jon Hunter 2019-09-18 9:14 ` [alsa-devel] " Jon Hunter 2019-09-18 11:41 ` Ben Dooks 2019-09-18 11:41 ` [alsa-devel] " Ben Dooks 2019-09-17 18:12 ` [PATCH 8/8] ASoC: tegra: take packing settings from the audio cif_config Ben Dooks 2019-09-17 18:12 ` [alsa-devel] " Ben Dooks 2019-09-18 9:16 ` Jon Hunter 2019-09-18 9:16 ` [alsa-devel] " Jon Hunter 2019-09-18 10:02 ` Sameer Pujar 2019-09-18 10:02 ` [alsa-devel] " Sameer Pujar
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190917181233.534-4-ben.dooks@codethink.co.uk \ --to=ben.dooks@codethink.co.uk \ --cc=alsa-devel@alsa-project.org \ --cc=broonie@kernel.org \ --cc=edward.cragg@codethink.co.uk \ --cc=jonathanh@nvidia.com \ --cc=lgirdwood@gmail.com \ --cc=linux-kernel@lists.codethink.co.uk \ --cc=linux-tegra@vger.kernel.org \ --cc=perex@perex.cz \ --cc=thierry.reding@gmail.com \ --cc=tiwai@suse.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.