OSDN Git Service

ASoC: fsl_spdif: Add kctl for configuring TX validity bit
authorShengjiu Wang <shengjiu.wang@nxp.com>
Tue, 7 Jul 2020 08:54:26 +0000 (16:54 +0800)
committerMark Brown <broonie@kernel.org>
Fri, 10 Jul 2020 14:29:49 +0000 (15:29 +0100)
Add one kctl for configuring TX validity bit from user
space.

The type of this kctl is boolean:
on - Outgoing validity always set
off - Outgoing validity always clear

Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
Link: https://lore.kernel.org/r/1594112066-31297-3-git-send-email-shengjiu.wang@nxp.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/fsl/fsl_spdif.c

index 576370d..37053e8 100644 (file)
@@ -776,8 +776,8 @@ static int fsl_spdif_vbit_info(struct snd_kcontrol *kcontrol,
 }
 
 /* Get valid good bit from interrupt status register */
-static int fsl_spdif_vbit_get(struct snd_kcontrol *kcontrol,
-                               struct snd_ctl_elem_value *ucontrol)
+static int fsl_spdif_rx_vbit_get(struct snd_kcontrol *kcontrol,
+                                struct snd_ctl_elem_value *ucontrol)
 {
        struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
        struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai);
@@ -791,6 +791,35 @@ static int fsl_spdif_vbit_get(struct snd_kcontrol *kcontrol,
        return 0;
 }
 
+static int fsl_spdif_tx_vbit_get(struct snd_kcontrol *kcontrol,
+                                struct snd_ctl_elem_value *ucontrol)
+{
+       struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
+       struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai);
+       struct regmap *regmap = spdif_priv->regmap;
+       u32 val;
+
+       regmap_read(regmap, REG_SPDIF_SCR, &val);
+       val = (val & SCR_VAL_MASK) >> SCR_VAL_OFFSET;
+       val = 1 - val;
+       ucontrol->value.integer.value[0] = val;
+
+       return 0;
+}
+
+static int fsl_spdif_tx_vbit_put(struct snd_kcontrol *kcontrol,
+                                struct snd_ctl_elem_value *ucontrol)
+{
+       struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
+       struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai);
+       struct regmap *regmap = spdif_priv->regmap;
+       u32 val = (1 - ucontrol->value.integer.value[0]) << SCR_VAL_OFFSET;
+
+       regmap_update_bits(regmap, REG_SPDIF_SCR, SCR_VAL_MASK, val);
+
+       return 0;
+}
+
 /* DPLL lock information */
 static int fsl_spdif_rxrate_info(struct snd_kcontrol *kcontrol,
                                struct snd_ctl_elem_info *uinfo)
@@ -948,11 +977,21 @@ static struct snd_kcontrol_new fsl_spdif_ctrls[] = {
        /* Valid bit error controller */
        {
                .iface = SNDRV_CTL_ELEM_IFACE_PCM,
-               .name = "IEC958 V-Bit Errors",
+               .name = "IEC958 RX V-Bit Errors",
                .access = SNDRV_CTL_ELEM_ACCESS_READ |
                        SNDRV_CTL_ELEM_ACCESS_VOLATILE,
                .info = fsl_spdif_vbit_info,
-               .get = fsl_spdif_vbit_get,
+               .get = fsl_spdif_rx_vbit_get,
+       },
+       {
+               .iface = SNDRV_CTL_ELEM_IFACE_PCM,
+               .name = "IEC958 TX V-Bit",
+               .access = SNDRV_CTL_ELEM_ACCESS_READ |
+                       SNDRV_CTL_ELEM_ACCESS_WRITE |
+                       SNDRV_CTL_ELEM_ACCESS_VOLATILE,
+               .info = fsl_spdif_vbit_info,
+               .get = fsl_spdif_tx_vbit_get,
+               .put = fsl_spdif_tx_vbit_put,
        },
        /* DPLL lock info get controller */
        {