27
27
#include "../../codecs/wm5102.h"
28
28
#include "../atom/sst-atom-controls.h"
29
29
30
- #define MCLK_FREQ 25000000
31
-
32
30
#define WM5102_MAX_SYSCLK_4K 49152000 /* max sysclk for 4K family */
33
31
#define WM5102_MAX_SYSCLK_11025 45158400 /* max sysclk for 11.025K family */
34
32
35
33
struct byt_wm5102_private {
36
34
struct snd_soc_jack jack ;
37
35
struct clk * mclk ;
38
36
struct gpio_desc * spkvdd_en_gpio ;
37
+ int mclk_freq ;
39
38
};
40
39
41
40
/* Bits 0-15 are reserved for things like an input-map */
42
41
#define BYT_WM5102_SSP2 BIT(16)
42
+ #define BYT_WM5102_MCLK_19_2MHZ BIT(17)
43
43
44
44
static unsigned long quirk ;
45
45
@@ -51,6 +51,8 @@ static void log_quirks(struct device *dev)
51
51
{
52
52
if (quirk & BYT_WM5102_SSP2 )
53
53
dev_info_once (dev , "quirk SSP2 enabled" );
54
+ if (quirk & BYT_WM5102_MCLK_19_2MHZ )
55
+ dev_info_once (dev , "quirk MCLK 19.2MHz enabled" );
54
56
}
55
57
56
58
static int byt_wm5102_spkvdd_power_event (struct snd_soc_dapm_widget * w ,
@@ -68,6 +70,7 @@ static int byt_wm5102_spkvdd_power_event(struct snd_soc_dapm_widget *w,
68
70
static int byt_wm5102_prepare_and_enable_pll1 (struct snd_soc_dai * codec_dai , int rate )
69
71
{
70
72
struct snd_soc_component * codec_component = codec_dai -> component ;
73
+ struct byt_wm5102_private * priv = snd_soc_card_get_drvdata (codec_component -> card );
71
74
int sr_mult = ((rate % 4000 ) == 0 ) ?
72
75
(WM5102_MAX_SYSCLK_4K / rate ) :
73
76
(WM5102_MAX_SYSCLK_11025 / rate );
@@ -79,7 +82,7 @@ static int byt_wm5102_prepare_and_enable_pll1(struct snd_soc_dai *codec_dai, int
79
82
80
83
/* Configure the FLL1 PLL before selecting it */
81
84
ret = snd_soc_dai_set_pll (codec_dai , WM5102_FLL1 , ARIZONA_CLK_SRC_MCLK1 ,
82
- MCLK_FREQ , rate * sr_mult );
85
+ priv -> mclk_freq , rate * sr_mult );
83
86
if (ret ) {
84
87
dev_err (codec_component -> dev , "Error setting PLL: %d\n" , ret );
85
88
return ret ;
@@ -251,6 +254,11 @@ static int byt_wm5102_init(struct snd_soc_pcm_runtime *runtime)
251
254
if (ret )
252
255
return ret ;
253
256
257
+ if (quirk & BYT_WM5102_MCLK_19_2MHZ )
258
+ priv -> mclk_freq = 19200000 ;
259
+ else
260
+ priv -> mclk_freq = 25000000 ;
261
+
254
262
/*
255
263
* The firmware might enable the clock at boot (this information
256
264
* may or may not be reflected in the enable clock register).
@@ -263,7 +271,7 @@ static int byt_wm5102_init(struct snd_soc_pcm_runtime *runtime)
263
271
if (!ret )
264
272
clk_disable_unprepare (priv -> mclk );
265
273
266
- ret = clk_set_rate (priv -> mclk , MCLK_FREQ );
274
+ ret = clk_set_rate (priv -> mclk , priv -> mclk_freq );
267
275
if (ret ) {
268
276
dev_err (card -> dev , "Error setting MCLK rate: %d\n" , ret );
269
277
return ret ;
@@ -486,7 +494,7 @@ static int snd_byt_wm5102_mc_probe(struct platform_device *pdev)
486
494
487
495
if (soc_intel_is_cht ()) {
488
496
/* On CHT default to SSP2 */
489
- quirk = BYT_WM5102_SSP2 ;
497
+ quirk = BYT_WM5102_SSP2 | BYT_WM5102_MCLK_19_2MHZ ;
490
498
}
491
499
if (quirk_override != -1 ) {
492
500
dev_info_once (dev , "Overriding quirk 0x%lx => 0x%x\n" ,
0 commit comments