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

2016-12-06 Thread Rob Herring
On Thu, Dec 01, 2016 at 12:59:08PM +0100, Peter Rosin wrote:
> 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.
> 
> Signed-off-by: Peter Rosin 
> ---
>  .../devicetree/bindings/misc/atmel-ssc.txt |  2 +

Acked-by: Rob Herring 

>  drivers/misc/atmel-ssc.c   | 50 
> ++
>  include/linux/atmel-ssc.h  |  1 +
>  3 files changed, 53 insertions(+)


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

2016-12-06 Thread Rob Herring
On Thu, Dec 01, 2016 at 12:59:08PM +0100, Peter Rosin wrote:
> 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.
> 
> Signed-off-by: Peter Rosin 
> ---
>  .../devicetree/bindings/misc/atmel-ssc.txt |  2 +

Acked-by: Rob Herring 

>  drivers/misc/atmel-ssc.c   | 50 
> ++
>  include/linux/atmel-ssc.h  |  1 +
>  3 files changed, 53 insertions(+)


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

2016-12-01 Thread Peter Rosin
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.

Signed-off-by: Peter Rosin 
---
 .../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 
 
+#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(>dev, "Atmel SSC device at 0x%p (irq %d)\n",
ssc->regs, ssc->irq);
 
+   if (ssc_sound_dai_probe(ssc))
+   dev_err(>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(_lock);
list_del(>list);
spin_unlock(_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;
boolclk_from_rk_pin;
+   boolsound_dai;
 };
 
 struct ssc_device * __must_check ssc_request(unsigned int ssc_num);
-- 
2.1.4



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

2016-12-01 Thread Peter Rosin
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.

Signed-off-by: Peter Rosin 
---
 .../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 
 
+#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(>dev, "Atmel SSC device at 0x%p (irq %d)\n",
ssc->regs, ssc->irq);
 
+   if (ssc_sound_dai_probe(ssc))
+   dev_err(>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(_lock);
list_del(>list);
spin_unlock(_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;
boolclk_from_rk_pin;
+   boolsound_dai;
 };
 
 struct ssc_device * __must_check ssc_request(unsigned int ssc_num);
-- 
2.1.4