All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] ASoC: change set_tdm_slot api to allow slot_width override.
@ 2009-06-16  0:44 Daniel Ribeiro
  2009-06-16 10:28 ` pHilipp Zabel
  2009-08-04 20:55 ` Mark Brown
  0 siblings, 2 replies; 10+ messages in thread
From: Daniel Ribeiro @ 2009-06-16  0:44 UTC (permalink / raw)
  To: Mark Brown, Eric Miao
  Cc: Paul Shen, alsa-devel, linux-arm-kernel, Philipp Zabel


[-- Attachment #1.1: Type: text/plain, Size: 5441 bytes --]

Extend set_tdm_slot to allow the user to arbitrarily set the frame width
and active TX/RX slots.

Updates magician.c and wm9081.c for the new set_tdm_slot(). wm9081.c
still doesn't handle the slot_width override.

While being there, correct an incorrect use of SlotsPerFrm(7) use in
bitmask on pxa-ssp.c (SSCR0_SlotsPerFrm(x) is (((x) - 1) << 24)) ).

(this series is meant for Mark's for-2.6.32 branch)

Signed-off-by: Daniel Ribeiro <drwyrm@gmail.com>

---
 include/sound/soc-dai.h   |    5 +++--
 sound/soc/codecs/wm9081.c |    5 +++--
 sound/soc/pxa/magician.c  |    2 +-
 sound/soc/pxa/pxa-ssp.c   |   27 ++++++++++++++++++++-------
 sound/soc/soc-core.c      |    9 ++++++---
 5 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
index 352d7ee..6692410 100644
--- a/include/sound/soc-dai.h
+++ b/include/sound/soc-dai.h
@@ -106,7 +106,7 @@ int snd_soc_dai_set_pll(struct snd_soc_dai *dai,
 int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt);
 
 int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
-	unsigned int mask, int slots);
+	unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width);
 
 int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate);
 
