On Thu, Apr 28, 2011 at 6:53 AM, Sangbeom Kim <sbkim73@xxxxxxxxxxx> wrote: > Exynos4 pcm block is different from previous one. > Unlike previous one, Exynos4 doesn't have SCLK divider in the pcm block. > For this reason, This patch added quirk handling for Exynos4 pcm cpu driver. > > Signed-off-by: Sangbeom Kim <sbkim73@xxxxxxxxxxx> > --- > Âsound/soc/samsung/pcm.c |  46 +++++++++++++++++++++++++++++----------------- > Â1 files changed, 29 insertions(+), 17 deletions(-) > > diff --git a/sound/soc/samsung/pcm.c b/sound/soc/samsung/pcm.c > index 9c7e8b4..adfb251 100644 > --- a/sound/soc/samsung/pcm.c > +++ b/sound/soc/samsung/pcm.c > @@ -10,7 +10,6 @@ > Â* it under the terms of the GNU General Public License version 2 as > Â* published by the Free Software Foundation. > Â*/ > - > Â#include <linux/clk.h> > Â#include <linux/io.h> > > @@ -128,6 +127,7 @@ struct s3c_pcm_info { > >    Âstruct s3c_dma_params  *dma_playback; >    Âstruct s3c_dma_params  *dma_capture; > +    u32   quirks; > Â}; > > Âstatic struct s3c2410_dma_client s3c_pcm_dma_client_out = { > @@ -278,7 +278,7 @@ static int s3c_pcm_hw_params(struct snd_pcm_substream *substream, >    Âstruct clk *clk; >    Âint sclk_div, sync_div; >    Âunsigned long flags; > -    u32 clkctl; > +    u32 clkctl = 0; > >    Âdev_dbg(pcm->dev, "Entered %s\n", __func__); > > @@ -299,25 +299,34 @@ static int s3c_pcm_hw_params(struct snd_pcm_substream *substream, > >    Âspin_lock_irqsave(&pcm->lock, flags); > > -    /* Get hold of the PCMSOURCE_CLK */ > -    clkctl = readl(regs + S3C_PCM_CLKCTL); > -    if (clkctl & S3C_PCM_CLKCTL_SERCLKSEL_PCLK) > -        clk = pcm->pclk; > -    else > +    if (pcm->quirks == QUIRK_NO_DIV) { >        Âclk = pcm->cclk; > +        if (clk_get_rate(clk) != (pcm->sclk_per_fs*params_rate(params))) { > +            clk_set_rate(clk, pcm->sclk_per_fs*params_rate(params)); > +        } > +        sync_div = clk_get_rate(clk)/(params_rate(params))-1; > +    } > +    else { > +        /* Get hold of the PCMSOURCE_CLK */ > +        clkctl = readl(regs + S3C_PCM_CLKCTL); > +        if (clkctl & S3C_PCM_CLKCTL_SERCLKSEL_PCLK) > +            clk = pcm->pclk; > +        else > +            clk = pcm->cclk; > > -    /* Set the SCLK divider */ > -    sclk_div = clk_get_rate(clk) / pcm->sclk_per_fs / > -                    params_rate(params) / 2 - 1; > +        /* Set the SCLK divider */ > +        sclk_div = clk_get_rate(clk) / pcm->sclk_per_fs / > +                params_rate(params) / 2 - 1; > > -    clkctl &= ~(S3C_PCM_CLKCTL_SCLKDIV_MASK > -            << S3C_PCM_CLKCTL_SCLKDIV_SHIFT); > -    clkctl |= ((sclk_div & S3C_PCM_CLKCTL_SCLKDIV_MASK) > -            << S3C_PCM_CLKCTL_SCLKDIV_SHIFT); > +        clkctl &= ~(S3C_PCM_CLKCTL_SCLKDIV_MASK > +                << S3C_PCM_CLKCTL_SCLKDIV_SHIFT); > +        clkctl |= ((sclk_div & S3C_PCM_CLKCTL_SCLKDIV_MASK) > +                << S3C_PCM_CLKCTL_SCLKDIV_SHIFT); > > -    /* Set the SYNC divider */ > -    sync_div = pcm->sclk_per_fs - 1; > +        sync_div = pcm->sclk_per_fs - 1; > +    } > > +    /* Set the SYNC divider */ >    Âclkctl &= ~(S3C_PCM_CLKCTL_SYNCDIV_MASK >                Â<< S3C_PCM_CLKCTL_SYNCDIV_SHIFT); >    Âclkctl |= ((sync_div & S3C_PCM_CLKCTL_SYNCDIV_MASK) > @@ -330,7 +339,6 @@ static int s3c_pcm_hw_params(struct snd_pcm_substream *substream, >    Âdev_dbg(pcm->dev, "PCMSOURCE_CLK-%lu SCLK=%ufs SCLK_DIV=%d SYNC_DIV=%d\n", >                Âclk_get_rate(clk), pcm->sclk_per_fs, >                Âsclk_div, sync_div); > - >    Âreturn 0; > Â} > > @@ -494,6 +502,7 @@ static __devinit int s3c_pcm_dev_probe(struct platform_device *pdev) >    Âstruct s3c_pcm_info *pcm; >    Âstruct resource *mem_res, *dmatx_res, *dmarx_res; >    Âstruct s3c_audio_pdata *pcm_pdata; > +    struct samsung_i2s *pcm_cfg; Oh dear, perhaps you forgot to test before sending ? -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html