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

Daniel Mack daniel at caiaq.de
Thu Mar 12 01:46:39 CET 2009


On Wed, Mar 11, 2009 at 10:10:27PM +0100, pHilipp Zabel wrote:
> > 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:

Jep, look good to me.

(Just for the reference - this one needs to be applied on top of my last
 'network vs psp mode' patch, otherwise the second hunk won't apply).

Thanks,
Daniel


> ---
>  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