All of lore.kernel.org
 help / color / mirror / Atom feed
From: Maxime Ripard <maxime@cerno.tech>
To: "Clément Péron" <peron.clem@gmail.com>
Cc: Chen-Yu Tsai <wens@csie.org>, Rob Herring <robh+dt@kernel.org>,
	Mark Brown <broonie@kernel.org>,
	Liam Girdwood <lgirdwood@gmail.com>,
	Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.com>,
	Marcus Cooper <codekipper@gmail.com>,
	Jernej Skrabec <jernej.skrabec@siol.net>,
	Linux-ALSA <alsa-devel@alsa-project.org>,
	devicetree <devicetree@vger.kernel.org>,
	linux-arm-kernel <linux-arm-kernel@lists.infradead.org>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	linux-sunxi <linux-sunxi@googlegroups.com>,
	Samuel Holland <samuel@sholland.org>
Subject: Re: [PATCH v6 02/14] ASoC: sun4i-i2s: Change set_chan_cfg() params
Date: Mon, 12 Oct 2020 14:15:36 +0200	[thread overview]
Message-ID: <20201012121536.z5d7kecdxaabw35n@gilmour.lan> (raw)
In-Reply-To: <CAJiuCcdd6_kzsxEERZbj2Budjmuyv6gV_sPG8LjLY=fk+MO8zQ@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 6752 bytes --]

Hi,

