19
19
#include "../../codecs/mt6359.h"
20
20
#include "../../codecs/rt5682.h"
21
21
#include "../common/mtk-afe-platform-driver.h"
22
+ #include "mt8195-afe-clk.h"
22
23
#include "mt8195-afe-common.h"
23
24
24
25
#define RT1019_CODEC_DAI "HiFi"
@@ -46,6 +47,7 @@ struct mt8195_mt6359_rt1019_rt5682_priv {
46
47
struct snd_soc_jack headset_jack ;
47
48
struct snd_soc_jack dp_jack ;
48
49
struct snd_soc_jack hdmi_jack ;
50
+ struct clk * i2so1_mclk ;
49
51
};
50
52
51
53
static const struct snd_soc_dapm_widget
@@ -92,8 +94,6 @@ static int mt8195_rt5682_etdm_hw_params(struct snd_pcm_substream *substream,
92
94
struct snd_soc_dai * cpu_dai = asoc_rtd_to_cpu (rtd , 0 );
93
95
struct snd_soc_dai * codec_dai = asoc_rtd_to_codec (rtd , 0 );
94
96
unsigned int rate = params_rate (params );
95
- unsigned int mclk_fs_ratio = 128 ;
96
- unsigned int mclk_fs = rate * mclk_fs_ratio ;
97
97
int bitwidth ;
98
98
int ret ;
99
99
@@ -109,25 +109,22 @@ static int mt8195_rt5682_etdm_hw_params(struct snd_pcm_substream *substream,
109
109
return ret ;
110
110
}
111
111
112
- ret = snd_soc_dai_set_pll (codec_dai , RT5682_PLL1 ,
113
- RT5682_PLL1_S_BCLK1 ,
114
- params_rate (params ) * 64 ,
115
- params_rate (params ) * 512 );
112
+ ret = snd_soc_dai_set_pll (codec_dai , RT5682_PLL1 , RT5682_PLL1_S_MCLK ,
113
+ rate * 256 , rate * 512 );
116
114
if (ret ) {
117
115
dev_err (card -> dev , "failed to set pll\n" );
118
116
return ret ;
119
117
}
120
118
121
- ret = snd_soc_dai_set_sysclk (codec_dai ,
122
- RT5682_SCLK_S_PLL1 ,
123
- params_rate (params ) * 512 ,
124
- SND_SOC_CLOCK_IN );
119
+ ret = snd_soc_dai_set_sysclk (codec_dai , RT5682_SCLK_S_PLL1 ,
120
+ rate * 512 , SND_SOC_CLOCK_IN );
125
121
if (ret ) {
126
122
dev_err (card -> dev , "failed to set sysclk\n" );
127
123
return ret ;
128
124
}
129
125
130
- return snd_soc_dai_set_sysclk (cpu_dai , 0 , mclk_fs , SND_SOC_CLOCK_OUT );
126
+ return snd_soc_dai_set_sysclk (cpu_dai , 0 , rate * 256 ,
127
+ SND_SOC_CLOCK_OUT );
131
128
}
132
129
133
130
static const struct snd_soc_ops mt8195_rt5682_etdm_ops = {
@@ -322,8 +319,14 @@ static int mt8195_rt5682_init(struct snd_soc_pcm_runtime *rtd)
322
319
struct mt8195_mt6359_rt1019_rt5682_priv * priv =
323
320
snd_soc_card_get_drvdata (rtd -> card );
324
321
struct snd_soc_jack * jack = & priv -> headset_jack ;
322
+ struct snd_soc_component * cmpnt_afe =
323
+ snd_soc_rtdcom_lookup (rtd , AFE_PCM_NAME );
324
+ struct mtk_base_afe * afe = snd_soc_component_get_drvdata (cmpnt_afe );
325
+ struct mt8195_afe_private * afe_priv = afe -> platform_priv ;
325
326
int ret ;
326
327
328
+ priv -> i2so1_mclk = afe_priv -> clk [MT8195_CLK_TOP_APLL12_DIV2 ];
329
+
327
330
ret = snd_soc_card_jack_new (rtd -> card , "Headset Jack" ,
328
331
SND_JACK_HEADSET | SND_JACK_BTN_0 |
329
332
SND_JACK_BTN_1 | SND_JACK_BTN_2 |
@@ -560,6 +563,48 @@ static const struct snd_soc_ops mt8195_capture_ops = {
560
563
.startup = mt8195_capture_startup ,
561
564
};
562
565
566
+ static int mt8195_set_bias_level_post (struct snd_soc_card * card ,
567
+ struct snd_soc_dapm_context * dapm , enum snd_soc_bias_level level )
568
+ {
569
+ struct snd_soc_component * component = dapm -> component ;
570
+ struct mt8195_mt6359_rt1019_rt5682_priv * priv =
571
+ snd_soc_card_get_drvdata (card );
572
+ int ret ;
573
+
574
+ /*
575
+ * It's required to control mclk directly in the set_bias_level_post
576
+ * function for rt5682 and rt5682s codec, or the unexpected pop happens
577
+ * at the end of playback.
578
+ */
579
+ if (!component ||
580
+ (strcmp (component -> name , RT5682_DEV0_NAME ) &&
581
+ strcmp (component -> name , RT5682S_DEV0_NAME )))
582
+ return 0 ;
583
+
584
+
585
+ switch (level ) {
586
+ case SND_SOC_BIAS_OFF :
587
+ if (!__clk_is_enabled (priv -> i2so1_mclk ))
588
+ return 0 ;
589
+
590
+ clk_disable_unprepare (priv -> i2so1_mclk );
591
+ dev_dbg (card -> dev , "Disable i2so1 mclk\n" );
592
+ break ;
593
+ case SND_SOC_BIAS_ON :
594
+ ret = clk_prepare_enable (priv -> i2so1_mclk );
595
+ if (ret ) {
596
+ dev_err (card -> dev , "Can't enable i2so1 mclk: %d\n" , ret );
597
+ return ret ;
598
+ }
599
+ dev_dbg (card -> dev , "Enable i2so1 mclk\n" );
600
+ break ;
601
+ default :
602
+ break ;
603
+ }
604
+
605
+ return 0 ;
606
+ }
607
+
563
608
enum {
564
609
DAI_LINK_DL2_FE ,
565
610
DAI_LINK_DL3_FE ,
@@ -1199,6 +1244,7 @@ static struct snd_soc_card mt8195_mt6359_rt1019_rt5682_soc_card = {
1199
1244
.num_dapm_widgets = ARRAY_SIZE (mt8195_mt6359_rt1019_rt5682_widgets ),
1200
1245
.dapm_routes = mt8195_mt6359_rt1019_rt5682_routes ,
1201
1246
.num_dapm_routes = ARRAY_SIZE (mt8195_mt6359_rt1019_rt5682_routes ),
1247
+ .set_bias_level_post = mt8195_set_bias_level_post ,
1202
1248
};
1203
1249
1204
1250
static int mt8195_dailink_parse_of (struct snd_soc_card * card , struct device_node * np ,
0 commit comments