On Wed, Mar 11, 2009 at 7:44 PM, Daniel Mack daniel@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.