lkml.org 
[lkml]   [2020]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 4/4] ASoC: pcm512x: Add support for more data formats
    Date
    Currently, pcm512x driver supports only I2S data format.
    This commit adds RJ, LJ, DSP_A and DSP_B 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@birdec.com>
    Cc: Mark Brown <broonie@kernel.org>
    Cc: Takashi Iwai <tiwai@suse.com>
    Cc: Liam Girdwood <lgirdwood@gmail.com>
    Cc: Matthias Reichl <hias@horus.com>
    Cc: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
    Cc: Peter Ujfalusi <peter.ujfalusi@ti.com>
    Cc: alsa-devel@alsa-project.org
    Cc: linux-kernel@vger.kernel.org
    ---
    sound/soc/codecs/pcm512x.c | 38 ++++++++++++++++++++++++++++++++++++++
    1 file changed, 38 insertions(+)

    diff --git a/sound/soc/codecs/pcm512x.c b/sound/soc/codecs/pcm512x.c
    index 22ef77955a28..4dc844f3c1fc 100644
    --- a/sound/soc/codecs/pcm512x.c
    +++ b/sound/soc/codecs/pcm512x.c
    @@ -1335,6 +1335,8 @@ static int pcm512x_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
    {
    struct snd_soc_component *component = dai->component;
    struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
    + int afmt;
    + int offset = 0;
    int clock_output;
    int master_mode;
    int ret;
    @@ -1372,6 +1374,42 @@ static int pcm512x_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
    return ret;
    }

    + switch (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;
    + case SND_SOC_DAIFMT_DSP_A:
    + offset = 1;
    + fallthrough;
    + case SND_SOC_DAIFMT_DSP_B:
    + afmt = PCM512x_AFMT_DSP;
    + break;
    + default:
    + dev_err(component->dev, "unsupported DAI format: 0x%x\n",
    + pcm512x->fmt);
    + return -EINVAL;
    + }
    +
    + 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;
    + }
    +
    + ret = regmap_update_bits(pcm512x->regmap, PCM512x_I2S_2,
    + 0xFF, offset);
    + if (ret != 0) {
    + dev_err(component->dev, "Failed to set data offset: %d\n", ret);
    + return ret;
    + }
    +
    pcm512x->fmt = fmt;

    return 0;
    --
    2.13.6
    \
     
     \ /
      Last update: 2020-11-15 13:22    [W:2.682 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site