On Mon, Oct 05, 2020 at 03:23:12PM +0200, Clément Péron wrote:
> On Mon, 5 Oct 2020 at 14:13, Maxime Ripard <maxime@cerno.tech> wrote:
> >
> > On Sat, Oct 03, 2020 at 04:19:38PM +0200, Clément Péron wrote:
> > > As slots and slot_width can be set manually using set_tdm().
> > > These values are then kept in sun4i_i2s struct.
> > > So we need to check if these values are setted or not
> > > in the struct.
> > >
> > > Avoid to check for this logic in set_chan_cfg(). This will
> > > duplicate the same check instead pass the required values
> > > as params to set_chan_cfg().
> > >
> > > This will also avoid a bug when we will enable 20/24bits support,
> > > i2s->slot_width is not actually used in the lrck_period computation.
> > >
> > > Suggested-by: Samuel Holland <samuel@sholland.org>
> > > Signed-off-by: Clément Péron <peron.clem@gmail.com>
> > > ---
> > >  sound/soc/sunxi/sun4i-i2s.c | 36 ++++++++++++++----------------------
> > >  1 file changed, 14 insertions(+), 22 deletions(-)
> > >
> > > diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c
> > > index c5ccd423e6d3..1f577dbc20a6 100644
> > > --- a/sound/soc/sunxi/sun4i-i2s.c
> > > +++ b/sound/soc/sunxi/sun4i-i2s.c
> > > @@ -177,8 +177,9 @@ struct sun4i_i2s_quirks {
> > >       unsigned long (*get_bclk_parent_rate)(const struct sun4i_i2s *);
> > >       s8      (*get_sr)(const struct sun4i_i2s *, int);
> > >       s8      (*get_wss)(const struct sun4i_i2s *, int);
> > > -     int     (*set_chan_cfg)(const struct sun4i_i2s *,
> > > -                             const struct snd_pcm_hw_params *);
> > > +     int     (*set_chan_cfg)(const struct sun4i_i2s *i2s,
> > > +                             unsigned int channels,  unsigned int slots,
> > > +                             unsigned int slot_width);
> > >       int     (*set_fmt)(const struct sun4i_i2s *, unsigned int);
> > >  };
> > >
> > > @@ -414,10 +415,9 @@ static s8 sun8i_i2s_get_sr_wss(const struct sun4i_i2s *i2s, int width)
> > >  }
> > >
> > >  static int sun4i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > > -                               const struct snd_pcm_hw_params *params)
> > > +                               unsigned int channels, unsigned int slots,
> > > +                               unsigned int slot_width)
> > >  {
> > > -     unsigned int channels = params_channels(params);
> > > -
> > >       /* Map the channels for playback and capture */
> > >       regmap_write(i2s->regmap, SUN4I_I2S_TX_CHAN_MAP_REG, 0x76543210);
> > >       regmap_write(i2s->regmap, SUN4I_I2S_RX_CHAN_MAP_REG, 0x00003210);
> > > @@ -434,15 +434,11 @@ static int sun4i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > >  }
> > >
> > >  static int sun8i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > > -                               const struct snd_pcm_hw_params *params)
> > > +                               unsigned int channels, unsigned int slots,
> > > +                               unsigned int slot_width)
> > >  {
> > > -     unsigned int channels = params_channels(params);
> > > -     unsigned int slots = channels;
> > >       unsigned int lrck_period;
> > >
> > > -     if (i2s->slots)
> > > -             slots = i2s->slots;
> > > -
> > >       /* Map the channels for playback and capture */
> > >       regmap_write(i2s->regmap, SUN8I_I2S_TX_CHAN_MAP_REG, 0x76543210);
> > >       regmap_write(i2s->regmap, SUN8I_I2S_RX_CHAN_MAP_REG, 0x76543210);
> > > @@ -467,11 +463,11 @@ static int sun8i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > >       case SND_SOC_DAIFMT_DSP_B:
> > >       case SND_SOC_DAIFMT_LEFT_J:
> > >       case SND_SOC_DAIFMT_RIGHT_J:
> > > -             lrck_period = params_physical_width(params) * slots;
> > > +             lrck_period = slot_width * slots;
> > >               break;
> > >
> > >       case SND_SOC_DAIFMT_I2S:
> > > -             lrck_period = params_physical_width(params);
> > > +             lrck_period = slot_width;
> > >               break;
> > >
> > >       default:
> > > @@ -490,15 +486,11 @@ static int sun8i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > >  }
> > >
> > >  static int sun50i_h6_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > > -                                   const struct snd_pcm_hw_params *params)
> > > +                                   unsigned int channels, unsigned int slots,
> > > +                                   unsigned int slot_width)
> > >  {
> > > -     unsigned int channels = params_channels(params);
> > > -     unsigned int slots = channels;
> > >       unsigned int lrck_period;
> > >
> > > -     if (i2s->slots)
> > > -             slots = i2s->slots;
> > > -
> > >       /* Map the channels for playback and capture */
> > >       regmap_write(i2s->regmap, SUN50I_H6_I2S_TX_CHAN_MAP0_REG, 0xFEDCBA98);
> > >       regmap_write(i2s->regmap, SUN50I_H6_I2S_TX_CHAN_MAP1_REG, 0x76543210);
> > > @@ -525,11 +517,11 @@ static int sun50i_h6_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > >       case SND_SOC_DAIFMT_DSP_B:
> > >       case SND_SOC_DAIFMT_LEFT_J:
> > >       case SND_SOC_DAIFMT_RIGHT_J:
> > > -             lrck_period = params_physical_width(params) * slots;
> > > +             lrck_period = slot_width * slots;
> > >               break;
> > >
> > >       case SND_SOC_DAIFMT_I2S:
> > > -             lrck_period = params_physical_width(params);
> > > +             lrck_period = slot_width;
> > >               break;
> > >
> > >       default:
> > > @@ -565,7 +557,7 @@ static int sun4i_i2s_hw_params(struct snd_pcm_substream *substream,
> > >       if (i2s->slot_width)
> > >               slot_width = i2s->slot_width;
> > >
> > > -     ret = i2s->variant->set_chan_cfg(i2s, params);
> > > +     ret = i2s->variant->set_chan_cfg(i2s, channels, slots, slot_width);
> >
> > Isn't slots and slot_width set to 0 here ?
> 
> No, there is still a check before calling the set_cfg function.
> 
>   unsigned int slot_width = params_physical_width(params);
>   unsigned int channels = params_channels(params);
>   unsigned int slots = channels;
> 
>   if (i2s->slots)
>   slots = i2s->slots;
> 
>   if (i2s->slot_width)
>   slot_width = i2s->slot_width;
> 
> ret = i2s->variant->set_chan_cfg(i2s, channels, slots, slot_width);
> 
> So slot_width will be equal to params_physical_width(params);
> like before

Still, it's not obvious what slots and slot_width are going to be set to
in a non-TDM setup where that doesn't really make much sense.

I assume you want to reduce the boilerplate, then we can make an helper
to get the frame size and the number of channels / slots if needed

Maxime

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

WARNING: multiple messages have this Message-ID (diff)
From: Maxime Ripard <maxime@cerno.tech>
To: "Clément Péron" <peron.clem@gmail.com>
Cc: devicetree <devicetree@vger.kernel.org>,
	Jernej Skrabec <jernej.skrabec@siol.net>,
	Linux-ALSA <alsa-devel@alsa-project.org>,
	Liam Girdwood <lgirdwood@gmail.com>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	Mark Brown <broonie@kernel.org>,
	linux-sunxi <linux-sunxi@googlegroups.com>,
	Takashi Iwai <tiwai@suse.com>,
	Marcus Cooper <codekipper@gmail.com>,
	Chen-Yu Tsai <wens@csie.org>, Rob Herring <robh+dt@kernel.org>,
	Samuel Holland <samuel@sholland.org>,
	linux-arm-kernel <linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH v6 02/14] ASoC: sun4i-i2s: Change set_chan_cfg() params
Date: Mon, 12 Oct 2020 14:15:36 +0200	[thread overview]
Message-ID: <20201012121536.z5d7kecdxaabw35n@gilmour.lan> (raw)
In-Reply-To: <CAJiuCcdd6_kzsxEERZbj2Budjmuyv6gV_sPG8LjLY=fk+MO8zQ@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 6752 bytes --]

