[PATCH v2 1/2] misc: atmel-ssc: register as sound DAI if #sound-dai-cells is present

Nicolas Ferre nicolas.ferre at atmel.com
Wed Dec 7 01:04:37 PST 2016


Le 06/12/2016 à 20:22, Peter Rosin a écrit :
> The SSC is currently not usable with the ASoC simple-audio-card, as
> every SSC audio user has to build a platform driver that may do as
> little as calling atmel_ssc_set_audio/atmel_ssc_put_audio (which
> allocates the SSC and registers a DAI with the ASoC subsystem).
> 
> So, have that happen automatically, if the #sound-dai-cells property
> is present in devicetree, which it has to be anyway for simple audio
> card to work.
> 
> Acked-by: Rob Herring <robh at kernel.org>
> Signed-off-by: Peter Rosin <peda at axentia.se>

Sounds okay: thanks Peter.
Acked-by: Nicolas Ferre <nicolas.ferre at atmel.com>

I don't think my tag is needed for second patch but you can add it if
you wish.

Regards,


> ---
>  .../devicetree/bindings/misc/atmel-ssc.txt         |  2 +
>  drivers/misc/atmel-ssc.c                           | 50 ++++++++++++++++++++++
>  include/linux/atmel-ssc.h                          |  1 +
>  3 files changed, 53 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/misc/atmel-ssc.txt b/Documentation/devicetree/bindings/misc/atmel-ssc.txt
> index efc98ea1f23d..f8629bb73945 100644
> --- a/Documentation/devicetree/bindings/misc/atmel-ssc.txt
> +++ b/Documentation/devicetree/bindings/misc/atmel-ssc.txt
> @@ -24,6 +24,8 @@ Optional properties:
>         this parameter to choose where the clock from.
>       - By default the clock is from TK pin, if the clock from RK pin, this
>         property is needed.
> +  - #sound-dai-cells: Should contain <0>.
> +     - This property makes the SSC into an automatically registered DAI.
>  
>  Examples:
>  - PDC transfer:
> diff --git a/drivers/misc/atmel-ssc.c b/drivers/misc/atmel-ssc.c
> index 0516ecda54d3..b2a0340f277e 100644
> --- a/drivers/misc/atmel-ssc.c
> +++ b/drivers/misc/atmel-ssc.c
> @@ -20,6 +20,8 @@
>  
>  #include <linux/of.h>
>  
> +#include "../../sound/soc/atmel/atmel_ssc_dai.h"
> +
>  /* Serialize access to ssc_list and user count */
>  static DEFINE_SPINLOCK(user_lock);
>  static LIST_HEAD(ssc_list);
> @@ -145,6 +147,49 @@ static inline const struct atmel_ssc_platform_data * __init
>  		platform_get_device_id(pdev)->driver_data;
>  }
>  
> +#ifdef CONFIG_SND_ATMEL_SOC_SSC
> +static int ssc_sound_dai_probe(struct ssc_device *ssc)
> +{
> +	struct device_node *np = ssc->pdev->dev.of_node;
> +	int ret;
> +	int id;
> +
> +	ssc->sound_dai = false;
> +
> +	if (!of_property_read_bool(np, "#sound-dai-cells"))
> +		return 0;
> +
> +	id = of_alias_get_id(np, "ssc");
> +	if (id < 0)
> +		return id;
> +
> +	ret = atmel_ssc_set_audio(id);
> +	ssc->sound_dai = !ret;
> +
> +	return ret;
> +}
> +
> +static void ssc_sound_dai_remove(struct ssc_device *ssc)
> +{
> +	if (!ssc->sound_dai)
> +		return;
> +
> +	atmel_ssc_put_audio(of_alias_get_id(ssc->pdev->dev.of_node, "ssc"));
> +}
> +#else
> +static inline int ssc_sound_dai_probe(struct ssc_device *ssc)
> +{
> +	if (of_property_read_bool(ssc->pdev->dev.of_node, "#sound-dai-cells"))
> +		return -ENOTSUPP;
> +
> +	return 0;
> +}
> +
> +static inline void ssc_sound_dai_remove(struct ssc_device *ssc)
> +{
> +}
> +#endif
> +
>  static int ssc_probe(struct platform_device *pdev)
>  {
>  	struct resource *regs;
> @@ -204,6 +249,9 @@ static int ssc_probe(struct platform_device *pdev)
>  	dev_info(&pdev->dev, "Atmel SSC device at 0x%p (irq %d)\n",
>  			ssc->regs, ssc->irq);
>  
> +	if (ssc_sound_dai_probe(ssc))
> +		dev_err(&pdev->dev, "failed to auto-setup ssc for audio\n");
> +
>  	return 0;
>  }
>  
> @@ -211,6 +259,8 @@ static int ssc_remove(struct platform_device *pdev)
>  {
>  	struct ssc_device *ssc = platform_get_drvdata(pdev);
>  
> +	ssc_sound_dai_remove(ssc);
> +
>  	spin_lock(&user_lock);
>  	list_del(&ssc->list);
>  	spin_unlock(&user_lock);
> diff --git a/include/linux/atmel-ssc.h b/include/linux/atmel-ssc.h
> index 7c0f6549898b..fdb545101ede 100644
> --- a/include/linux/atmel-ssc.h
> +++ b/include/linux/atmel-ssc.h
> @@ -20,6 +20,7 @@ struct ssc_device {
>  	int			user;
>  	int			irq;
>  	bool			clk_from_rk_pin;
> +	bool			sound_dai;
>  };
>  
>  struct ssc_device * __must_check ssc_request(unsigned int ssc_num);
> 


-- 
Nicolas Ferre



More information about the linux-arm-kernel mailing list