[alsa-devel] [PATCH v3 1/4] ASoC: DMIC: Adding the OMAP DMIC driver

Varadarajan, Charulatha charu at ti.com
Fri Jan 28 09:45:36 CET 2011


<<snip>>

> +
> +static int omap_dmic_set_dai_sysclk(struct snd_soc_dai *dai,
> +                                   int clk_id, unsigned int freq,
> +                                   int dir)
> +{
> +       struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai);
> +       struct clk *dmic_clk, *parent_clk;
> +       int ret = 0;
> +
> +       dmic_clk = clk_get(NULL, "dmic_fck");

It is preferred to use device pointer. instead of NULL.
(Applicable elsewhere)

> +       if (IS_ERR(dmic_clk))
> +               return -ENODEV;
> +
> +       switch (clk_id) {
> +       case OMAP_DMIC_SYSCLK_PAD_CLKS:
> +               parent_clk = clk_get(NULL, "pad_clks_ck");
> +               if (IS_ERR(parent_clk)) {
> +                       ret = -ENODEV;
> +                       goto err_par;
> +               }
> +               break;
> +       case OMAP_DMIC_SYSCLK_SLIMBLUS_CLKS:
> +               parent_clk = clk_get(NULL, "slimbus_clk");
> +               if (IS_ERR(parent_clk)) {
> +                       ret = -ENODEV;
> +                       goto err_par;
> +               }
> +               break;
> +       case OMAP_DMIC_SYSCLK_SYNC_MUX_CLKS:
> +               parent_clk = clk_get(NULL, "dmic_sync_mux_ck");
> +               if (IS_ERR(parent_clk)) {
> +                       ret = -ENODEV;
> +                       goto err_par;
> +               }
> +               break;
> +       default:
> +               dev_err(dai->dev, "clk_id not supported %d\n", clk_id);
> +               ret = -EINVAL;
> +               goto err_par;
> +       }
> +
> +       if (dmic->sysclk != clk_id) {
> +               /* reparent not allowed if a stream is ongoing */
> +               if (dmic->active > 1) {
> +                       ret = -EBUSY;
> +                       goto err_busy;
> +               }
> +
> +               /* disable clock while reparenting */
> +               if (dmic->active == 1)
> +                       pm_runtime_put_sync(dmic->dev);
> +
> +               ret = clk_set_parent(dmic_clk, parent_clk);
> +
> +               if (dmic->active == 1)
> +                       pm_runtime_get_sync(dmic->dev);
> +
> +               dmic->sysclk = clk_id;
> +       }
> +
> +       dmic->clk_freq = clk_get_rate(dmic_clk);
> +
> +err_busy:
> +       clk_put(parent_clk);
> +err_par:
> +       clk_put(dmic_clk);
> +
> +       return ret;
> +}
> +

<<snip>>


More information about the Alsa-devel mailing list