Hi,

On Mon, Oct 05, 2020 at 03:23:12PM +0200, Clément Péron wrote:
> On Mon, 5 Oct 2020 at 14:13, Maxime Ripard <maxime@cerno.tech> wrote:
> >
> > On Sat, Oct 03, 2020 at 04:19:38PM +0200, Clément Péron wrote:
> > > As slots and slot_width can be set manually using set_tdm().
> > > These values are then kept in sun4i_i2s struct.
> > > So we need to check if these values are setted or not
> > > in the struct.
> > >
> > > Avoid to check for this logic in set_chan_cfg(). This will
> > > duplicate the same check instead pass the required values
> > > as params to set_chan_cfg().
> > >
> > > This will also avoid a bug when we will enable 20/24bits support,
> > > i2s->slot_width is not actually used in the lrck_period computation.
> > >
> > > Suggested-by: Samuel Holland <samuel@sholland.org>
> > > Signed-off-by: Clément Péron <peron.clem@gmail.com>
> > > ---
> > >  sound/soc/sunxi/sun4i-i2s.c | 36 ++++++++++++++----------------------
> > >  1 file changed, 14 insertions(+), 22 deletions(-)
> > >
> > > diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c
> > > index c5ccd423e6d3..1f577dbc20a6 100644
> > > --- a/sound/soc/sunxi/sun4i-i2s.c
> > > +++ b/sound/soc/sunxi/sun4i-i2s.c
> > > @@ -177,8 +177,9 @@ struct sun4i_i2s_quirks {
> > >       unsigned long (*get_bclk_parent_rate)(const struct sun4i_i2s *);
> > >       s8      (*get_sr)(const struct sun4i_i2s *, int);
> > >       s8      (*get_wss)(const struct sun4i_i2s *, int);
> > > -     int     (*set_chan_cfg)(const struct sun4i_i2s *,
> > > -                             const struct snd_pcm_hw_params *);
> > > +     int     (*set_chan_cfg)(const struct sun4i_i2s *i2s,
> > > +                             unsigned int channels,  unsigned int slots,
> > > +                             unsigned int slot_width);
> > >       int     (*set_fmt)(const struct sun4i_i2s *, unsigned int);
> > >  };
> > >
> > > @@ -414,10 +415,9 @@ static s8 sun8i_i2s_get_sr_wss(const struct sun4i_i2s *i2s, int width)
> > >  }
> > >
> > >  static int sun4i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > > -                               const struct snd_pcm_hw_params *params)
> > > +                               unsigned int channels, unsigned int slots,
> > > +                               unsigned int slot_width)
> > >  {
> > > -     unsigned int channels = params_channels(params);
> > > -
> > >       /* Map the channels for playback and capture */
> > >       regmap_write(i2s->regmap, SUN4I_I2S_TX_CHAN_MAP_REG, 0x76543210);
> > >       regmap_write(i2s->regmap, SUN4I_I2S_RX_CHAN_MAP_REG, 0x00003210);
> > > @@ -434,15 +434,11 @@ static int sun4i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > >  }
> > >
> > >  static int sun8i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > > -                               const struct snd_pcm_hw_params *params)
> > > +                               unsigned int channels, unsigned int slots,
> > > +                               unsigned int slot_width)
> > >  {
> > > -     unsigned int channels = params_channels(params);
> > > -     unsigned int slots = channels;
> > >       unsigned int lrck_period;
> > >
> > > -     if (i2s->slots)
> > > -             slots = i2s->slots;
> > > -
> > >       /* Map the channels for playback and capture */
> > >       regmap_write(i2s->regmap, SUN8I_I2S_TX_CHAN_MAP_REG, 0x76543210);
> > >       regmap_write(i2s->regmap, SUN8I_I2S_RX_CHAN_MAP_REG, 0x76543210);
> > > @@ -467,11 +463,11 @@ static int sun8i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > >       case SND_SOC_DAIFMT_DSP_B:
> > >       case SND_SOC_DAIFMT_LEFT_J:
> > >       case SND_SOC_DAIFMT_RIGHT_J:
> > > -             lrck_period = params_physical_width(params) * slots;
> > > +             lrck_period = slot_width * slots;
> > >               break;
> > >
> > >       case SND_SOC_DAIFMT_I2S:
> > > -             lrck_period = params_physical_width(params);
> > > +             lrck_period = slot_width;
> > >               break;
> > >
> > >       default:
> > > @@ -490,15 +486,11 @@ static int sun8i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > >  }
> > >
> > >  static int sun50i_h6_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > > -                                   const struct snd_pcm_hw_params *params)
> > > +                                   unsigned int channels, unsigned int slots,
> > > +                                   unsigned int slot_width)
> > >  {
> > > -     unsigned int channels = params_channels(params);
> > > -     unsigned int slots = channels;
> > >       unsigned int lrck_period;
> > >
> > > -     if (i2s->slots)
> > > -             slots = i2s->slots;
> > > -
> > >       /* Map the channels for playback and capture */
> > >       regmap_write(i2s->regmap, SUN50I_H6_I2S_TX_CHAN_MAP0_REG, 0xFEDCBA98);
> > >       regmap_write(i2s->regmap, SUN50I_H6_I2S_TX_CHAN_MAP1_REG, 0x76543210);
> > > @@ -525,11 +517,11 @@ static int sun50i_h6_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > >       case SND_SOC_DAIFMT_DSP_B:
> > >       case SND_SOC_DAIFMT_LEFT_J:
> > >       case SND_SOC_DAIFMT_RIGHT_J:
> > > -             lrck_period = params_physical_width(params) * slots;
> > > +             lrck_period = slot_width * slots;
> > >               break;
> > >
> > >       case SND_SOC_DAIFMT_I2S:
> > > -             lrck_period = params_physical_width(params);
> > > +             lrck_period = slot_width;
> > >               break;
> > >
> > >       default:
> > > @@ -565,7 +557,7 @@ static int sun4i_i2s_hw_params(struct snd_pcm_substream *substream,
> > >       if (i2s->slot_width)
> > >               slot_width = i2s->slot_width;
> > >
> > > -     ret = i2s->variant->set_chan_cfg(i2s, params);
> > > +     ret = i2s->variant->set_chan_cfg(i2s, channels, slots, slot_width);
> >
> > Isn't slots and slot_width set to 0 here ?
> 
> No, there is still a check before calling the set_cfg function.
> 
>   unsigned int slot_width = params_physical_width(params);
>   unsigned int channels = params_channels(params);
>   unsigned int slots = channels;
> 
>   if (i2s->slots)
>   slots = i2s->slots;
> 
>   if (i2s->slot_width)
>   slot_width = i2s->slot_width;
> 
> ret = i2s->variant->set_chan_cfg(i2s, channels, slots, slot_width);
> 
> So slot_width will be equal to params_physical_width(params);
> like before

Still, it's not obvious what slots and slot_width are going to be set to
in a non-TDM setup where that doesn't really make much sense.

I assume you want to reduce the boilerplate, then we can make an helper
to get the frame size and the number of channels / slots if needed

Maxime

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

WARNING: multiple messages have this Message-ID (diff)
From: Maxime Ripard <maxime@cerno.tech>
To: "Clément Péron" <peron.clem@gmail.com>
Cc: devicetree <devicetree@vger.kernel.org>,
	Jernej Skrabec <jernej.skrabec@siol.net>,
	Linux-ALSA <alsa-devel@alsa-project.org>,
	Liam Girdwood <lgirdwood@gmail.com>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	Mark Brown <broonie@kernel.org>,
	linux-sunxi <linux-sunxi@googlegroups.com>,
	Takashi Iwai <tiwai@suse.com>, Jaroslav Kysela <perex@perex.cz>,
	Marcus Cooper <codekipper@gmail.com>,
	Chen-Yu Tsai <wens@csie.org>, Rob Herring <robh+dt@kernel.org>,
	Samuel Holland <samuel@sholland.org>,
	linux-arm-kernel <linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH v6 02/14] ASoC: sun4i-i2s: Change set_chan_cfg() params
Date: Mon, 12 Oct 2020 14:15:36 +0200	[thread overview]
Message-ID: <20201012121536.z5d7kecdxaabw35n@gilmour.lan> (raw)
In-Reply-To: <CAJiuCcdd6_kzsxEERZbj2Budjmuyv6gV_sPG8LjLY=fk+MO8zQ@mail.gmail.com>


[-- Attachment #1.1: Type: text/plain, Size: 6752 bytes --]

Hi,

On Mon, Oct 05, 2020 at 03:23:12PM +0200, Clément Péron wrote:
> On Mon, 5 Oct 2020 at 14:13, Maxime Ripard <maxime@cerno.tech> wrote:
> >
> > On Sat, Oct 03, 2020 at 04:19:38PM +0200, Clément Péron wrote:
> > > As slots and slot_width can be set manually using set_tdm().
> > > These values are then kept in sun4i_i2s struct.
> > > So we need to check if these values are setted or not
> > > in the struct.
> > >
> > > Avoid to check for this logic in set_chan_cfg(). This will
> > > duplicate the same check instead pass the required values
> > > as params to set_chan_cfg().
> > >
> > > This will also avoid a bug when we will enable 20/24bits support,
> > > i2s->slot_width is not actually used in the lrck_period computation.
> > >
> > > Suggested-by: Samuel Holland <samuel@sholland.org>
> > > Signed-off-by: Clément Péron <peron.clem@gmail.com>
> > > ---
> > >  sound/soc/sunxi/sun4i-i2s.c | 36 ++++++++++++++----------------------
> > >  1 file changed, 14 insertions(+), 22 deletions(-)
> > >
> > > diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c
> > > index c5ccd423e6d3..1f577dbc20a6 100644
> > > --- a/sound/soc/sunxi/sun4i-i2s.c
> > > +++ b/sound/soc/sunxi/sun4i-i2s.c
> > > @@ -177,8 +177,9 @@ struct sun4i_i2s_quirks {
> > >       unsigned long (*get_bclk_parent_rate)(const struct sun4i_i2s *);
> > >       s8      (*get_sr)(const struct sun4i_i2s *, int);
> > >       s8      (*get_wss)(const struct sun4i_i2s *, int);
> > > -     int     (*set_chan_cfg)(const struct sun4i_i2s *,
> > > -                             const struct snd_pcm_hw_params *);
> > > +     int     (*set_chan_cfg)(const struct sun4i_i2s *i2s,
> > > +                             unsigned int channels,  unsigned int slots,
> > > +                             unsigned int slot_width);
> > >       int     (*set_fmt)(const struct sun4i_i2s *, unsigned int);
> > >  };
> > >
> > > @@ -414,10 +415,9 @@ static s8 sun8i_i2s_get_sr_wss(const struct sun4i_i2s *i2s, int width)
> > >  }
> > >
> > >  static int sun4i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > > -                               const struct snd_pcm_hw_params *params)
> > > +                               unsigned int channels, unsigned int slots,
> > > +                               unsigned int slot_width)
> > >  {
> > > -     unsigned int channels = params_channels(params);
> > > -
> > >       /* Map the channels for playback and capture */
> > >       regmap_write(i2s->regmap, SUN4I_I2S_TX_CHAN_MAP_REG, 0x76543210);
> > >       regmap_write(i2s->regmap, SUN4I_I2S_RX_CHAN_MAP_REG, 0x00003210);
> > > @@ -434,15 +434,11 @@ static int sun4i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > >  }
> > >
> > >  static int sun8i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > > -                               const struct snd_pcm_hw_params *params)
> > > +                               unsigned int channels, unsigned int slots,
> > > +                               unsigned int slot_width)
> > >  {
> > > -     unsigned int channels = params_channels(params);
> > > -     unsigned int slots = channels;
> > >       unsigned int lrck_period;
> > >
> > > -     if (i2s->slots)
> > > -             slots = i2s->slots;
> > > -
> > >       /* Map the channels for playback and capture */
> > >       regmap_write(i2s->regmap, SUN8I_I2S_TX_CHAN_MAP_REG, 0x76543210);
> > >       regmap_write(i2s->regmap, SUN8I_I2S_RX_CHAN_MAP_REG, 0x76543210);
> > > @@ -467,11 +463,11 @@ static int sun8i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > >       case SND_SOC_DAIFMT_DSP_B:
> > >       case SND_SOC_DAIFMT_LEFT_J:
> > >       case SND_SOC_DAIFMT_RIGHT_J:
> > > -             lrck_period = params_physical_width(params) * slots;
> > > +             lrck_period = slot_width * slots;
> > >               break;
> > >
> > >       case SND_SOC_DAIFMT_I2S:
> > > -             lrck_period = params_physical_width(params);
> > > +             lrck_period = slot_width;
> > >               break;
> > >
> > >       default:
> > > @@ -490,15 +486,11 @@ static int sun8i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > >  }
> > >
> > >  static int sun50i_h6_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > > -                                   const struct snd_pcm_hw_params *params)
> > > +                                   unsigned int channels, unsigned int slots,
> > > +                                   unsigned int slot_width)
> > >  {
> > > -     unsigned int channels = params_channels(params);
> > > -     unsigned int slots = channels;
> > >       unsigned int lrck_period;
> > >
> > > -     if (i2s->slots)
> > > -             slots = i2s->slots;
> > > -
> > >       /* Map the channels for playback and capture */
> > >       regmap_write(i2s->regmap, SUN50I_H6_I2S_TX_CHAN_MAP0_REG, 0xFEDCBA98);
> > >       regmap_write(i2s->regmap, SUN50I_H6_I2S_TX_CHAN_MAP1_REG, 0x76543210);
> > > @@ -525,11 +517,11 @@ static int sun50i_h6_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
> > >       case SND_SOC_DAIFMT_DSP_B:
> > >       case SND_SOC_DAIFMT_LEFT_J:
> > >       case SND_SOC_DAIFMT_RIGHT_J:
> > > -             lrck_period = params_physical_width(params) * slots;
> > > +             lrck_period = slot_width * slots;
> > >               break;
> > >
> > >       case SND_SOC_DAIFMT_I2S:
> > > -             lrck_period = params_physical_width(params);
> > > +             lrck_period = slot_width;
> > >               break;
> > >
> > >       default:
> > > @@ -565,7 +557,7 @@ static int sun4i_i2s_hw_params(struct snd_pcm_substream *substream,
> > >       if (i2s->slot_width)
> > >               slot_width = i2s->slot_width;
> > >
> > > -     ret = i2s->variant->set_chan_cfg(i2s, params);
> > > +     ret = i2s->variant->set_chan_cfg(i2s, channels, slots, slot_width);
> >
> > Isn't slots and slot_width set to 0 here ?
> 
> No, there is still a check before calling the set_cfg function.
> 
>   unsigned int slot_width = params_physical_width(params);
>   unsigned int channels = params_channels(params);
>   unsigned int slots = channels;
> 
>   if (i2s->slots)
>   slots = i2s->slots;
> 
>   if (i2s->slot_width)
>   slot_width = i2s->slot_width;
> 
> ret = i2s->variant->set_chan_cfg(i2s, channels, slots, slot_width);
> 
> So slot_width will be equal to params_physical_width(params);
> like before

Still, it's not obvious what slots and slot_width are going to be set to
in a non-TDM setup where that doesn't really make much sense.

I assume you want to reduce the boilerplate, then we can make an helper
to get the frame size and the number of channels / slots if needed

Maxime

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

[-- Attachment #2: Type: text/plain, Size: 176 bytes --]

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2020-10-12 12:15 UTC|newest]

Thread overview: 78+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-03 14:19 [PATCH v6 00/14] Add Allwinner H3/H5/H6/A64 HDMI audio Clément Péron
2020-10-03 14:19 ` Clément Péron
2020-10-03 14:19 ` Clément Péron
2020-10-03 14:19 ` [PATCH v6 01/14] ASoC: sun4i-i2s: Add support for H6 I2S Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19 ` [PATCH v6 02/14] ASoC: sun4i-i2s: Change set_chan_cfg() params Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-05 12:13   ` Maxime Ripard
2020-10-05 12:13     ` Maxime Ripard
2020-10-05 12:13     ` Maxime Ripard
2020-10-05 13:23     ` Clément Péron
2020-10-05 13:23       ` Clément Péron
2020-10-05 13:23       ` Clément Péron
2020-10-12 12:15       ` Maxime Ripard [this message]
2020-10-12 12:15         ` Maxime Ripard
2020-10-12 12:15         ` Maxime Ripard
2020-10-13  1:15         ` Samuel Holland
2020-10-13  1:15           ` Samuel Holland
2020-10-13  1:15           ` Samuel Holland
2020-10-19 10:24           ` Maxime Ripard
2020-10-19 10:24             ` Maxime Ripard
2020-10-19 10:24             ` Maxime Ripard
2020-10-06  5:03     ` Samuel Holland
2020-10-06  5:03       ` Samuel Holland
2020-10-06  5:03       ` Samuel Holland
2020-10-12 12:20       ` Maxime Ripard
2020-10-12 12:20         ` Maxime Ripard
2020-10-12 12:20         ` Maxime Ripard
2020-10-03 14:19 ` [PATCH v6 03/14] ASoC: sun4i-i2s: Change get_sr() and get_wss() to be more explicit Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-05 12:14   ` Maxime Ripard
2020-10-05 12:14     ` Maxime Ripard
2020-10-05 12:14     ` Maxime Ripard
2020-10-05 13:35     ` Clément Péron
2020-10-05 13:35       ` Clément Péron
2020-10-05 13:35       ` Clément Péron
2020-10-03 14:19 ` [PATCH v6 04/14] ASoC: sun4i-i2s: Set sign extend sample Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19 ` [PATCH v6 05/14] ASoc: sun4i-i2s: Add 20 and 24 bit support Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19 ` [PATCH v6 06/14] ASoC: sun4i-i2s: Fix sun8i volatile regs Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19 ` [PATCH v6 07/14] ASoC: sun4i-i2s: Fix setting of FIFO modes Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19 ` [PATCH v6 08/14] ASoC: sun4i-i2s: fix coding-style for callback definition Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-05 12:14   ` Maxime Ripard
2020-10-05 12:14     ` Maxime Ripard
2020-10-05 12:14     ` Maxime Ripard
2020-10-03 14:19 ` [PATCH v6 09/14] dt-bindings: ASoC: sun4i-i2s: Add H6 compatible Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19 ` [PATCH v6 10/14] arm64: dts: allwinner: h6: Add I2S1 node Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19 ` [PATCH v6 11/14] arm64: dts: allwinner: a64: Add I2S2 node Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19 ` [PATCH v6 12/14] arm64: defconfig: Enable Allwinner i2s driver Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19 ` [PATCH v6 13/14] dt-bindings: sound: sun4i-i2s: Document H3 with missing RX channel possibility Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-06 21:11   ` Rob Herring
2020-10-06 21:11     ` Rob Herring
2020-10-06 21:11     ` Rob Herring
2020-10-03 14:19 ` [PATCH v6 14/14] arm: dts: sunxi: h3/h5: Add I2S2 node Clément Péron
2020-10-03 14:19   ` Clément Péron
2020-10-03 14:19   ` Clément Péron

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=20201012121536.z5d7kecdxaabw35n@gilmour.lan \
    --to=maxime@cerno.tech \
    --cc=alsa-devel@alsa-project.org \
    --cc=broonie@kernel.org \
    --cc=codekipper@gmail.com \
    --cc=devicetree@vger.kernel.org \
    --cc=jernej.skrabec@siol.net \
    --cc=lgirdwood@gmail.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-sunxi@googlegroups.com \
    --cc=perex@perex.cz \
    --cc=peron.clem@gmail.com \
    --cc=robh+dt@kernel.org \
    --cc=samuel@sholland.org \
    --cc=tiwai@suse.com \
    --cc=wens@csie.org \
    /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: link
Be 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.