Re: [PATCH] ASoC: pcm512x: Add support for data formats RJ and LJ
From: Kirill Marinushkin
Date: Wed Nov 11 2020 - 02:52:55 EST
Hello Peter,
than you for your review!
> The bus format and
>
>> switch (pcm512x->fmt & SND_SOC_DAIFMT_MASTER_MASK) {
>
>> case SND_SOC_DAIFMT_CBS_CFS:
>> ret = regmap_update_bits(pcm512x->regmap,
>
> the clock generation role should be set in pcm512x_set_fmt(), in that
> way you can deny specific setups earlier.
I think we could move both checks for`SND_SOC_DAIFMT_FORMAT_MASK` and
`SND_SOC_DAIFMT_MASTER_MASK` into `pcm512x_set_fmt()`. But it would be a
different scope, and I didn't intend to do that level of refactoring.
Looking at other codecs in kernel, I would say, that doing those checks in
`pcm512x_hw_params()`, as they are done currently, is an equally valid approach.
As technically keeping checs where they are now doesn't break anything, and is
aligned with ASoC codecs design, I suggest to keep the checks where they are.
Would you agree?
> I would also add DSP_A and DSP_B modes at the same time, DSP_A would
> need a write of 1 to register 41 (PCM512x_I2S_2, offset = 1), other
> formats should set the offset to 0.
That's a good idea, than you for technical details! I just didn't know how to
use DSP_A and DSP_B. I will add them, and submit as patch v2
Best regards,
Kirill
On 11/10/2020 07:59 AM, Peter Ujfalusi wrote:
>
>
> On 09/11/2020 23.21, Kirill Marinushkin wrote:
>> Currently, pcm512x driver supports only I2S data format.
>> This commit adds RJ and LJ as well.
>>
>> I don't expect regression WRT existing sound cards, because:
>>
>> * default value in corresponding register of pcm512x codec is 0 == I2S
>> * existing in-tree sound cards with pcm512x codec are configured for I2S
>> * i don't see how existing off-tree sound cards with pcm512x codec could be
>> configured differently - it would not work
>> * tested explicitly, that there is no regression with Raspberry Pi +
>> sound card `sound/soc/bcm/hifiberry_dacplus.c`
>>
>> Signed-off-by: Kirill Marinushkin <kmarinushkin@xxxxxxxxxx>
>> Cc: Mark Brown <broonie@xxxxxxxxxx>
>> Cc: Takashi Iwai <tiwai@xxxxxxxx>
>> Cc: Liam Girdwood <lgirdwood@xxxxxxxxx>
>> Cc: Matthias Reichl <hias@xxxxxxxxx>
>> Cc: Kuninori Morimoto <kuninori.morimoto.gx@xxxxxxxxxxx>
>> Cc: Peter Ujfalusi <peter.ujfalusi@xxxxxx>
>> Cc: alsa-devel@xxxxxxxxxxxxxxxx
>> Cc: linux-kernel@xxxxxxxxxxxxxxx
>> ---
>> sound/soc/codecs/pcm512x.c | 24 ++++++++++++++++++++++++
>> 1 file changed, 24 insertions(+)
>>
>> diff --git a/sound/soc/codecs/pcm512x.c b/sound/soc/codecs/pcm512x.c
>> index 8153d3d01654..c6e975fb4a43 100644
>> --- a/sound/soc/codecs/pcm512x.c
>> +++ b/sound/soc/codecs/pcm512x.c
>> @@ -1167,6 +1167,7 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream,
>> struct snd_soc_component *component = dai->component;
>> struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
>> int alen;
>> + int afmt;
>> int gpio;
>> int clock_output;
>> int master_mode;
>> @@ -1195,6 +1196,22 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream,
>> return -EINVAL;
>> }
>>
>> + switch (pcm512x->fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
>> + case SND_SOC_DAIFMT_I2S:
>> + afmt = PCM512x_AFMT_I2S;
>> + break;
>> + case SND_SOC_DAIFMT_RIGHT_J:
>> + afmt = PCM512x_AFMT_RTJ;
>> + break;
>> + case SND_SOC_DAIFMT_LEFT_J:
>> + afmt = PCM512x_AFMT_LTJ;
>> + break;
>> + default:
>> + dev_err(component->dev, "unsupported DAI format: 0x%x\n",
>> + pcm512x->fmt);
>> + return -EINVAL;
>> + }
>> +
>
> The bus format and
>
>> switch (pcm512x->fmt & SND_SOC_DAIFMT_MASTER_MASK) {
>
>> case SND_SOC_DAIFMT_CBS_CFS:
>> ret = regmap_update_bits(pcm512x->regmap,
>
> the clock generation role should be set in pcm512x_set_fmt(), in that
> way you can deny specific setups earlier.
>
> I would also add DSP_A and DSP_B modes at the same time, DSP_A would
> need a write of 1 to register 41 (PCM512x_I2S_2, offset = 1), other
> formats should set the offset to 0.
>
>> @@ -1236,6 +1253,13 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream,
>> return ret;
>> }
>>
>> + ret = regmap_update_bits(pcm512x->regmap, PCM512x_I2S_1,
>> + PCM512x_AFMT, afmt);
>> + if (ret != 0) {
>> + dev_err(component->dev, "Failed to set data format: %d\n", ret);
>> + return ret;
>> + }
>> +
>> if (pcm512x->pll_out) {
>> ret = regmap_write(pcm512x->regmap, PCM512x_FLEX_A, 0x11);
>> if (ret != 0) {
>>
>
> - Péter
>
> Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
> Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
>