[rulkc] [PATCH v1 2/2] ASoC: codecs: ntp8918: calculate bclk using tdm params

Dmitry Rokosov ddrokosov at salutedevices.com
Mon Feb 16 14:10:57 MSK 2026


On Sun, Feb 15, 2026 at 10:29:37PM +0300, Ilias Izmaylov wrote:
> Use a function snd_soc_tdm_params_to_bclk instead of snd_soc_params_to_bclk
> to calculate bclk frequency correctly using frame size, channel period
> and a number of channels
> 
> Since in NTP8918 the word clock and bit clock frequencies are both 64
> bits per period and given that the device has only 2 channels it means
> that the period per channel is equal to 32 bits. Thus to calculate bit
> clock frequency the only other non-constant value that we need is frame
> size (or sample rate)
> 
> Also implemented a set_tdm_slot dai ops callback for ntp8918 codec that will
> ensure that tdm slot width and slot num are set to 32 and 2
> respectively because ntp8918 can only operate in that configuration
> 
> Task: SDFW-10327
> Change-Id: Ic772bd22eb11325a8fb76ad6ae1b770b4540f1b6

Please remove internal task trailers and Change-Id lines.
Before submitting patches to LKML, run checkpatch each time.

> Signed-off-by: Ilias Izmaylov <ikizmaylov at salutedevices.com>
> ---
>  sound/soc/codecs/ntp8918.c | 43 +++++++++++++++++++++++++++++++++++++-
>  1 file changed, 42 insertions(+), 1 deletion(-)
> 
> diff --git a/sound/soc/codecs/ntp8918.c b/sound/soc/codecs/ntp8918.c
> index cc672fd93def4..c37bd5b53ed8a 100644
> --- a/sound/soc/codecs/ntp8918.c
> +++ b/sound/soc/codecs/ntp8918.c
> @@ -32,6 +32,15 @@
>  			     SNDRV_PCM_FMTBIT_S24_LE | \
>  			     SNDRV_PCM_FMTBIT_S32_LE)
>  
> +/*
> + * The NTP8918 word clock (WCK) period is fixed at 64 bits,
> + * and the bit clock (BCK) period is equal to the word clock period.
> + * The interface has only 2 channels, meaning the number of ticks
> + * for both word and bit clocks per channel is 64 / 2 = 32.
> + */
> +#define NTP8918_BCK_CHANNEL_PERIOD		32
> +#define NTP8918_NR_CHANNELS			2
> +
>  #define NTP8918_INPUT_FMT			0x0
>  #define  NTP8918_INPUT_FMT_MASTER_MODE		BIT(0)
>  #define  NTP8918_INPUT_FMT_GSA_MODE		BIT(1)
> @@ -215,7 +224,17 @@ static int ntp8918_hw_params(struct snd_pcm_substream *substream,
>  	int bclk;
>  	int ret;
>  
> -	bclk = snd_soc_params_to_bclk(params);
> +	/*
> +	 * When calculating bit clock frequency the only non-constant
> +	 * input that's needed is sample rate which then needs to be
> +	 * multiplied by constant values of BCK channel period and
> +	 * number of channels.
> +	 */
> +	bclk = snd_soc_tdm_params_to_bclk(params,
> +					  NTP8918_BCK_CHANNEL_PERIOD,
> +					  NTP8918_NR_CHANNELS,
> +					  0);
> +
>  	switch (bclk) {
>  	case 3072000:
>  	case 2822400:
> @@ -313,10 +332,32 @@ static int ntp8918_digital_mute(struct snd_soc_dai *dai, int mute, int stream)
>  	return ret < 0 ? ret : 0;
>  }
>  
> +static int ntp8918_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
> +				unsigned int rx_mask, int slots,
> +				int slot_width)
> +{
> +	if (slots != NTP8918_NR_CHANNELS) {
> +		dev_err(dai->component->dev,
> +			"Unsupported number of TDM slots %d, should be %d\n",
> +			slots, NTP8918_NR_CHANNELS);
> +		return -EINVAL;
> +	}
> +
> +	if (slot_width != NTP8918_BCK_CHANNEL_PERIOD) {
> +		dev_err(dai->component->dev,
> +			"Unsupported TDM slot width %d, should be %d\n",
> +			slot_width, NTP8918_BCK_CHANNEL_PERIOD);
> +		return -EINVAL;
> +	}
> +
> +	return 0;
> +}
> +
>  static const struct snd_soc_dai_ops ntp8918_dai_ops = {
>  	.hw_params = ntp8918_hw_params,
>  	.set_fmt = ntp8918_set_fmt,
>  	.mute_stream = ntp8918_digital_mute,
> +	.set_tdm_slot = ntp8918_set_tdm_slot,
>  };
>  
>  static struct snd_soc_dai_driver ntp8918_dai = {
> -- 
> 2.47.3
> 

-- 
Thank you,
Dmitry



More information about the rulkc mailing list