Alsa-Devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Mack <daniel@caiaq.de>
To: alsa-devel@alsa-project.org
Cc: Philipp Zabel <philipp.zabel@gmail.com>,
	Mark Brown <broonie@opensource.wolfsonmicro.com>,
	Tim Ruetz <tim@caiaq.de>, Liam Girdwood <lrg@kernel.org>
Subject: [PATCH 4/4] pxa-ssp: switch from network mode to psp
Date: Wed,  4 Mar 2009 21:17:00 +0100	[thread overview]
Message-ID: <1236197820-21022-4-git-send-email-daniel@caiaq.de> (raw)
In-Reply-To: <1236197820-21022-3-git-send-email-daniel@caiaq.de>

This patch uses the SSP's PSP functionality to provide I2S timings. The
particular problem is that even though the datasheets state it should be
possbible, there is no mode which uses the network feature with its
associated time slots in a sane way to do what we need.

Hence, in order to have full 64 bit I2S on the wire, we need to fiddle
around with the SSP and the timing paramters a lot. There are some
constants left in the code which can't be replaced by names because the
true meaning of their registers remains nebulous.

Signed-off-by: Daniel Mack <daniel@caiaq.de>
Signed-off-by: Tim Ruetz <tim@caiaq.de>
Cc: Mark Brown <broonie@opensource.wolfsonmicro.com>
Cc: Liam Girdwood <lrg@kernel.org>
Cc: Philipp Zabel <philipp.zabel@gmail.com>
---
 sound/soc/pxa/pxa-ssp.c |   39 +++++++++++++++++++++------------------
 1 files changed, 21 insertions(+), 18 deletions(-)

diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c
index 45fb600..97f11d6 100644
--- a/sound/soc/pxa/pxa-ssp.c
+++ b/sound/soc/pxa/pxa-ssp.c
@@ -319,6 +319,7 @@ static int pxa_ssp_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
 		break;
 	case PXA_SSP_CLK_EXT:
 		priv->sysclk = freq;
+		ssp_set_scr(&priv->dev, 4);
 		sscr0 |= SSCR0_ECS;
 		break;
 	case PXA_SSP_CLK_NET:
@@ -551,17 +552,13 @@ static int pxa_ssp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
 
 	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
 	case SND_SOC_DAIFMT_I2S:
-		sscr0 |= SSCR0_MOD | SSCR0_PSP;
+		sscr0 |= SSCR0_PSP;
 		sscr1 |= SSCR1_RWOT | SSCR1_TRAIL;
 
 		switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
 		case SND_SOC_DAIFMT_NB_NF:
-			sspsp |= SSPSP_FSRT;
 			break;
 		case SND_SOC_DAIFMT_NB_IF:
-			sspsp |= SSPSP_SFRMP | SSPSP_FSRT;
-			break;
-		case SND_SOC_DAIFMT_IB_IF:
 			sspsp |= SSPSP_SFRMP;
 			break;
 		default:
@@ -652,33 +649,39 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream,
 		break;
 	case SNDRV_PCM_FORMAT_S24_LE:
 		sscr0 |= (SSCR0_EDSS | SSCR0_DataSize(8));
-		/* we must be in network mode (2 slots) for 24 bit stereo */
 		break;
 	case SNDRV_PCM_FORMAT_S32_LE:
 		sscr0 |= (SSCR0_EDSS | SSCR0_DataSize(16));
-		/* we must be in network mode (2 slots) for 32 bit stereo */
 		break;
 	}
 	ssp_write_reg(ssp, SSCR0, sscr0);
 
 	switch (priv->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
 	case SND_SOC_DAIFMT_I2S:
-		/* Cleared when the DAI format is set */
-		sspsp = ssp_read_reg(ssp, SSPSP) | SSPSP_SFRMWDTH(width);
+		sspsp = ssp_read_reg(ssp, SSPSP);
+
+		switch (priv->dai_fmt & SND_SOC_DAIFMT_FRAME_FORMAT_MASK) {
+		case SND_SOC_DAIFMT_FF_I2S_32:
+			/* These values are all found out by trying and
+			 * failing a lot. PXA's SSP is all black magic and
+			 * does not work like described in any datasheet.
+			 */
+			sspsp |= SSPSP_SFRMWDTH(32);
+			sspsp |= SSPSP_SFRMDLY(32 * 2);
+			sspsp |= SSPSP_EDMYSTOP(3);
+			sspsp |= SSPSP_DMYSTOP(3);
+			sspsp |= SSPSP_DMYSTRT(1);
+			break;
+		default:
+			/* Cleared when the DAI format is set */
+			sspsp |= SSPSP_SFRMWDTH(width);
+			break;
+		}
 		ssp_write_reg(ssp, SSPSP, sspsp);
-		break;
 	default:
 		break;
 	}
 
-	/* We always use a network mode so we always require TDM slots
-	 * - complain loudly and fail if they've not been set up yet.
-	 */
-	if (!(ssp_read_reg(ssp, SSTSA) & 0xf)) {
-		dev_err(&ssp->pdev->dev, "No TDM timeslot configured\n");
-		return -EINVAL;
-	}
-
 	dump_registers(ssp);
 
 	return 0;
-- 
1.6.1.3

  reply	other threads:[~2009-03-04 20:17 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-03-04 20:15 PXA SSP and external clocked I2S again Daniel Mack
2009-03-04 20:16 ` [PATCH 1/4] pxa-ssp: fix name of register bit Daniel Mack
2009-03-04 20:16   ` [PATCH 2/4] soc-dai: add bitfields for hardware I2S formats Daniel Mack
2009-03-04 20:16     ` [PATCH 3/4] pxa-ssp: don't touch ssp registers when stream is running Daniel Mack
2009-03-04 20:17       ` Daniel Mack [this message]
2009-03-04 20:56         ` [PATCH 4/4] pxa-ssp: switch from network mode to psp pHilipp Zabel
2009-03-04 23:03           ` Daniel Mack
2009-03-05 10:36             ` Daniel Mack
2009-03-05 11:21             ` Mark Brown
2009-03-05 11:26               ` Daniel Mack
2009-03-05 16:01             ` pHilipp Zabel
2009-03-05 13:21         ` Daniel Mack
2009-03-05 13:34           ` Mark Brown
2009-03-04 20:33       ` [PATCH 3/4] pxa-ssp: don't touch ssp registers when stream is running Mark Brown
2009-03-04 20:39         ` Daniel Mack
2009-03-04 20:42           ` Mark Brown
2009-03-05 10:23             ` Daniel Mack
2009-03-10 15:41               ` Daniel Mack
2009-03-10 15:56                 ` Mark Brown
2009-03-04 22:30     ` [PATCH 2/4] soc-dai: add bitfields for hardware I2S formats Mark Brown
2009-03-04 23:12       ` Daniel Mack
2009-03-05 10:53         ` Mark Brown
2009-03-05 11:31           ` Daniel Mack
2009-03-05 12:03             ` Mark Brown
2009-03-05 12:55               ` Daniel Mack
2009-03-05 12:57                 ` Mark Brown
2009-03-05 15:58                 ` pHilipp Zabel
2009-03-05 11:40   ` [PATCH 1/4] pxa-ssp: fix name of register bit Mark Brown

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1236197820-21022-4-git-send-email-daniel@caiaq.de \
    --to=daniel@caiaq.de \
    --cc=alsa-devel@alsa-project.org \
    --cc=broonie@opensource.wolfsonmicro.com \
    --cc=lrg@kernel.org \
    --cc=philipp.zabel@gmail.com \
    --cc=tim@caiaq.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox