From: Alexandre Belloni <alexandre.belloni@free-electrons.com>
To: Ladislav Michl <ladis@linux-mips.org>
Cc: alsa-devel@alsa-project.org,
Charles Keepax <ckeepax@opensource.cirrus.com>,
Nicolas Ferre <nicolas.ferre@microchip.com>,
Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>,
anish kumar <yesanishhere@gmail.com>
Subject: Re: [PATCH 6/7] ASoC: max9867: Fix BSEL value in master mode.
Date: Wed, 28 Feb 2018 11:28:49 +0100 [thread overview]
Message-ID: <20180228102849.GK1479@piout.net> (raw)
In-Reply-To: <20180228102313.GA12699@lenoch>
On 28/02/2018 at 11:23:13 +0100, Ladislav Michl wrote:
> On Wed, Feb 28, 2018 at 11:00:54AM +0100, Alexandre Belloni wrote:
> > On 27/02/2018 at 20:03:38 +0100, Ladislav Michl wrote:
> > > On Tue, Feb 27, 2018 at 06:23:09PM +0100, Alexandre Belloni wrote:
> > > > This also needs a proper commit message.
> > >
> > > Meanwhile more patches for this driver accumulated, so I'll send simple ones
> > > first and those I'm uncertain of later.
> > >
> > > Now few questions:
> > > - should hw_params emit any error message when asked to set for example
> > > unsupported sample rate? Many drivers do so, but it seems strange.
> >
> > I would thin that is correct because then the eror goes up to userspace
> > and it knows it has to resample.
>
> Perhaps I didn't express it clearly enough. I mean all those
> dev_err(dev, "sunsupported rate\n");
> Here only human sitting in realspace is able to react somehow, but I'd say
> he's only annoyed.
>
> I would expect driver is able to set any rate it is advertising, so returned
> -EINVAL is considered to be a programming error (which shouldn't clutter
> kernel log).
>
Ah yes, please feel free to remove the dev_err messages. I also find
that they clutter the kernel output needlessly.
> > > - table used in this driver is overkill, frequencies can be calculated
> > > directly (patch ready), but that brings question about
> > > SNDRV_PCM_RATE_CONTINUOUS: what does it exactly mean? What if codec is
> > > able to set "any" rate, but there are rounding errors?
> >
> > That is a good question I can't answer.
>
> Thank you anyway, hopefully someone else would be able to answer.
>
Well, Mark is not Cced, you'd have to get his attention somehow ;)
> Consider patch bellow - with introduced change codec is able to set any rate
> in master mode (it is an example only, it needs more work), but not any rate
> will be matched exactly. Of course, for each master clock rate it is possible
> to compute exact supported rates and advertise them. Is that way forward or
> is there any trick with SNDRV_PCM_RATE_CONTINUOUS?
>
> Subject: ASoC: max9867: Use continuous sample rate
>
> Drop "Common NI Values Table" and calculate LRCLK divider.
>
> Signed-off-by: Ladislav Michl <ladis@linux-mips.org>
>
> diff --git a/sound/soc/codecs/max9867.c b/sound/soc/codecs/max9867.c
> index 0a6bd9f4d00a..d9b81a95a200 100644
> --- a/sound/soc/codecs/max9867.c
> +++ b/sound/soc/codecs/max9867.c
> @@ -126,75 +126,19 @@ static const struct snd_soc_dapm_route max9867_audio_map[] = {
> {"LINE_IN", NULL, "Right Line"},
> };
>
> -enum rates {
> - pcm_rate_8, pcm_rate_16, pcm_rate_24,
> - pcm_rate_32, pcm_rate_44,
> - pcm_rate_48, max_pcm_rate,
> -};
> -
> -static const struct ni_div_rates {
> - u32 mclk;
> - u16 ni[max_pcm_rate];
> -} ni_div[] = {
> - {11289600, {0x116A, 0x22D4, 0x343F, 0x45A9, 0x6000, 0x687D} },
> - {12000000, {0x1062, 0x20C5, 0x3127, 0x4189, 0x5A51, 0x624E} },
> - {12288000, {0x1000, 0x2000, 0x3000, 0x4000, 0x5833, 0x6000} },
> - {13000000, {0x0F20, 0x1E3F, 0x2D5F, 0x3C7F, 0x535F, 0x5ABE} },
> - {19200000, {0x0A3D, 0x147B, 0x1EB8, 0x28F6, 0x3873, 0x3D71} },
> - {24000000, {0x1062, 0x20C5, 0x1893, 0x4189, 0x5A51, 0x624E} },
> - {26000000, {0x0F20, 0x1E3F, 0x16AF, 0x3C7F, 0x535F, 0x5ABE} },
> - {27000000, {0x0E90, 0x1D21, 0x15D8, 0x3A41, 0x5048, 0x5762} },
> -};
> -
> -static inline int get_ni_value(int mclk, int rate)
> -{
> - int i, ret = 0;
> -
> - /* find the closest rate index*/
> - for (i = 0; i < ARRAY_SIZE(ni_div); i++) {
> - if (ni_div[i].mclk >= mclk)
> - break;
> - }
> - if (i == ARRAY_SIZE(ni_div))
> - return -EINVAL;
> -
> - switch (rate) {
> - case 8000:
> - return ni_div[i].ni[pcm_rate_8];
> - case 16000:
> - return ni_div[i].ni[pcm_rate_16];
> - case 32000:
> - return ni_div[i].ni[pcm_rate_32];
> - case 44100:
> - return ni_div[i].ni[pcm_rate_44];
> - case 48000:
> - return ni_div[i].ni[pcm_rate_48];
> - default:
> - pr_err("%s wrong rate %d\n", __func__, rate);
> - ret = -EINVAL;
> - }
> - return ret;
> -}
> -
> static int max9867_dai_hw_params(struct snd_pcm_substream *substream,
> struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
> {
> struct snd_soc_component *component = dai->component;
> struct max9867_priv *max9867 = snd_soc_component_get_drvdata(component);
> - unsigned int ni_h, ni_l;
> - int value;
> + unsigned int ni = DIV_ROUND_CLOSEST_ULL(96ULL * 0x10000 * params_rate(params),
> + max9867->pclk);
>
> - value = get_ni_value(max9867->sysclk, params_rate(params));
> - if (value < 0)
> - return value;
> -
> - ni_h = (0xFF00 & value) >> 8;
> - ni_l = 0x00FF & value;
> /* set up the ni value */
> regmap_update_bits(max9867->regmap, MAX9867_AUDIOCLKHIGH,
> - MAX9867_NI_HIGH_MASK, ni_h);
> + MAX9867_NI_HIGH_MASK, (0xFF00 & ni) >> 8);
> regmap_update_bits(max9867->regmap, MAX9867_AUDIOCLKLOW,
> - MAX9867_NI_LOW_MASK, ni_l);
> + MAX9867_NI_LOW_MASK, 0x00FF & ni);
> if (!max9867->master) {
> /*
> * digital pll locks on to any externally supplied LRCLK signal
> @@ -241,13 +185,13 @@ static int max9867_set_dai_sysclk(struct snd_soc_dai *codec_dai,
> /* Set the prescaler based on the master clock frequency*/
> if (freq >= 10000000 && freq <= 20000000) {
> value |= MAX9867_PSCLK_10_20;
> - max9867->pclk = freq;
> + max9867->pclk = freq;
> } else if (freq >= 20000000 && freq <= 40000000) {
> value |= MAX9867_PSCLK_20_40;
> - max9867->pclk = freq/2;
> + max9867->pclk = freq / 2;
> } else if (freq >= 40000000 && freq <= 60000000) {
> value |= MAX9867_PSCLK_40_60;
> - max9867->pclk = freq/4;
> + max9867->pclk = freq / 4;
> } else {
> dev_err(component->dev,
> "Invalid clock frequency %uHz (required 10-60MHz)\n",
> @@ -322,10 +266,6 @@ static const struct snd_soc_dai_ops max9867_dai_ops = {
> .hw_params = max9867_dai_hw_params,
> };
>
> -#define MAX9867_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
> - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
> -#define MAX9867_FORMATS (SNDRV_PCM_FMTBIT_S16_LE)
> -
> static struct snd_soc_dai_driver max9867_dai[] = {
> {
> .name = "max9867-aif1",
> @@ -333,15 +273,19 @@ static struct snd_soc_dai_driver max9867_dai[] = {
> .stream_name = "HiFi Playback",
> .channels_min = 1,
> .channels_max = 2,
> - .rates = MAX9867_RATES,
> - .formats = MAX9867_FORMATS,
> + .rates = SNDRV_PCM_RATE_CONTINUOUS,
> + .rate_min = 8000,
> + .rate_max = 48000,
> + .formats = SNDRV_PCM_FMTBIT_S16_LE,
> },
> .capture = {
> .stream_name = "HiFi Capture",
> .channels_min = 1,
> .channels_max = 2,
> - .rates = MAX9867_RATES,
> - .formats = MAX9867_FORMATS,
> + .rates = SNDRV_PCM_RATE_CONTINUOUS,
> + .rate_min = 8000,
> + .rate_max = 48000,
> + .formats = SNDRV_PCM_FMTBIT_S16_LE,
> },
> .ops = &max9867_dai_ops,
> }
--
Alexandre Belloni, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com
next prev parent reply other threads:[~2018-02-28 10:29 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-30 11:06 [PATCH 0/7] Let Atmel use simple-audio-card Ladislav Michl
2018-01-30 11:06 ` [PATCH 1/7] ASoC: atmel: Remove redundant dev_err() call in probe function Ladislav Michl
2018-02-27 16:54 ` Alexandre Belloni
2018-02-27 17:13 ` Nicolas Ferre
2018-03-01 18:06 ` Applied "ASoC: atmel: Remove redundant dev_err() call in probe function" to the asoc tree Mark Brown
2018-01-30 11:08 ` [PATCH 2/7] ASoC: atmel_ssc_dai: Fix TCMR settings in I2S slave mode Ladislav Michl
2018-02-27 17:09 ` Alexandre Belloni
2018-02-27 18:50 ` Ladislav Michl
2018-01-30 11:08 ` [PATCH 3/7] ASoC: simple_card_utils: Set clock frequency Ladislav Michl
2018-02-27 17:19 ` Alexandre Belloni
2018-01-30 11:09 ` [PATCH 4/7] ASoC: max9867: Show Kconfig entry Ladislav Michl
2018-03-01 18:06 ` Applied "ASoC: max9867: Show Kconfig entry" to the asoc tree Mark Brown
2018-01-30 11:10 ` [PATCH 5/7] ASoC: max9867: Calculate LRCLK divider Ladislav Michl
2018-01-30 11:10 ` [PATCH 6/7] ASoC: max9867: Fix BSEL value in master mode Ladislav Michl
2018-02-27 17:23 ` Alexandre Belloni
2018-02-27 19:03 ` Ladislav Michl
2018-02-28 10:00 ` Alexandre Belloni
2018-02-28 10:23 ` Ladislav Michl
2018-02-28 10:28 ` Alexandre Belloni [this message]
2018-01-30 11:11 ` [PATCH 7/7] ASoC: max9867: Take chip out of shutdown Ladislav Michl
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=20180228102849.GK1479@piout.net \
--to=alexandre.belloni@free-electrons.com \
--cc=alsa-devel@alsa-project.org \
--cc=ckeepax@opensource.cirrus.com \
--cc=kuninori.morimoto.gx@renesas.com \
--cc=ladis@linux-mips.org \
--cc=nicolas.ferre@microchip.com \
--cc=yesanishhere@gmail.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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).