1414#include <sound/soc-dapm.h>
1515#include <linux/pm_runtime.h>
1616#include <linux/of_platform.h>
17+ #include <linux/pm_clock.h>
1718#include <sound/tlv.h>
1819
1920#include "lpass-macro-common.h"
@@ -2638,15 +2639,15 @@ static const struct snd_soc_dapm_route wsa_audio_map[] = {
26382639static int wsa_swrm_clock (struct wsa_macro * wsa , bool enable )
26392640{
26402641 struct regmap * regmap = wsa -> regmap ;
2642+ int ret ;
26412643
2642- if (enable ) {
2643- int ret ;
2644+ ret = pm_runtime_get_sync (wsa -> dev );
2645+ if (ret < 0 ) {
2646+ pm_runtime_put_noidle (wsa -> dev );
2647+ return ret ;
2648+ }
26442649
2645- ret = clk_prepare_enable (wsa -> mclk );
2646- if (ret ) {
2647- dev_err (wsa -> dev , "failed to enable mclk\n" );
2648- return ret ;
2649- }
2650+ if (enable ) {
26502651 wsa_macro_mclk_enable (wsa , true);
26512652
26522653 regmap_update_bits (regmap , CDC_WSA_CLK_RST_CTRL_SWR_CONTROL ,
@@ -2657,9 +2658,10 @@ static int wsa_swrm_clock(struct wsa_macro *wsa, bool enable)
26572658 regmap_update_bits (regmap , CDC_WSA_CLK_RST_CTRL_SWR_CONTROL ,
26582659 CDC_WSA_SWR_CLK_EN_MASK , 0 );
26592660 wsa_macro_mclk_enable (wsa , false);
2660- clk_disable_unprepare (wsa -> mclk );
26612661 }
26622662
2663+ pm_runtime_mark_last_busy (wsa -> dev );
2664+ pm_runtime_put_autosuspend (wsa -> dev );
26632665 return 0 ;
26642666}
26652667
@@ -2883,27 +2885,26 @@ static int wsa_macro_probe(struct platform_device *pdev)
28832885
28842886 /* set MCLK and NPL rates */
28852887 clk_set_rate (wsa -> mclk , WSA_MACRO_MCLK_FREQ );
2886- clk_set_rate (wsa -> npl , WSA_MACRO_MCLK_FREQ );
2888+ if (wsa -> npl )
2889+ clk_set_rate (wsa -> npl , WSA_MACRO_MCLK_FREQ );
28872890
2888- ret = clk_prepare_enable ( wsa -> macro );
2891+ ret = devm_pm_clk_create ( dev );
28892892 if (ret )
2890- goto err ;
2893+ return ret ;
28912894
2892- ret = clk_prepare_enable ( wsa -> dcodec );
2893- if (ret )
2894- goto err_dcodec ;
2895+ ret = of_pm_clk_add_clks ( dev );
2896+ if (ret < 0 )
2897+ return ret ;
28952898
2896- ret = clk_prepare_enable ( wsa -> mclk );
2897- if ( ret )
2898- goto err_mclk ;
2899+ pm_runtime_set_autosuspend_delay ( dev , 3000 );
2900+ pm_runtime_use_autosuspend ( dev );
2901+ pm_runtime_enable ( dev ) ;
28992902
2900- ret = clk_prepare_enable (wsa -> npl );
2901- if (ret )
2902- goto err_npl ;
29032903
2904- ret = clk_prepare_enable (wsa -> fsgen );
2905- if (ret )
2906- goto err_fsgen ;
2904+ ret = pm_runtime_resume_and_get (dev );
2905+ if (ret < 0 ) {
2906+ goto err_rpm_disable ;
2907+ }
29072908
29082909 /* reset swr ip */
29092910 regmap_update_bits (wsa -> regmap , CDC_WSA_CLK_RST_CTRL_SWR_CONTROL ,
@@ -2920,44 +2921,26 @@ static int wsa_macro_probe(struct platform_device *pdev)
29202921 wsa_macro_dai ,
29212922 ARRAY_SIZE (wsa_macro_dai ));
29222923 if (ret )
2923- goto err_clkout ;
2924-
2925- pm_runtime_set_autosuspend_delay (dev , 3000 );
2926- pm_runtime_use_autosuspend (dev );
2927- pm_runtime_mark_last_busy (dev );
2928- pm_runtime_set_active (dev );
2929- pm_runtime_enable (dev );
2924+ goto err_rpm_put ;
29302925
29312926 ret = wsa_macro_register_mclk_output (wsa );
29322927 if (ret )
2933- goto err_clkout ;
2928+ goto err_rpm_put ;
29342929
2935- return 0 ;
2930+ pm_runtime_mark_last_busy (dev );
2931+ pm_runtime_put_autosuspend (dev );
29362932
2937- err_clkout :
2938- clk_disable_unprepare (wsa -> fsgen );
2939- err_fsgen :
2940- clk_disable_unprepare (wsa -> npl );
2941- err_npl :
2942- clk_disable_unprepare (wsa -> mclk );
2943- err_mclk :
2944- clk_disable_unprepare (wsa -> dcodec );
2945- err_dcodec :
2946- clk_disable_unprepare (wsa -> macro );
2947- err :
2933+ return 0 ;
2934+ err_rpm_put :
2935+ pm_runtime_put_noidle (dev );
2936+ err_rpm_disable :
2937+ pm_runtime_disable (dev );
29482938 return ret ;
2949-
29502939}
29512940
29522941static void wsa_macro_remove (struct platform_device * pdev )
29532942{
2954- struct wsa_macro * wsa = dev_get_drvdata (& pdev -> dev );
2955-
2956- clk_disable_unprepare (wsa -> macro );
2957- clk_disable_unprepare (wsa -> dcodec );
2958- clk_disable_unprepare (wsa -> mclk );
2959- clk_disable_unprepare (wsa -> npl );
2960- clk_disable_unprepare (wsa -> fsgen );
2943+ pm_runtime_disable (& pdev -> dev );
29612944}
29622945
29632946static int wsa_macro_runtime_suspend (struct device * dev )
@@ -2967,46 +2950,20 @@ static int wsa_macro_runtime_suspend(struct device *dev)
29672950 regcache_cache_only (wsa -> regmap , true);
29682951 regcache_mark_dirty (wsa -> regmap );
29692952
2970- clk_disable_unprepare (wsa -> fsgen );
2971- clk_disable_unprepare (wsa -> npl );
2972- clk_disable_unprepare (wsa -> mclk );
2973-
2974- return 0 ;
2953+ return pm_clk_suspend (dev );
29752954}
29762955
29772956static int wsa_macro_runtime_resume (struct device * dev )
29782957{
29792958 struct wsa_macro * wsa = dev_get_drvdata (dev );
29802959 int ret ;
29812960
2982- ret = clk_prepare_enable (wsa -> mclk );
2983- if (ret ) {
2984- dev_err (dev , "unable to prepare mclk\n" );
2985- return ret ;
2986- }
2987-
2988- ret = clk_prepare_enable (wsa -> npl );
2989- if (ret ) {
2990- dev_err (dev , "unable to prepare mclkx2\n" );
2991- goto err_npl ;
2992- }
2993-
2994- ret = clk_prepare_enable (wsa -> fsgen );
2995- if (ret ) {
2996- dev_err (dev , "unable to prepare fsgen\n" );
2997- goto err_fsgen ;
2998- }
2999-
30002961 regcache_cache_only (wsa -> regmap , false);
3001- regcache_sync (wsa -> regmap );
3002-
3003- return 0 ;
3004- err_fsgen :
3005- clk_disable_unprepare (wsa -> npl );
3006- err_npl :
3007- clk_disable_unprepare (wsa -> mclk );
2962+ ret = pm_clk_resume (dev );
2963+ if (ret )
2964+ return ret ;
30082965
3009- return ret ;
2966+ return regcache_sync ( wsa -> regmap ) ;
30102967}
30112968
30122969static const struct dev_pm_ops wsa_macro_pm_ops = {
0 commit comments