<p dir="ltr">Hi</p>
<p dir="ltr">Il 12/set/2014 14:18 "Shengjiu Wang" <<a href="mailto:shengjiu.wang@freescale.com">shengjiu.wang@freescale.com</a>> ha scritto:<br>
><br>
> Check if ipg clock is in clock-names property, then we can move the<br>
> ipg clock enable and disable operation to startup and shutdown, that<br>
> is only enable ipg clock when ssi is working and keep clock is disabled<br>
> when ssi is in idle.<br>
> But when the checking is failed, remain the clock control as before.<br>
><br>
> Signed-off-by: Shengjiu Wang <<a href="mailto:shengjiu.wang@freescale.com">shengjiu.wang@freescale.com</a>><br>
> ---<br>
> V3 change log:<br>
> update patch according Nicolin and markus's comments<br>
><br>
><br>
>  sound/soc/fsl/fsl_ssi.c |   53 ++++++++++++++++++++++++++++++++++++++++-------<br>
>  1 file changed, 45 insertions(+), 8 deletions(-)<br>
><br>
> diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c<br>
> index 2fc3e66..6d1dfd5 100644<br>
> --- a/sound/soc/fsl/fsl_ssi.c<br>
> +++ b/sound/soc/fsl/fsl_ssi.c<br>
> @@ -169,6 +169,7 @@ struct fsl_ssi_private {<br>
>         u8 i2s_mode;<br>
>         bool use_dma;<br>
>         bool use_dual_fifo;<br>
> +       bool has_ipg_clk_name;<br>
>         unsigned int fifo_depth;<br>
>         struct fsl_ssi_rxtx_reg_val rxtx_reg_val;<br>
><br>
> @@ -530,6 +531,11 @@ static int fsl_ssi_startup(struct snd_pcm_substream *substream,<br>
>         struct snd_soc_pcm_runtime *rtd = substream->private_data;<br>
>         struct fsl_ssi_private *ssi_private =<br>
>                 snd_soc_dai_get_drvdata(rtd->cpu_dai);<br>
> +       int ret;<br>
> +<br>
> +       ret = clk_prepare_enable(ssi_private->clk);<br>
> +       if (ret)<br>
> +               return ret;<br>
><br>
>         /* When using dual fifo mode, it is safer to ensure an even period<br>
>          * size. If appearing to an odd number while DMA always starts its<br>
> @@ -544,6 +550,21 @@ static int fsl_ssi_startup(struct snd_pcm_substream *substream,<br>
>  }<br>
><br>
>  /**<br>
> + * fsl_ssi_shutdown: shutdown the SSI<br>
> + *<br>
> + */<br>
> +static void fsl_ssi_shutdown(struct snd_pcm_substream *substream,<br>
> +                             struct snd_soc_dai *dai)<br>
> +{<br>
> +       struct snd_soc_pcm_runtime *rtd = substream->private_data;<br>
> +       struct fsl_ssi_private *ssi_private =<br>
> +               snd_soc_dai_get_drvdata(rtd->cpu_dai);<br>
> +<br>
> +       clk_disable_unprepare(ssi_private->clk);<br>
> +<br>
> +}<br>
> +<br>
> +/**<br>
>   * fsl_ssi_set_bclk - configure Digital Audio Interface bit clock<br>
>   *<br>
>   * Note: This function can be only called when using SSI as DAI master<br>
> @@ -1043,6 +1064,7 @@ static int fsl_ssi_dai_probe(struct snd_soc_dai *dai)<br>
><br>
>  static const struct snd_soc_dai_ops fsl_ssi_dai_ops = {<br>
>         .startup        = fsl_ssi_startup,<br>
> +       .shutdown       = fsl_ssi_shutdown,<br>
>         .hw_params      = fsl_ssi_hw_params,<br>
>         .hw_free        = fsl_ssi_hw_free,<br>
>         .set_fmt        = fsl_ssi_set_dai_fmt,<br>
> @@ -1168,17 +1190,22 @@ static int fsl_ssi_imx_probe(struct platform_device *pdev,<br>
>         u32 dmas[4];<br>
>         int ret;<br>
><br>
> -       ssi_private->clk = devm_clk_get(&pdev->dev, NULL);<br>
> +       if (ssi_private->has_ipg_clk_name)<br>
> +               ssi_private->clk = devm_clk_get(&pdev->dev, "ipg");<br>
> +       else<br>
> +               ssi_private->clk = devm_clk_get(&pdev->dev, NULL);<br>
>         if (IS_ERR(ssi_private->clk)) {<br>
>                 ret = PTR_ERR(ssi_private->clk);<br>
>                 dev_err(&pdev->dev, "could not get clock: %d\n", ret);<br>
>                 return ret;<br>
>         }<br>
><br>
> -       ret = clk_prepare_enable(ssi_private->clk);<br>
> -       if (ret) {<br>
> -               dev_err(&pdev->dev, "clk_prepare_enable failed: %d\n", ret);<br>
> -               return ret;<br>
> +       if (!ssi_private->has_ipg_clk_name) {<br>
> +               ret = clk_prepare_enable(ssi_private->clk);<br>
> +               if (ret) {<br>
> +                       dev_err(&pdev->dev, "clk_prepare_enable failed: %d\n", ret);<br>
> +                       return ret;<br>
> +               }<br>
>         }<br>
><br>
>         /* For those SLAVE implementations, we ingore non-baudclk cases<br>
> @@ -1236,8 +1263,9 @@ static int fsl_ssi_imx_probe(struct platform_device *pdev,<br>
>         return 0;<br>
><br>
>  error_pcm:<br>
> -       clk_disable_unprepare(ssi_private->clk);<br>
><br>
> +       if (!ssi_private->has_ipg_clk_name)<br>
> +               clk_disable_unprepare(ssi_private->clk);<br>
>         return ret;<br>
>  }<br>
><br>
> @@ -1246,7 +1274,8 @@ static void fsl_ssi_imx_clean(struct platform_device *pdev,<br>
>  {<br>
>         if (!ssi_private->use_dma)<br>
>                 imx_pcm_fiq_exit(pdev);<br>
> -       clk_disable_unprepare(ssi_private->clk);<br>
> +       if (!ssi_private->has_ipg_clk_name)<br>
> +               clk_disable_unprepare(ssi_private->clk);<br>
>  }<br>
><br>
>  static int fsl_ssi_probe(struct platform_device *pdev)<br>
> @@ -1321,8 +1350,16 @@ static int fsl_ssi_probe(struct platform_device *pdev)<br>
>                 return -ENOMEM;<br>
>         }<br>
><br>
> -       ssi_private->regs = devm_regmap_init_mmio(&pdev->dev, iomem,<br>
> +       ret = of_property_match_string(np, "clock-names", "ipg");<br>
> +       if (ret < 0) {<br>
> +               ssi_private->has_ipg_clk_name = false;</p>
<p dir="ltr">It's false already.</p>
<p dir="ltr">Michael<br></p>
<p dir="ltr">> +               ssi_private->regs = devm_regmap_init_mmio(&pdev->dev, iomem,<br>
>                         &fsl_ssi_regconfig);<br>
> +       } else {<br>
> +               ssi_private->has_ipg_clk_name = true;<br>
> +               ssi_private->regs = devm_regmap_init_mmio_clk(&pdev->dev,<br>
> +                       "ipg", iomem, &fsl_ssi_regconfig);<br>
> +       }<br>
>         if (IS_ERR(ssi_private->regs)) {<br>
>                 dev_err(&pdev->dev, "Failed to init register map\n");<br>
>                 return PTR_ERR(ssi_private->regs);<br>
> --<br>
> 1.7.9.5<br>
><br>
> _______________________________________________<br>
> Alsa-devel mailing list<br>
> <a href="mailto:Alsa-devel@alsa-project.org">Alsa-devel@alsa-project.org</a><br>
> <a href="http://mailman.alsa-project.org/mailman/listinfo/alsa-devel">http://mailman.alsa-project.org/mailman/listinfo/alsa-devel</a><br>
</p>