On Wed, Dec 31, 2014 at 11:39:12AM +0800, Zidan Wang wrote:
> wm8960 codec driver missing configure its bit clock and frame clock, so add
> support for it. It will calculate a appropriate frequency dividing ratio
> according to the system clock, bit clock and frame clock, then set the
> corresponding registers.
> 
> Signed-off-by: Zidan Wang <b50...@freescale.com>
> ---
>  sound/soc/codecs/wm8960.c | 108 
> ++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 108 insertions(+)
> 
> diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c
> index 1a5f47b..86a5489 100644
> --- a/sound/soc/codecs/wm8960.c
> +++ b/sound/soc/codecs/wm8960.c
> @@ -127,6 +127,8 @@ struct wm8960_priv {
>       struct snd_soc_dapm_widget *out3;
>       bool deemph;
>       int playback_fs;
> +     int bclk;
> +     int sysclk;
>       struct wm8960_data pdata;
>  };
>  
> @@ -563,6 +565,79 @@ static struct {
>       {  8000, 5 },
>  };
>  
> +/* Multiply 256 for internal 256 div */
> +static const int dac_divs[] = { 256, 384, 512, 768, 1024, 1408, 1536 };
> +
> +/* Multiply 10 to eliminate decimials */
> +static const int bclk_divs[] = {
> +     10, 15, 20, 30, 40, 55, 60, 80, 110,
> +     120, 160, 220, 240, 320, 320, 320
> +};
> +
> +static void wm8960_configure_clocking(struct snd_soc_codec *codec,
> +             int stream, int lrclk)
> +{
> +     struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
> +     u16 iface1 = snd_soc_read(codec, WM8960_IFACE1);
> +     u16 iface2 = snd_soc_read(codec, WM8960_IFACE2);
> +     int i, j;
> +
> +     if (!(iface1 & (1<<6))) {
> +             dev_dbg(codec->dev,
> +                     "Codec is slave mode, no need to configure clock\n");
> +             return;
> +     }
> +
> +     if (!wm8960->sysclk) {
> +             dev_dbg(codec->dev, "No SYSCLK configured\n");
> +             return;
> +     }
> +
> +     if (!wm8960->bclk || !lrclk) {
> +             dev_dbg(codec->dev, "No audio clocks configured\n");
> +             return;
> +     }
> +
> +     for (i = 0; i < ARRAY_SIZE(dac_divs); ++i) {
> +             if (wm8960->sysclk == lrclk * dac_divs[i]) {
> +                     for (j = 0; j < ARRAY_SIZE(bclk_divs); ++j) {
> +                             if (wm8960->sysclk ==  wm8960->bclk *
> +                                             bclk_divs[j] / 10) {
> +                                     /* configure frame clock */
> +                                     if (iface2 & (1<<6))
> +                                             /* If ADCLRC configure as GPIO
> +                                              * pin, DACLRC pin is used as
> +                                              * a frame clock for ADCs and
> +                                              * DACs */
> +                                             snd_soc_update_bits(codec,
> +                                                             WM8960_CLOCK1,
> +                                                             0x7 << 3,
> +                                                             i << 3);

The indentation is getting pretty horrific here can we do some
things to ease that a little. You could flip the polarity of the
two if statements and use continues instead for example that
would help a lot.

Thanks,
Charles

> +                                     else if (SNDRV_PCM_STREAM_PLAYBACK
> +                                                             == stream)
> +                                             snd_soc_update_bits(codec,
> +                                                             WM8960_CLOCK1,
> +                                                             0x7 << 3,
> +                                                             i << 3);
> +                                     else if (SNDRV_PCM_STREAM_CAPTURE
> +                                                             == stream)
> +                                             snd_soc_update_bits(codec,
> +                                                             WM8960_CLOCK1,
> +                                                             0x7 << 6,
> +                                                             i << 6);
> +
> +                                     /* configure bit clock */
> +                                     snd_soc_update_bits(codec,
> +                                                     WM8960_CLOCK2, 0xf, j);
> +                                     return;
> +                             }
> +                     }
> +             }
> +     }
> +
> +     dev_err(codec->dev, "Unsupported sysclk %d\n", wm8960->sysclk);
> +}
> +
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to