Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp774604imm; Fri, 27 Jul 2018 06:01:13 -0700 (PDT) X-Google-Smtp-Source: AAOMgpdBftB3MLV+XFgVGOLjjBRMY80WzPZGvLyfCayRiDVlTJ6iIvQyx/CL06IRQbM9KHmulQzk X-Received: by 2002:a65:6211:: with SMTP id d17-v6mr6195033pgv.450.1532696473208; Fri, 27 Jul 2018 06:01:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1532696473; cv=none; d=google.com; s=arc-20160816; b=Vb0toVh+yRGSUuM8bvWQPO/g1TpzY3xM7cE5cxpIUpE5qEziGNd2xbYY25Mq9Ppw8K +EvcLmUzSG0udNfOEIMj++ih1/HRiBG6/Ji48Th/6sdyBZwqxx4E2QDhCkd4nYL12oZK BVywvbIyqbb13PDshbAYzEQbTbQgPWTdfCfoi4yJdb8FbKa3YA441zGdRiHkiBog9q2Q uKc7hqW2GoSTCjoVr90HrTnkvcrVL3F/P9zEHr3FPrVMsZW5tpdp1NYCfLH9bLS0ZN6f qWINlwgn70hWQnWC8E0vFmiKPIZGmFpo7S2amacu54t+n/w6/8f4EkvIitxgp29/IjWo h28w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=qYFu/Wv9lQCQNAmN8XrwrG+fADJdw3U2OTNNRPdpLQE=; b=n1Bl+95+VPIyIAqr/j9P/kxi+DagxJ9zTb4hR4WxYqzSst1cpmAc8rOYXOGesQpbyH 52wqoe+gw8xZzHfMenFWzIWKmGihJx/EanE72tQV1WZHXCo08wDKXPdAOlWtO8fIJE4n I9FMPpCrMXddkZXIOXUsT/Zj5hpqJu8mVga8wX3hexnJZrvF0NfAMTYHU4ZZDI9LE0Pc kbGlPJI4v76lIUEMj5SMWdPU+hkJ8kUmvoSoZZUV8S0lQjt6zT8Vay5ubl9eUeha4SYn G9U17KRlgtafGAYlLDKoOi7Rq1Yu1ZiMFJEJ2mxcWcnn0kstP/IhLUO9c71Rsfw48SiH NZ6g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=codethink.co.uk Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p14-v6si4201147pfk.275.2018.07.27.06.00.58; Fri, 27 Jul 2018 06:01:13 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=codethink.co.uk Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388283AbeG0OVa (ORCPT + 99 others); Fri, 27 Jul 2018 10:21:30 -0400 Received: from imap1.codethink.co.uk ([176.9.8.82]:57524 "EHLO imap1.codethink.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732042AbeG0OV3 (ORCPT ); Fri, 27 Jul 2018 10:21:29 -0400 Received: from [148.252.241.226] (helo=ct-lt-1121.office.codethink.co.uk) by imap1.codethink.co.uk with esmtpsa (Exim 4.84_2 #1 (Debian)) id 1fj2LI-0008VU-7A; Fri, 27 Jul 2018 13:59:36 +0100 From: Jorge Sanjuan To: lgirdwood@gmail.com, broonie@kernel.org Cc: jonathanh@nvidia.com, thierry.reding@gmail.com, alsa-devel@alsa-project.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kernel@lists.codethink.co.uk Subject: [PATCH 4/4] ASoC: tegra: i2s: Add support for more than 2 channels Date: Fri, 27 Jul 2018 13:59:31 +0100 Message-Id: <20180727125931.9794-5-jorge.sanjuan@codethink.co.uk> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180727125931.9794-1-jorge.sanjuan@codethink.co.uk> References: <20180727125931.9794-1-jorge.sanjuan@codethink.co.uk> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Edward Cragg 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 Signed-off-by: Jorge Sanjuan --- sound/soc/tegra/tegra30_i2s.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/sound/soc/tegra/tegra30_i2s.c b/sound/soc/tegra/tegra30_i2s.c index e26c19ef7439..0f240d7989d0 100644 --- a/sound/soc/tegra/tegra30_i2s.c +++ b/sound/soc/tegra/tegra30_i2s.c @@ -138,16 +138,17 @@ 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; + int ret, sample_size, srate, i2sclock, bitcnt, audio_bits, channels; struct tegra30_ahub_cif_conf cif_conf; - if (params_channels(params) != 2) + if (params_channels(params) > 8) return -EINVAL; mask = TEGRA30_I2S_CTRL_BIT_SIZE_MASK; switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: val = TEGRA30_I2S_CTRL_BIT_SIZE_16; + audio_bits = TEGRA30_AUDIOCIF_BITS_16; sample_size = 16; break; case SNDRV_PCM_FORMAT_S24_LE: @@ -157,6 +158,7 @@ static int tegra30_i2s_hw_params(struct snd_pcm_substream *substream, break; case SNDRV_PCM_FORMAT_S32_LE: val = TEGRA30_I2S_CTRL_BIT_SIZE_32; + audio_bits = TEGRA30_AUDIOCIF_BITS_32; sample_size = 32; break; default: @@ -166,9 +168,10 @@ 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); + channels = params_channels(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) @@ -188,10 +191,10 @@ 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_bits = TEGRA30_AUDIOCIF_BITS_16; - cif_conf.client_bits = TEGRA30_AUDIOCIF_BITS_16; + 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; cif_conf.stereo_conv = 0; cif_conf.replicate = 0; @@ -329,7 +332,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 | @@ -338,7 +341,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 | -- 2.11.0