[PATCH v2] ASoC: fsl_spdif: add ALSA event on dpll locked

Shengjiu Wang shengjiu.wang at gmail.com
Fri Sep 16 09:34:15 CEST 2022


On Mon, Sep 12, 2022 at 6:54 PM Robert Rosengren <robert.rosengren at axis.com>
wrote:

> Add an ALSA event on the RX Sample Rate controller upon the dpll locked
> interrupt, making it possible for audio applications to monitor changes
> in the hardware.
>
> Signed-off-by: Robert Rosengren <robert.rosengren at axis.com>
>

Acked-by: Shengjiu Wang <shengjiu.wang at gmail.com>

Best regards
Wang Shengjiu

> ---
>
> Notes:
>     v2: Cache RX Sample Rate kcontrol to avoid lookup in interrupt.
>     Properly add description to fsl_spdif_priv.
>     Fix indentation.
>
>  sound/soc/fsl/fsl_spdif.c | 21 ++++++++++++++++++++-
>  1 file changed, 20 insertions(+), 1 deletion(-)
>
> diff --git a/sound/soc/fsl/fsl_spdif.c b/sound/soc/fsl/fsl_spdif.c
> index 7fc1c96929bb..275aba8e0c46 100644
> --- a/sound/soc/fsl/fsl_spdif.c
> +++ b/sound/soc/fsl/fsl_spdif.c
> @@ -44,6 +44,8 @@ static u8 srpc_dpll_locked[] = { 0x0, 0x1, 0x2, 0x3,
> 0x4, 0xa, 0xb };
>
>  #define DEFAULT_RXCLK_SRC      1
>
> +#define RX_SAMPLE_RATE_KCONTROL "RX Sample Rate"
> +
>  /**
>   * struct fsl_spdif_soc_data: soc specific data
>   *
> @@ -98,6 +100,8 @@ struct spdif_mixer_control {
>   * @soc: SPDIF soc data
>   * @fsl_spdif_control: SPDIF control data
>   * @cpu_dai_drv: cpu dai driver
> + * @snd_card: sound card pointer
> + * @rxrate_kcontrol: kcontrol for RX Sample Rate
>   * @pdev: platform device pointer
>   * @regmap: regmap handler
>   * @dpll_locked: dpll lock flag
> @@ -122,6 +126,8 @@ struct fsl_spdif_priv {
>         const struct fsl_spdif_soc_data *soc;
>         struct spdif_mixer_control fsl_spdif_control;
>         struct snd_soc_dai_driver cpu_dai_drv;
> +       struct snd_card *snd_card;
> +       struct snd_kcontrol *rxrate_kcontrol;
>         struct platform_device *pdev;
>         struct regmap *regmap;
>         bool dpll_locked;
> @@ -226,6 +232,12 @@ static void spdif_irq_dpll_lock(struct fsl_spdif_priv
> *spdif_priv)
>                         locked ? "locked" : "loss lock");
>
>         spdif_priv->dpll_locked = locked ? true : false;
> +
> +       if (spdif_priv->snd_card && spdif_priv->rxrate_kcontrol) {
> +               snd_ctl_notify(spdif_priv->snd_card,
> +                              SNDRV_CTL_EVENT_MASK_VALUE,
> +                              &spdif_priv->rxrate_kcontrol->id);
> +       }
>  }
>
>  /* Receiver found illegal symbol interrupt handler */
> @@ -1197,7 +1209,7 @@ static struct snd_kcontrol_new fsl_spdif_ctrls[] = {
>         /* DPLL lock info get controller */
>         {
>                 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
> -               .name = "RX Sample Rate",
> +               .name = RX_SAMPLE_RATE_KCONTROL,
>                 .access = SNDRV_CTL_ELEM_ACCESS_READ |
>                         SNDRV_CTL_ELEM_ACCESS_VOLATILE,
>                 .info = fsl_spdif_rxrate_info,
> @@ -1251,6 +1263,13 @@ static int fsl_spdif_dai_probe(struct snd_soc_dai
> *dai)
>                 snd_soc_add_dai_controls(dai, fsl_spdif_ctrls_rcm,
>                                          ARRAY_SIZE(fsl_spdif_ctrls_rcm));
>
> +       spdif_private->snd_card = dai->component->card->snd_card;
> +       spdif_private->rxrate_kcontrol =
> snd_soc_card_get_kcontrol(dai->component->card,
> +
> RX_SAMPLE_RATE_KCONTROL);
> +       if (!spdif_private->rxrate_kcontrol)
> +               dev_err(&spdif_private->pdev->dev, "failed to get %s
> kcontrol\n",
> +                       RX_SAMPLE_RATE_KCONTROL);
> +
>         /*Clear the val bit for Tx*/
>         regmap_update_bits(spdif_private->regmap, REG_SPDIF_SCR,
>                            SCR_VAL_MASK, SCR_VAL_CLEAR);
> --
> 2.30.2
>
>


More information about the Alsa-devel mailing list