Merge series "ASoC: fsl_spdif: Clear the validity bit for TX" from Shengjiu Wang <shengjiu.wang@nxp.com>:
Clear the validity bit for TX Add kctl for configuring TX validity bit Shengjiu Wang (2): ASoC: fsl_spdif: Clear the validity bit for TX ASoC: fsl_spdif: Add kctl for configuring TX validity bit sound/soc/fsl/fsl_spdif.c | 51 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 4 deletions(-) -- 2.21.0
This commit is contained in:
commit
93ba7c8d79
|
@ -776,8 +776,8 @@ static int fsl_spdif_vbit_info(struct snd_kcontrol *kcontrol,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get valid good bit from interrupt status register */
|
/* Get valid good bit from interrupt status register */
|
||||||
static int fsl_spdif_vbit_get(struct snd_kcontrol *kcontrol,
|
static int fsl_spdif_rx_vbit_get(struct snd_kcontrol *kcontrol,
|
||||||
struct snd_ctl_elem_value *ucontrol)
|
struct snd_ctl_elem_value *ucontrol)
|
||||||
{
|
{
|
||||||
struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
|
struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
|
||||||
struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai);
|
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;
|
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 */
|
/* DPLL lock information */
|
||||||
static int fsl_spdif_rxrate_info(struct snd_kcontrol *kcontrol,
|
static int fsl_spdif_rxrate_info(struct snd_kcontrol *kcontrol,
|
||||||
struct snd_ctl_elem_info *uinfo)
|
struct snd_ctl_elem_info *uinfo)
|
||||||
|
@ -948,11 +977,21 @@ static struct snd_kcontrol_new fsl_spdif_ctrls[] = {
|
||||||
/* Valid bit error controller */
|
/* Valid bit error controller */
|
||||||
{
|
{
|
||||||
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
|
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
|
||||||
.name = "IEC958 V-Bit Errors",
|
.name = "IEC958 RX V-Bit Errors",
|
||||||
.access = SNDRV_CTL_ELEM_ACCESS_READ |
|
.access = SNDRV_CTL_ELEM_ACCESS_READ |
|
||||||
SNDRV_CTL_ELEM_ACCESS_VOLATILE,
|
SNDRV_CTL_ELEM_ACCESS_VOLATILE,
|
||||||
.info = fsl_spdif_vbit_info,
|
.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 */
|
/* DPLL lock info get controller */
|
||||||
{
|
{
|
||||||
|
@ -985,6 +1024,10 @@ static int fsl_spdif_dai_probe(struct snd_soc_dai *dai)
|
||||||
|
|
||||||
snd_soc_add_dai_controls(dai, fsl_spdif_ctrls, ARRAY_SIZE(fsl_spdif_ctrls));
|
snd_soc_add_dai_controls(dai, fsl_spdif_ctrls, ARRAY_SIZE(fsl_spdif_ctrls));
|
||||||
|
|
||||||
|
/*Clear the val bit for Tx*/
|
||||||
|
regmap_update_bits(spdif_private->regmap, REG_SPDIF_SCR,
|
||||||
|
SCR_VAL_MASK, SCR_VAL_CLEAR);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue