[alsa-devel] [PATCH 3/3][RFC] ASoC: pxa-ssp: Don't use SSCR0_SerClkDiv and SSCR0_SCR

pHilipp Zabel philipp.zabel at gmail.com
Wed Mar 11 22:10:27 CET 2009


On Wed, Mar 11, 2009 at 7:44 PM, Daniel Mack <daniel at caiaq.de> wrote:
> On Wed, Mar 11, 2009 at 07:17:00PM +0100, Philipp Zabel wrote:
>> As soon as CONFIG_PXA25x is enabled, those macros only handle the PXA25x_SSP
>> case, which is wrong most of the time (and always wrong on >=PXA27x).
>
> Ah, I just (while reading this header file) wondered how this is
> supposed to work :)
>
>> @@ -287,10 +287,17 @@ static void ssp_set_scr(struct ssp_priv *priv, u32 div)
>>  {
>>       struct ssp_dev *dev = &priv->dev;
>>       struct ssp_device *ssp = dev->ssp;
>> -     u32 sscr0 = ssp_read_reg(dev->ssp, SSCR0) & ~SSCR0_SCR;
>> +     u32 sscr0 = ssp_read_reg(dev->ssp, SSCR0);
>>
>>       priv->scr_div = div;
>> -     ssp_write_reg(ssp, SSCR0, (sscr0 | SSCR0_SerClkDiv(div)));
>> +     if (ssp->type == PXA25x_SSP) {
>> +             sscr0 &= ~0x0000ff00;        /* SSCR0_SCR */
>> +             sscr0 |= ((div - 2)/2) << 8; /* SSCR0_SerClkDiv(div) */
>> +     } else {
>> +             sscr0 &= ~0x000fff00;        /* SSCR0_SCR */
>> +             sscr0 |= (div - 1) << 8;     /* SSCR0_SerClkDiv(div) */
>> +     }
>> +     ssp_write_reg(ssp, SSCR0, sscr0);
>>  }
>
> Then we need something like ssp_get_scr() as well to cover my special
> case which uses SSCR0_SCR and SSCR0_SerClkDiv() again as you proposed ;)

Aren't I clever... How about something like this:

---
 sound/soc/pxa/pxa-ssp.c |   30 ++++++++++++++++++++++++++----
 1 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c
index 3cde686..245063b 100644
--- a/sound/soc/pxa/pxa-ssp.c
+++ b/sound/soc/pxa/pxa-ssp.c
@@ -284,9 +284,30 @@ static int pxa_ssp_resume(struct snd_soc_dai *cpu_dai)
 static void ssp_set_scr(struct ssp_dev *dev, u32 div)
 {
 	struct ssp_device *ssp = dev->ssp;
-	u32 sscr0 = ssp_read_reg(dev->ssp, SSCR0) & ~SSCR0_SCR;
+	u32 sscr0 = ssp_read_reg(ssp, SSCR0);
+
+	if (cpu_is_pxa25x() && ssp->type == PXA25x_SSP) {
+		sscr0 &= ~0x0000ff00;
+		sscr0 |= ((div - 2)/2) << 8;
+	} else {
+		sscr0 &= ~0x000fff00;
+		sscr0 |= (div - 1) << 8;
+	}
+	ssp_write_reg(ssp, SSCR0, sscr0);
+}

-	ssp_write_reg(ssp, SSCR0, (sscr0 | SSCR0_SerClkDiv(div)));
+/**
+ * ssp_get_clkdiv - get SSP clock divider
+ */
+static u32 ssp_get_scr(struct ssp_dev *dev)
+{
+	struct ssp_device *ssp = dev->ssp;
+	u32 sscr0 = ssp_read_reg(ssp, SSCR0);
+
+	if (cpu_is_pxa25x() && ssp->type == PXA25x_SSP)
+		return ((sscr0 >> 8) & 0xff) * 2 + 2;
+	else
+		return ((sscr0 >> 8) & 0xfff) + 1;
 }

 /*
@@ -668,8 +689,7 @@ static int pxa_ssp_hw_params(struct
snd_pcm_substream *substream,
 	case SND_SOC_DAIFMT_I2S:
 	       sspsp = ssp_read_reg(ssp, SSPSP);

-		if (((sscr0 & SSCR0_SCR) == SSCR0_SerClkDiv(4)) &&
-		     (width == 16)) {
+		if (ssp_get_scr(ssp) == 4) && (width == 16)) {
 			/* This is a special case where the bitclk is 64fs
 			* and we're not dealing with 2*32 bits of audio
 			* samples.
-- 
1.6.2


More information about the Alsa-devel mailing list