@@ -140,7 +140,8 @@ struct snd_soc_dai_ops {
 	 */
 	int (*set_fmt)(struct snd_soc_dai *dai, unsigned int fmt);
 	int (*set_tdm_slot)(struct snd_soc_dai *dai,
-		unsigned int mask, int slots);
+		unsigned int tx_mask, unsigned int rx_mask,
+		int slots, int slot_width);
 	int (*set_tristate)(struct snd_soc_dai *dai, int tristate);
 
 	/*
diff --git a/sound/soc/codecs/wm9081.c b/sound/soc/codecs/wm9081.c
index 86fc57e..c47d573 100644
--- a/sound/soc/codecs/wm9081.c
+++ b/sound/soc/codecs/wm9081.c
@@ -1206,8 +1206,9 @@ static int wm9081_set_sysclk(struct snd_soc_dai *codec_dai,
 	return 0;
 }
 
+/* FIXME: Needs to handle slot_width */
 static int wm9081_set_tdm_slot(struct snd_soc_dai *dai,
-			       unsigned int mask, int slots)
+	unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
 {
 	struct snd_soc_codec *codec = dai->codec;
 	unsigned int aif1 = wm9081_read(codec, WM9081_AUDIO_INTERFACE_1);
@@ -1219,7 +1220,7 @@ static int wm9081_set_tdm_slot(struct snd_soc_dai *dai,
 
 	aif1 |= (slots - 1) << WM9081_AIFDAC_TDM_MODE_SHIFT;
 
-	switch (mask) {
+	switch (rx_mask) {
 	case 1:
 		break;
 	case 2:
diff --git a/sound/soc/pxa/magician.c b/sound/soc/pxa/magician.c
index c89a3cd..34437d8 100644
--- a/sound/soc/pxa/magician.c
+++ b/sound/soc/pxa/magician.c
@@ -188,7 +188,7 @@ static int magician_playback_hw_params(struct snd_pcm_substream *substream,
 	if (ret < 0)
 		return ret;
 
-	ret = snd_soc_dai_set_tdm_slot(cpu_dai, 1, 1);
+	ret = snd_soc_dai_set_tdm_slot(cpu_dai, 1, 0, 1, width);
 	if (ret < 0)
 		return ret;
 
diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c
index e22c5ce..5b9ed64 100644
--- a/sound/soc/pxa/pxa-ssp.c
+++ b/sound/soc/pxa/pxa-ssp.c
@@ -375,21 +375,34 @@ static int pxa_ssp_set_dai_pll(struct snd_soc_dai *cpu_dai,
  * Set the active slots in TDM/Network mode
  */
 static int pxa_ssp_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai,
-	unsigned int mask, int slots)
+	unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
 {
 	struct ssp_priv *priv = cpu_dai->private_data;
 	struct ssp_device *ssp = priv->dev.ssp;
 	u32 sscr0;
 
-	sscr0 = ssp_read_reg(ssp, SSCR0) & ~SSCR0_SlotsPerFrm(7);
+	sscr0 = ssp_read_reg(ssp, SSCR0);
+	sscr0 &= ~(SSCR0_MOD | SSCR0_SlotsPerFrm(8) | SSCR0_EDSS | SSCR0_DSS);
+
+	/* set slot width */
+	if (slot_width > 16)
+		sscr0 |= SSCR0_EDSS | SSCR0_DataSize(slot_width - 16);
+	else
+		sscr0 |= SSCR0_DataSize(slot_width);
 
-	/* set number of active slots */
-	sscr0 |= SSCR0_SlotsPerFrm(slots);
+	if (slots > 1) {
+		/* enable network mode */
+		sscr0 |= SSCR0_MOD;
+
+		/* set number of active slots */
+		sscr0 |= SSCR0_SlotsPerFrm(slots);
+
+		/* set active slot mask */
+		ssp_write_reg(ssp, SSTSA, tx_mask);
+		ssp_write_reg(ssp, SSRSA, rx_mask);
+	}
 	ssp_write_reg(ssp, SSCR0, sscr0);
 
-	/* set active slot mask */
-	ssp_write_reg(ssp, SSTSA, mask);
-	ssp_write_reg(ssp, SSRSA, mask);
 	return 0;
 }
 
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index e1a920c..c72a8e8 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -2133,17 +2133,20 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_fmt);
 /**
  * snd_soc_dai_set_tdm_slot - configure DAI TDM.
  * @dai: DAI
- * @mask: DAI specific mask representing used slots.
+ * @tx_mask: bitmask representing active TX slots.
+ * @rx_mask: bitmask representing active RX slots.
  * @slots: Number of slots in use.
+ * @slot_width: Width in bits for each slot.
  *
  * Configures a DAI for TDM operation. Both mask and slots are codec and DAI
  * specific.
  */
 int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
-	unsigned int mask, int slots)
+	unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
 {
 	if (dai->ops && dai->ops->set_tdm_slot)
-		return dai->ops->set_tdm_slot(dai, mask, slots);
+		return dai->ops->set_tdm_slot(dai, tx_mask, rx_mask,
+				slots, slot_width);
 	else
 		return -EINVAL;
 }
-- 
tg: (c787980..) asoc/set_tdm_slot (depends on: asoc/remove-code-duplication)

-- 
Daniel Ribeiro

[-- Attachment #1.2: Esta é uma parte de mensagem assinada digitalmente --]
[-- Type: application/pgp-signature, Size: 197 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/3] ASoC: change set_tdm_slot api to allow slot_width override.
  2009-06-16  0:44 [PATCH 1/3] ASoC: change set_tdm_slot api to allow slot_width override Daniel Ribeiro
@ 2009-06-16 10:28 ` pHilipp Zabel
  2009-08-04 20:55 ` Mark Brown
  1 sibling, 0 replies; 10+ messages in thread
From: pHilipp Zabel @ 2009-06-16 10:28 UTC (permalink / raw)
  To: Daniel Ribeiro
  Cc: Paul Shen, alsa-devel, Eric Miao, Mark Brown, linux-arm-kernel

2009/6/16 Daniel Ribeiro <drwyrm@gmail.com>:
> Extend set_tdm_slot to allow the user to arbitrarily set the frame width
> and active TX/RX slots.
>
> Updates magician.c and wm9081.c for the new set_tdm_slot(). wm9081.c
> still doesn't handle the slot_width override.
>
> While being there, correct an incorrect use of SlotsPerFrm(7) use in
> bitmask on pxa-ssp.c (SSCR0_SlotsPerFrm(x) is (((x) - 1) << 24)) ).
>
> (this series is meant for Mark's for-2.6.32 branch)
>
> Signed-off-by: Daniel Ribeiro <drwyrm@gmail.com>
>
> ---
>  include/sound/soc-dai.h   |    5 +++--
>  sound/soc/codecs/wm9081.c |    5 +++--
>  sound/soc/pxa/magician.c  |    2 +-
>  sound/soc/pxa/pxa-ssp.c   |   27 ++++++++++++++++++++-------

FWIW, the patchset doesn't break magician.
Tested-by: Philipp Zabel <philipp.zabel@gmail.com>
in my dev tree (for-2.6.31 and for-2.6.32 trees merged).

regards
Philipp

>  sound/soc/soc-core.c      |    9 ++++++---
>  5 files changed, 33 insertions(+), 15 deletions(-)
>
> diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
> index 352d7ee..6692410 100644
> --- a/include/sound/soc-dai.h
> +++ b/include/sound/soc-dai.h
> @@ -106,7 +106,7 @@ int snd_soc_dai_set_pll(struct snd_soc_dai *dai,
>  int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt);
>
>  int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
> -       unsigned int mask, int slots);
> +       unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width);
>
>  int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate);
>
> @@ -140,7 +140,8 @@ struct snd_soc_dai_ops {
>         */
>        int (*set_fmt)(struct snd_soc_dai *dai, unsigned int fmt);
>        int (*set_tdm_slot)(struct snd_soc_dai *dai,
> -               unsigned int mask, int slots);
> +               unsigned int tx_mask, unsigned int rx_mask,
> +               int slots, int slot_width);
>        int (*set_tristate)(struct snd_soc_dai *dai, int tristate);
>
>        /*
> diff --git a/sound/soc/codecs/wm9081.c b/sound/soc/codecs/wm9081.c
> index 86fc57e..c47d573 100644
> --- a/sound/soc/codecs/wm9081.c
> +++ b/sound/soc/codecs/wm9081.c
> @@ -1206,8 +1206,9 @@ static int wm9081_set_sysclk(struct snd_soc_dai *codec_dai,
>        return 0;
>  }
>
> +/* FIXME: Needs to handle slot_width */
>  static int wm9081_set_tdm_slot(struct snd_soc_dai *dai,
> -                              unsigned int mask, int slots)
> +       unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
>  {
>        struct snd_soc_codec *codec = dai->codec;
>        unsigned int aif1 = wm9081_read(codec, WM9081_AUDIO_INTERFACE_1);
> @@ -1219,7 +1220,7 @@ static int wm9081_set_tdm_slot(struct snd_soc_dai *dai,
>
>        aif1 |= (slots - 1) << WM9081_AIFDAC_TDM_MODE_SHIFT;
>
> -       switch (mask) {
> +       switch (rx_mask) {
>        case 1:
>                break;
>        case 2:
> diff --git a/sound/soc/pxa/magician.c b/sound/soc/pxa/magician.c
> index c89a3cd..34437d8 100644
> --- a/sound/soc/pxa/magician.c
> +++ b/sound/soc/pxa/magician.c
> @@ -188,7 +188,7 @@ static int magician_playback_hw_params(struct snd_pcm_substream *substream,
>        if (ret < 0)
>                return ret;
>
> -       ret = snd_soc_dai_set_tdm_slot(cpu_dai, 1, 1);
> +       ret = snd_soc_dai_set_tdm_slot(cpu_dai, 1, 0, 1, width);
>        if (ret < 0)
>                return ret;
>
> diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c
> index e22c5ce..5b9ed64 100644
> --- a/sound/soc/pxa/pxa-ssp.c
> +++ b/sound/soc/pxa/pxa-ssp.c
> @@ -375,21 +375,34 @@ static int pxa_ssp_set_dai_pll(struct snd_soc_dai *cpu_dai,
>  * Set the active slots in TDM/Network mode
>  */
>  static int pxa_ssp_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai,
> -       unsigned int mask, int slots)
> +       unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
>  {
>        struct ssp_priv *priv = cpu_dai->private_data;
>        struct ssp_device *ssp = priv->dev.ssp;
>        u32 sscr0;
>
> -       sscr0 = ssp_read_reg(ssp, SSCR0) & ~SSCR0_SlotsPerFrm(7);
> +       sscr0 = ssp_read_reg(ssp, SSCR0);
> +       sscr0 &= ~(SSCR0_MOD | SSCR0_SlotsPerFrm(8) | SSCR0_EDSS | SSCR0_DSS);
> +
> +       /* set slot width */
> +       if (slot_width > 16)
> +               sscr0 |= SSCR0_EDSS | SSCR0_DataSize(slot_width - 16);
> +       else
> +               sscr0 |= SSCR0_DataSize(slot_width);
>
> -       /* set number of active slots */
> -       sscr0 |= SSCR0_SlotsPerFrm(slots);
> +       if (slots > 1) {
> +               /* enable network mode */
> +               sscr0 |= SSCR0_MOD;
> +
> +               /* set number of active slots */
> +               sscr0 |= SSCR0_SlotsPerFrm(slots);
> +
> +               /* set active slot mask */
> +               ssp_write_reg(ssp, SSTSA, tx_mask);
> +               ssp_write_reg(ssp, SSRSA, rx_mask);
> +       }
>        ssp_write_reg(ssp, SSCR0, sscr0);
>
> -       /* set active slot mask */
> -       ssp_write_reg(ssp, SSTSA, mask);
> -       ssp_write_reg(ssp, SSRSA, mask);
>        return 0;
>  }
>
> diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
> index e1a920c..c72a8e8 100644
> --- a/sound/soc/soc-core.c
> +++ b/sound/soc/soc-core.c
> @@ -2133,17 +2133,20 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_fmt);
>  /**
>  * snd_soc_dai_set_tdm_slot - configure DAI TDM.
>  * @dai: DAI
> - * @mask: DAI specific mask representing used slots.
> + * @tx_mask: bitmask representing active TX slots.
> + * @rx_mask: bitmask representing active RX slots.
>  * @slots: Number of slots in use.
> + * @slot_width: Width in bits for each slot.
>  *
>  * Configures a DAI for TDM operation. Both mask and slots are codec and DAI
>  * specific.
>  */
>  int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
> -       unsigned int mask, int slots)
> +       unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
>  {
>        if (dai->ops && dai->ops->set_tdm_slot)
> -               return dai->ops->set_tdm_slot(dai, mask, slots);
> +               return dai->ops->set_tdm_slot(dai, tx_mask, rx_mask,
> +                               slots, slot_width);
>        else
>                return -EINVAL;
>  }
> --
> tg: (c787980..) asoc/set_tdm_slot (depends on: asoc/remove-code-duplication)
>
> --
> Daniel Ribeiro
>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/3] ASoC: change set_tdm_slot api to allow slot_width override.
  2009-06-16  0:44 [PATCH 1/3] ASoC: change set_tdm_slot api to allow slot_width override Daniel Ribeiro
  2009-06-16 10:28 ` pHilipp Zabel
@ 2009-08-04 20:55 ` Mark Brown
  2009-08-04 23:42   ` Daniel Mack
  2009-08-06 14:36   ` [PATCH 1/3] ASoC: change set_tdm_slot api to allow slot_width override Eric Miao
  1 sibling, 2 replies; 10+ messages in thread
From: Mark Brown @ 2009-08-04 20:55 UTC (permalink / raw)
  To: Daniel Ribeiro
  Cc: Paul Shen, alsa-devel, Eric Miao, Philipp Zabel, linux-arm-kernel

On Mon, Jun 15, 2009 at 09:44:31PM -0300, Daniel Ribeiro wrote:
> Extend set_tdm_slot to allow the user to arbitrarily set the frame width
> and active TX/RX slots.

> Updates magician.c and wm9081.c for the new set_tdm_slot(). wm9081.c
> still doesn't handle the slot_width override.

> While being there, correct an incorrect use of SlotsPerFrm(7) use in
> bitmask on pxa-ssp.c (SSCR0_SlotsPerFrm(x) is (((x) - 1) << 24)) ).

> (this series is meant for Mark's for-2.6.32 branch)

> Signed-off-by: Daniel Ribeiro <drwyrm@gmail.com>

So.  These have been sitting for quite some time now.  Unfortunately I
went on holiday immediately after it was last submitted my Zylonite
system has been bricked for pretty much all of the time since then so
I've been remiss in following up.  Sorry about that, my bad.

My inclination here is to apply these changes - they look like a clear
win for pretty much every machine except Daniel Mack's out of tree
system which needs the 64 bit TDM slots.  It's a shame to break that but
there seems to be such a clear advantage from the changes, especially
the new set_tdm_slot() API, that it seems like a win overall.  I've got
a feeling that the fix for that system may have to be allowing the
machine driver to rewrite the hw_params for the CPU driver to lie about
the data format.

I'll try to do that this week.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/3] ASoC: change set_tdm_slot api to allow slot_width override.
  2009-08-04 20:55 ` Mark Brown
@ 2009-08-04 23:42   ` Daniel Mack
  2009-08-05 16:47     ` mixing audio waves for analysis! Guilherme Longo
  2009-08-06 14:36   ` [PATCH 1/3] ASoC: change set_tdm_slot api to allow slot_width override Eric Miao
  1 sibling, 1 reply; 10+ messages in thread
From: Daniel Mack @ 2009-08-04 23:42 UTC (permalink / raw)
  To: Mark Brown
  Cc: Paul Shen, alsa-devel, Eric Miao, Philipp Zabel,
	linux-arm-kernel, Daniel Ribeiro

On Tue, Aug 04, 2009 at 09:55:45PM +0100, Mark Brown wrote:
> On Mon, Jun 15, 2009 at 09:44:31PM -0300, Daniel Ribeiro wrote:
> > Extend set_tdm_slot to allow the user to arbitrarily set the frame width
> > and active TX/RX slots.
> 
> > Updates magician.c and wm9081.c for the new set_tdm_slot(). wm9081.c
> > still doesn't handle the slot_width override.
> 
> > While being there, correct an incorrect use of SlotsPerFrm(7) use in
> > bitmask on pxa-ssp.c (SSCR0_SlotsPerFrm(x) is (((x) - 1) << 24)) ).
> 
> > (this series is meant for Mark's for-2.6.32 branch)
> 
> > Signed-off-by: Daniel Ribeiro <drwyrm@gmail.com>
> 
> So.  These have been sitting for quite some time now.  Unfortunately I
> went on holiday immediately after it was last submitted my Zylonite
> system has been bricked for pretty much all of the time since then so
> I've been remiss in following up.  Sorry about that, my bad.
> 
> My inclination here is to apply these changes - they look like a clear
> win for pretty much every machine except Daniel Mack's out of tree
> system which needs the 64 bit TDM slots.  It's a shame to break that but
> there seems to be such a clear advantage from the changes, especially
> the new set_tdm_slot() API, that it seems like a win overall.  I've got
> a feeling that the fix for that system may have to be allowing the
> machine driver to rewrite the hw_params for the CPU driver to lie about
> the data format.

Hmm. I like to stress that I appreciate the efford taken to clean up all
the API around this, and I would like to give my 'tested-by' on the
patches.

However, if it is about cleaning up things properly, we should make sure
the system does what it's been told to do, and with Daniel Ribeiro's
patches, it unfortunately doesn't yet. I'm only blaming the utterly
broken PXA register set for that, but that should be fixed before the
whole series goes in. And I'm quite sure I'm not the only user of 64 bit
TDM slots, even though I might be the only one having discussed that.

Daniel, could you resend the latest version of your patches? I hope to
find some time to again test them, find the differences in the register
bits and amend them in a way that they actually do what is needed for my
system.

And btw - the code for the system I'm working on will be release
eventually, of course, and hopefully even be merged mainline. 

Thanks,
Daniel

^ permalink raw reply	[flat|nested] 10+ messages in thread

* mixing audio waves for analysis!
  2009-08-04 23:42   ` Daniel Mack
@ 2009-08-05 16:47     ` Guilherme Longo
  0 siblings, 0 replies; 10+ messages in thread
From: Guilherme Longo @ 2009-08-05 16:47 UTC (permalink / raw)
  To: alsa-devel, tiwai

Hello.

Since I haven´t got any awnser for the previous question, I decided to 
formulate a new one, perhaps with a better meaning of what I really need!

I need to combine two waves that I created in two diferent functions. 
So, I have the function generate_sine_one and generate_sine_two with 
defferent frequencies and amplitudes.

Ok, what I need is to find a way to combine these two waves. I been 
searching through alsa api in a effort to solve my problem but I 
couldn´t find a proper solution.

Does anyone know a program or a tutorial where I could get some 
reference of this type of procedure?

Tks a lot!

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/3] ASoC: change set_tdm_slot api to allow slot_width override.
  2009-08-04 20:55 ` Mark Brown
  2009-08-04 23:42   ` Daniel Mack
@ 2009-08-06 14:36   ` Eric Miao
  2009-08-06 15:01     ` Mark Brown
  1 sibling, 1 reply; 10+ messages in thread
From: Eric Miao @ 2009-08-06 14:36 UTC (permalink / raw)
  To: Mark Brown
  Cc: Paul Shen, alsa-devel, Eric Miao, Philipp Zabel,
	linux-arm-kernel, Daniel Ribeiro

Mark Brown wrote:
> On Mon, Jun 15, 2009 at 09:44:31PM -0300, Daniel Ribeiro wrote:
>> Extend set_tdm_slot to allow the user to arbitrarily set the frame width
>> and active TX/RX slots.
> 
>> Updates magician.c and wm9081.c for the new set_tdm_slot(). wm9081.c
>> still doesn't handle the slot_width override.
> 
>> While being there, correct an incorrect use of SlotsPerFrm(7) use in
>> bitmask on pxa-ssp.c (SSCR0_SlotsPerFrm(x) is (((x) - 1) << 24)) ).
> 
>> (this series is meant for Mark's for-2.6.32 branch)
> 
>> Signed-off-by: Daniel Ribeiro <drwyrm@gmail.com>
> 
> So.  These have been sitting for quite some time now.  Unfortunately I
> went on holiday immediately after it was last submitted my Zylonite
> system has been bricked for pretty much all of the time since then so
> I've been remiss in following up.  Sorry about that, my bad.
> 
> My inclination here is to apply these changes - they look like a clear
> win for pretty much every machine except Daniel Mack's out of tree
> system which needs the 64 bit TDM slots.  It's a shame to break that but
> there seems to be such a clear advantage from the changes, especially
> the new set_tdm_slot() API, that it seems like a win overall.  I've got
> a feeling that the fix for that system may have to be allowing the
> machine driver to rewrite the hw_params for the CPU driver to lie about
> the data format.
> 
> I'll try to do that this week.
> 

I seem to remember this failed on Littleton - playback just doesn't work
any more, and DMA looks to be inactive. Didn't follow this thread for a
long time, but Daniel, could you repost the whole series if you have any
update

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/3] ASoC: change set_tdm_slot api to allow slot_width override.
  2009-08-06 14:36   ` [PATCH 1/3] ASoC: change set_tdm_slot api to allow slot_width override Eric Miao
@ 2009-08-06 15:01     ` Mark Brown
  0 siblings, 0 replies; 10+ messages in thread
From: Mark Brown @ 2009-08-06 15:01 UTC (permalink / raw)
  To: Eric Miao
  Cc: Paul Shen, alsa-devel, Philipp Zabel, linux-arm-kernel, Daniel Ribeiro

On Thu, Aug 06, 2009 at 10:36:22PM +0800, Eric Miao wrote:

> I seem to remember this failed on Littleton - playback just doesn't work
> any more, and DMA looks to be inactive. Didn't follow this thread for a
> long time, but Daniel, could you repost the whole series if you have any
> update

I don't think anyone actually reported that on the list at the time.
Actually, speaking of Littleton it'd be good to get at least the CODEC
driver merged - ISTR the issues with that should all be fairly simple to
resolve and there's no need to wait for the machine support before
merging the CODEC driver.

I've pushed the patches to a branch on my ASoC git:

  git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound-2.6.git

and reposted them a minute ago.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/3] ASoC: change set_tdm_slot api to allow slot_width override.
  2009-08-06 14:55 Mark Brown
  2009-08-06 14:59 ` Daniel Mack
@ 2009-08-11 12:04 ` Mark Brown
  1 sibling, 0 replies; 10+ messages in thread
From: Mark Brown @ 2009-08-11 12:04 UTC (permalink / raw)
  To: Eric Miao, Philipp Zabel, Daniel Ribeiro, Paul Shen, Daniel Mack
  Cc: alsa-devel

On Thu, Aug 06, 2009 at 03:55:17PM +0100, Mark Brown wrote:
> From: Daniel Ribeiro <drwyrm@gmail.com>
> 
> Extend set_tdm_slot to allow the user to arbitrarily set the frame width
> and active TX/RX slots.
> 
> Updates magician.c and wm9081.c for the new set_tdm_slot(). wm9081.c
> still doesn't handle the slot_width override.
> 
> While being there, correct an incorrect use of SlotsPerFrm(7) use in
> bitmask on pxa-ssp.c (SSCR0_SlotsPerFrm(x) is (((x) - 1) << 24)) ).

In order to pick up the set_tdm_slot() API change I'm going to apply
this first patch just now.  Please let me know if you run into any
problems - I'm still unable to run any PXA3xx tests due to issues with
my development platform.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/3] ASoC: change set_tdm_slot api to allow slot_width override.
  2009-08-06 14:55 Mark Brown
@ 2009-08-06 14:59 ` Daniel Mack
  2009-08-11 12:04 ` Mark Brown
  1 sibling, 0 replies; 10+ messages in thread
From: Daniel Mack @ 2009-08-06 14:59 UTC (permalink / raw)
  To: Mark Brown
  Cc: Paul Shen, alsa-devel, Eric Miao, Daniel Ribeiro, Philipp Zabel

On Thu, Aug 06, 2009 at 03:55:17PM +0100, Mark Brown wrote:
> Extend set_tdm_slot to allow the user to arbitrarily set the frame width
> and active TX/RX slots.
> 
> Updates magician.c and wm9081.c for the new set_tdm_slot(). wm9081.c
> still doesn't handle the slot_width override.
> 
> While being there, correct an incorrect use of SlotsPerFrm(7) use in
> bitmask on pxa-ssp.c (SSCR0_SlotsPerFrm(x) is (((x) - 1) << 24)) ).
> 
> (this series is meant for Mark's for-2.6.32 branch)
> 
> Signed-off-by: Daniel Ribeiro <drwyrm@gmail.com>
> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>

Ok, thanks. Give me some days to build up my test environment here with
all the protocol analyzers and so - I'll get back on this issue next
week.

Daniel

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/3] ASoC: change set_tdm_slot api to allow slot_width override.
@ 2009-08-06 14:55 Mark Brown
  2009-08-06 14:59 ` Daniel Mack
  2009-08-11 12:04 ` Mark Brown
  0 siblings, 2 replies; 10+ messages in thread
From: Mark Brown @ 2009-08-06 14:55 UTC (permalink / raw)
  To: Eric Miao, Philipp Zabel, Paul Shen, Daniel Mack
  Cc: alsa-devel, Mark Brown, Daniel Ribeiro

From: Daniel Ribeiro <drwyrm@gmail.com>

Extend set_tdm_slot to allow the user to arbitrarily set the frame width
and active TX/RX slots.

Updates magician.c and wm9081.c for the new set_tdm_slot(). wm9081.c
still doesn't handle the slot_width override.

While being there, correct an incorrect use of SlotsPerFrm(7) use in
bitmask on pxa-ssp.c (SSCR0_SlotsPerFrm(x) is (((x) - 1) << 24)) ).

(this series is meant for Mark's for-2.6.32 branch)

Signed-off-by: Daniel Ribeiro <drwyrm@gmail.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
---
 include/sound/soc-dai.h   |    5 +++--
 sound/soc/codecs/wm9081.c |    5 +++--
 sound/soc/pxa/magician.c  |    2 +-
 sound/soc/pxa/pxa-ssp.c   |   27 ++++++++++++++++++++-------
 sound/soc/soc-core.c      |    9 ++++++---
 5 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
index 25d62ac..2d3fa29 100644
--- a/include/sound/soc-dai.h
+++ b/include/sound/soc-dai.h
@@ -106,7 +106,7 @@ int snd_soc_dai_set_pll(struct snd_soc_dai *dai,
 int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt);
 
 int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
-	unsigned int mask, int slots);
+	unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width);
 
 int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate);
 
@@ -140,7 +140,8 @@ struct snd_soc_dai_ops {
 	 */
 	int (*set_fmt)(struct snd_soc_dai *dai, unsigned int fmt);
 	int (*set_tdm_slot)(struct snd_soc_dai *dai,
-		unsigned int mask, int slots);
+		unsigned int tx_mask, unsigned int rx_mask,
+		int slots, int slot_width);
 	int (*set_tristate)(struct snd_soc_dai *dai, int tristate);
 
 	/*
diff --git a/sound/soc/codecs/wm9081.c b/sound/soc/codecs/wm9081.c
index 156f2a4..c965323 100644
--- a/sound/soc/codecs/wm9081.c
+++ b/sound/soc/codecs/wm9081.c
@@ -1214,8 +1214,9 @@ static int wm9081_set_sysclk(struct snd_soc_dai *codec_dai,
 	return 0;
 }
 
+/* FIXME: Needs to handle slot_width */
 static int wm9081_set_tdm_slot(struct snd_soc_dai *dai,
-			       unsigned int mask, int slots)
+	unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
 {
 	struct snd_soc_codec *codec = dai->codec;
 	unsigned int aif1 = wm9081_read(codec, WM9081_AUDIO_INTERFACE_1);
@@ -1227,7 +1228,7 @@ static int wm9081_set_tdm_slot(struct snd_soc_dai *dai,
 
 	aif1 |= (slots - 1) << WM9081_AIFDAC_TDM_MODE_SHIFT;
 
-	switch (mask) {
+	switch (rx_mask) {
 	case 1:
 		break;
 	case 2:
diff --git a/sound/soc/pxa/magician.c b/sound/soc/pxa/magician.c
index 8889cd3..9f7c61e 100644
--- a/sound/soc/pxa/magician.c
+++ b/sound/soc/pxa/magician.c
@@ -190,7 +190,7 @@ static int magician_playback_hw_params(struct snd_pcm_substream *substream,
 	if (ret < 0)
 		return ret;
 
-	ret = snd_soc_dai_set_tdm_slot(cpu_dai, 1, 1);
+	ret = snd_soc_dai_set_tdm_slot(cpu_dai, 1, 0, 1, width);
 	if (ret < 0)
 		return ret;
 
diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c
index e22c5ce..5b9ed64 100644
--- a/sound/soc/pxa/pxa-ssp.c
+++ b/sound/soc/pxa/pxa-ssp.c
@@ -375,21 +375,34 @@ static int pxa_ssp_set_dai_pll(struct snd_soc_dai *cpu_dai,
  * Set the active slots in TDM/Network mode
  */
 static int pxa_ssp_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai,
-	unsigned int mask, int slots)
+	unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
 {
 	struct ssp_priv *priv = cpu_dai->private_data;
 	struct ssp_device *ssp = priv->dev.ssp;
 	u32 sscr0;
 
-	sscr0 = ssp_read_reg(ssp, SSCR0) & ~SSCR0_SlotsPerFrm(7);
+	sscr0 = ssp_read_reg(ssp, SSCR0);
+	sscr0 &= ~(SSCR0_MOD | SSCR0_SlotsPerFrm(8) | SSCR0_EDSS | SSCR0_DSS);
+
+	/* set slot width */
+	if (slot_width > 16)
+		sscr0 |= SSCR0_EDSS | SSCR0_DataSize(slot_width - 16);
+	else
+		sscr0 |= SSCR0_DataSize(slot_width);
 
-	/* set number of active slots */
-	sscr0 |= SSCR0_SlotsPerFrm(slots);
+	if (slots > 1) {
+		/* enable network mode */
+		sscr0 |= SSCR0_MOD;
+
+		/* set number of active slots */
+		sscr0 |= SSCR0_SlotsPerFrm(slots);
+
+		/* set active slot mask */
+		ssp_write_reg(ssp, SSTSA, tx_mask);
+		ssp_write_reg(ssp, SSRSA, rx_mask);
+	}
 	ssp_write_reg(ssp, SSCR0, sscr0);
 
-	/* set active slot mask */
-	ssp_write_reg(ssp, SSTSA, mask);
-	ssp_write_reg(ssp, SSRSA, mask);
 	return 0;
 }
 
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index fb8d7a7..e984a17 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -2223,17 +2223,20 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_fmt);
 /**
  * snd_soc_dai_set_tdm_slot - configure DAI TDM.
  * @dai: DAI
- * @mask: DAI specific mask representing used slots.
+ * @tx_mask: bitmask representing active TX slots.
+ * @rx_mask: bitmask representing active RX slots.
  * @slots: Number of slots in use.
+ * @slot_width: Width in bits for each slot.
  *
  * Configures a DAI for TDM operation. Both mask and slots are codec and DAI
  * specific.
  */
 int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
-	unsigned int mask, int slots)
+	unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
 {
 	if (dai->ops && dai->ops->set_tdm_slot)
-		return dai->ops->set_tdm_slot(dai, mask, slots);
+		return dai->ops->set_tdm_slot(dai, tx_mask, rx_mask,
+				slots, slot_width);
 	else
 		return -EINVAL;
 }
-- 
1.6.3.3

^ permalink raw reply related	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2009-08-11 12:04 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-06-16  0:44 [PATCH 1/3] ASoC: change set_tdm_slot api to allow slot_width override Daniel Ribeiro
2009-06-16 10:28 ` pHilipp Zabel
2009-08-04 20:55 ` Mark Brown
2009-08-04 23:42   ` Daniel Mack
2009-08-05 16:47     ` mixing audio waves for analysis! Guilherme Longo
2009-08-06 14:36   ` [PATCH 1/3] ASoC: change set_tdm_slot api to allow slot_width override Eric Miao
2009-08-06 15:01     ` Mark Brown
2009-08-06 14:55 Mark Brown
2009-08-06 14:59 ` Daniel Mack
2009-08-11 12:04 ` Mark Brown

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.