From nobody Tue Feb 10 10:54:56 2026 Received: from mail-ed1-f43.google.com (mail-ed1-f43.google.com [209.85.208.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 12DDF33F8CF for ; Wed, 12 Nov 2025 15:41:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762962093; cv=none; b=A3YnsJXPvgyZhW1kYq9iF0LXSzkEtseIrLPI9qwSWutQp78V4JNSBCLQc2XUaX4cyzLIZEfUsisXImY7AkUnzYXIcJTdHHaaiNuXtGAKz0bT6Q7Dfl2+ONanG/GVegYE1mstGT+GfjfmkLNFb9hhSUmmPoaE8N+BooH+DGNOiVM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762962093; c=relaxed/simple; bh=T35+cYLS7/MVLQYR3L4zZ3jVtXxwtTE09atiMIdrc8g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Fzh/UX5v1Er5PqOKg2Tz8AbM8Hk3t77veb2h2r5O4A7pQg6I2NrLlhDQtf1a/9AJOM3Z8+cm9D4mf1PsyHaRbXwMirCNmApusmxrHLr4NToNQfDUbFjKOBN7SNZGBw2mpkHch+XOTnNJ6dUk9JfEYhTGT5JwwYPm/j052/7RIUQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=VCfySJkf; arc=none smtp.client-ip=209.85.208.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="VCfySJkf" Received: by mail-ed1-f43.google.com with SMTP id 4fb4d7f45d1cf-64088c6b309so1562388a12.0 for ; Wed, 12 Nov 2025 07:41:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762962089; x=1763566889; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=4XTTxnEs3Raq/piGJ6Bf3ZQhcim/5IOYY6Is9ElUM8U=; b=VCfySJkfaF4H1SuLHBZ6uZUs7y1y5ShqS5KINQ0QKt0AjekuJSsU+srHLQF/BL40Sa YxwJI9GFXHTkWadOZXgJDfD87PonrTHnEMqBnWeRERVYA4gdGN1PBeYo9xU8te9pcSJg OD/gDp+rzw4rU3pHzzq0+JhlmUx5PQYOVyWCOnawFK5LcWdSP05rudAP6CFvBC2YIepT MVOyNzraMkvHAAUX6Q0YMqB3fkYmVcJqM97197mBhZgqOwyE8FGN24KdCq/BM/ykNoK6 +LcMvTkt30Id8NEQbyBVKRRH8weJhIdjJRlwzEUs7J2Bp3q2L8i4ZHHbzz40qv49G0oZ sAgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762962089; x=1763566889; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=4XTTxnEs3Raq/piGJ6Bf3ZQhcim/5IOYY6Is9ElUM8U=; b=suX7wIVyH2IUJGdOzHXFyNyU+iydIif2J+0iR3c4bq5JnpALJbicMUXkL6FwtSJ4p4 yMeu9HrE2vm9jcvGR5DjRcy+1/ZitI+3fXjwFUKBgxan01pV5JhYy7UN4iABqMbQAPnK HN8yvDWeD4WkWkTgsAQ16aQVOcP9FuxwNBsChJsV+43IpZ/EtAWfBD6MZ8BXvi7SVDz3 YLOdLk/p+lJpzKXR1A05WLAm6BIrBekBbdtAnu1b47paiENBW5hO20/ZgdlW/Q52Kecr uBwt4dei7XFR1VbP+ZOgvb2dyXazakScjVAeimTGmqEGUYoA/RoacKysmGea/zqC/uCg R82A== X-Forwarded-Encrypted: i=1; AJvYcCWm27HjnDmmaUymJOa2W9MeVwUvfGvqGuJxn+ZPNDtSC9YaTZXaimiNRpbof0tPURQPFD7yeZKCgzrtqdw=@vger.kernel.org X-Gm-Message-State: AOJu0Yx0csel65SH4jdxKNqE6198A089ssOkRePlb93Xg6Mka9wSN5Lp 0JxwoPMplsHfrvYBuk5rR7Zm7MTztwnAqMdH6eZLqXGI+zst+Ul1zkNJ X-Gm-Gg: ASbGncst7HhWAUF0A2cXepCXS6JHeqRjbTEKNy8fR1U3QHS1sOogz9WlLf0kpjVpPi6 om2SJbEwAFIn5baNx6wogsiMsecoUNcZ/tW+iT9v+OnSMutyMFx037eW+Nt3jBvwCzjt3K0b+WY leEmz8OrrLYHvK/V/2dkPbuBQ2gDYKTFPRt6DDDJ2giItHdf/h+bjzNYPoE8y0wJ6Zgmf+ld+8o fIw7cNU+8dGumZqSw/DcskBpm/R15/JLcoh3nUAC+cvHIJU1BikaVqhobpT2S5EWHDmPCT1w0T7 PV2xy4N3LnBWOR8V4x5+eEXk5SBSxnyzgY8hmRnrBZPu/6G3TfUK8nvjy1DVtkqydndpuKelIFr qPyWi7z2MdBA3bQ/vTC4FeJGLjzc1m0KQJEExV4VHXxpjcE2u+9KBPG2QBRvnBUMhURmMIDpmok 7ZSnveu1tMAV+pOuUdyQ0aW7anE96jdFQWpe8XNXf8HvnKzi/N8j+uDdigOw8LyauUudjVa2Xh0 H/gVA== X-Google-Smtp-Source: AGHT+IGcT9Q73iX6iO06eyvMeqFfiaMCp9upzjhrl6xZANlRXTJ6HWG9Es1iaU+beLhBFmY+7jsDbw== X-Received: by 2002:a17:907:849:b0:b72:aa52:6034 with SMTP id a640c23a62f3a-b7331971161mr407545166b.21.1762962089077; Wed, 12 Nov 2025 07:41:29 -0800 (PST) Received: from localhost.localdomain (host86-162-200-138.range86-162.btcentralplus.com. [86.162.200.138]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b72bf97d456sm1670023566b.39.2025.11.12.07.41.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 12 Nov 2025 07:41:28 -0800 (PST) From: Biju X-Google-Original-From: Biju To: Biju Das , Lad Prabhakar , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: linux-sound@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven , Biju Das Subject: [PATCH 6/7] ASoC: renesas: rz-ssi: Add support for 24 bits sample width Date: Wed, 12 Nov 2025 15:41:07 +0000 Message-ID: <20251112154115.1048298-7-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251112154115.1048298-1-biju.das.jz@bp.renesas.com> References: <20251112154115.1048298-1-biju.das.jz@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Biju Das Add support for 24 bits sample format width for RZ/G2L SoCs. Signed-off-by: Biju Das --- sound/soc/renesas/rz-ssi.c | 76 +++++++++++++++++++++++++++++--------- 1 file changed, 58 insertions(+), 18 deletions(-) diff --git a/sound/soc/renesas/rz-ssi.c b/sound/soc/renesas/rz-ssi.c index 839934e4b76a..5ebaaa440141 100644 --- a/sound/soc/renesas/rz-ssi.c +++ b/sound/soc/renesas/rz-ssi.c @@ -38,6 +38,7 @@ #define SSICR_MST BIT(14) #define SSICR_BCKP BIT(13) #define SSICR_LRCKP BIT(12) +#define SSICR_PDTA BIT(9) #define SSICR_CKDV(x) (((x) & 0xf) << 4) #define SSICR_TEN BIT(1) #define SSICR_REN BIT(0) @@ -74,7 +75,7 @@ #define PREALLOC_BUFFER_MAX (SZ_32K) =20 #define SSI_RATES SNDRV_PCM_RATE_8000_48000 /* 8k-48kHz */ -#define SSI_FMTS SNDRV_PCM_FMTBIT_S16_LE +#define SSI_FMTS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE) #define SSI_CHAN_MIN 2 #define SSI_CHAN_MAX 2 #define SSI_FIFO_DEPTH 32 @@ -294,11 +295,25 @@ static int rz_ssi_clk_setup(struct rz_ssi_priv *ssi, = unsigned int rate, } =20 /* - * DWL: Data Word Length =3D 16 bits + * DWL: Data Word Length =3D {16, 24} bits * SWL: System Word Length =3D 32 bits */ ssicr |=3D SSICR_CKDV(clk_ckdv); - ssicr |=3D SSICR_DWL(1) | SSICR_SWL(3); + switch (ssi->hw_params_cache.sample_width) { + case 16: + ssicr |=3D SSICR_DWL(1); + break; + case 24: + ssicr |=3D SSICR_PDTA; + ssicr |=3D SSICR_DWL(5); + break; + default: + dev_err(ssi->dev, "Not support %u data width", + ssi->hw_params_cache.sample_width); + return -EINVAL; + } + + ssicr |=3D SSICR_SWL(3); rz_ssi_reg_writel(ssi, SSICR, ssicr); rz_ssi_reg_writel(ssi, SSIFCR, SSIFCR_AUCKE | SSIFCR_FIFO_RST); =20 @@ -459,7 +474,6 @@ static int rz_ssi_pio_recv(struct rz_ssi_priv *ssi, str= uct rz_ssi_stream *strm) { struct snd_pcm_substream *substream =3D strm->substream; struct snd_pcm_runtime *runtime; - u16 *buf; int fifo_samples; int frames_left; int samples; @@ -494,12 +508,23 @@ static int rz_ssi_pio_recv(struct rz_ssi_priv *ssi, s= truct rz_ssi_stream *strm) break; =20 /* calculate new buffer index */ - buf =3D (u16 *)runtime->dma_area; - buf +=3D strm->buffer_pos * runtime->channels; + if (ssi->hw_params_cache.sample_width =3D=3D 16) { + u16 *buf; =20 - /* Note, only supports 16-bit samples */ - for (i =3D 0; i < samples; i++) - *buf++ =3D (u16)(rz_ssi_reg_readl(ssi, SSIFRDR) >> 16); + buf =3D (u16 *)runtime->dma_area; + buf +=3D strm->buffer_pos * runtime->channels; + + for (i =3D 0; i < samples; i++) + *buf++ =3D (u16)(rz_ssi_reg_readl(ssi, SSIFRDR) >> 16); + } else { + u32 *buf; + + buf =3D (u32 *)runtime->dma_area; + buf +=3D strm->buffer_pos * runtime->channels; + + for (i =3D 0; i < samples; i++) + *buf++ =3D rz_ssi_reg_readl(ssi, SSIFRDR); + } =20 rz_ssi_reg_mask_setl(ssi, SSIFSR, SSIFSR_RDF, 0); rz_ssi_pointer_update(strm, samples / runtime->channels); @@ -517,7 +542,6 @@ static int rz_ssi_pio_send(struct rz_ssi_priv *ssi, str= uct rz_ssi_stream *strm) int frames_left; int i; u32 ssifsr; - u16 *buf; =20 if (!rz_ssi_stream_is_valid(ssi, strm)) return -EINVAL; @@ -546,12 +570,23 @@ static int rz_ssi_pio_send(struct rz_ssi_priv *ssi, s= truct rz_ssi_stream *strm) return 0; =20 /* calculate new buffer index */ - buf =3D (u16 *)(runtime->dma_area); - buf +=3D strm->buffer_pos * runtime->channels; + if (ssi->hw_params_cache.sample_width =3D=3D 16) { + u16 *buf; + + buf =3D (u16 *)(runtime->dma_area); + buf +=3D strm->buffer_pos * runtime->channels; + + for (i =3D 0; i < samples; i++) + rz_ssi_reg_writel(ssi, SSIFTDR, ((u32)(*buf++) << 16)); + } else { + u32 *buf; =20 - /* Note, only supports 16-bit samples */ - for (i =3D 0; i < samples; i++) - rz_ssi_reg_writel(ssi, SSIFTDR, ((u32)(*buf++) << 16)); + buf =3D (u32 *)(runtime->dma_area); + buf +=3D strm->buffer_pos * runtime->channels; + + for (i =3D 0; i < samples; i++) + rz_ssi_reg_writel(ssi, SSIFTDR, *buf++); + } =20 rz_ssi_reg_mask_setl(ssi, SSIFSR, SSIFSR_TDE, 0); rz_ssi_pointer_update(strm, samples / runtime->channels); @@ -662,8 +697,13 @@ static int rz_ssi_dma_slave_config(struct rz_ssi_priv = *ssi, cfg.direction =3D is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM; cfg.dst_addr =3D ssi->phys + SSIFTDR; cfg.src_addr =3D ssi->phys + SSIFRDR; - cfg.src_addr_width =3D DMA_SLAVE_BUSWIDTH_2_BYTES; - cfg.dst_addr_width =3D DMA_SLAVE_BUSWIDTH_2_BYTES; + if (ssi->hw_params_cache.sample_width =3D=3D 24) { + cfg.src_addr_width =3D DMA_SLAVE_BUSWIDTH_4_BYTES; + cfg.dst_addr_width =3D DMA_SLAVE_BUSWIDTH_4_BYTES; + } else { + cfg.src_addr_width =3D DMA_SLAVE_BUSWIDTH_2_BYTES; + cfg.dst_addr_width =3D DMA_SLAVE_BUSWIDTH_2_BYTES; + } =20 return dmaengine_slave_config(dma_ch, &cfg); } @@ -981,7 +1021,7 @@ static int rz_ssi_dai_hw_params(struct snd_pcm_substre= am *substream, unsigned int rate =3D params_rate(params); int ret; =20 - if (sample_bits !=3D 16) { + if (!(sample_bits =3D=3D 16 || sample_bits =3D=3D 24)) { dev_err(ssi->dev, "Unsupported sample width: %d\n", sample_bits); return -EINVAL; --=20 2.43.0