2727#include "../../codecs/wm5102.h"
2828#include "../atom/sst-atom-controls.h"
2929
30- #define MCLK_FREQ 25000000
31-
3230#define WM5102_MAX_SYSCLK_4K 49152000 /* max sysclk for 4K family */
3331#define WM5102_MAX_SYSCLK_11025 45158400 /* max sysclk for 11.025K family */
3432
3533struct byt_wm5102_private {
3634 struct snd_soc_jack jack ;
3735 struct clk * mclk ;
3836 struct gpio_desc * spkvdd_en_gpio ;
37+ int mclk_freq ;
3938};
4039
4140/* Bits 0-15 are reserved for things like an input-map */
4241#define BYT_WM5102_SSP2 BIT(16)
42+ #define BYT_WM5102_MCLK_19_2MHZ BIT(17)
4343
4444static unsigned long quirk ;
4545
@@ -51,6 +51,8 @@ static void log_quirks(struct device *dev)
5151{
5252 if (quirk & BYT_WM5102_SSP2 )
5353 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" );
5456}
5557
5658static 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,
6870static int byt_wm5102_prepare_and_enable_pll1 (struct snd_soc_dai * codec_dai , int rate )
6971{
7072 struct snd_soc_component * codec_component = codec_dai -> component ;
73+ struct byt_wm5102_private * priv = snd_soc_card_get_drvdata (codec_component -> card );
7174 int sr_mult = ((rate % 4000 ) == 0 ) ?
7275 (WM5102_MAX_SYSCLK_4K / rate ) :
7376 (WM5102_MAX_SYSCLK_11025 / rate );
@@ -79,7 +82,7 @@ static int byt_wm5102_prepare_and_enable_pll1(struct snd_soc_dai *codec_dai, int
7982
8083 /* Configure the FLL1 PLL before selecting it */
8184 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 );
8386 if (ret ) {
8487 dev_err (codec_component -> dev , "Error setting PLL: %d\n" , ret );
8588 return ret ;
@@ -251,6 +254,11 @@ static int byt_wm5102_init(struct snd_soc_pcm_runtime *runtime)
251254 if (ret )
252255 return ret ;
253256
257+ if (quirk & BYT_WM5102_MCLK_19_2MHZ )
258+ priv -> mclk_freq = 19200000 ;
259+ else
260+ priv -> mclk_freq = 25000000 ;
261+
254262 /*
255263 * The firmware might enable the clock at boot (this information
256264 * 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)
263271 if (!ret )
264272 clk_disable_unprepare (priv -> mclk );
265273
266- ret = clk_set_rate (priv -> mclk , MCLK_FREQ );
274+ ret = clk_set_rate (priv -> mclk , priv -> mclk_freq );
267275 if (ret ) {
268276 dev_err (card -> dev , "Error setting MCLK rate: %d\n" , ret );
269277 return ret ;
@@ -486,7 +494,7 @@ static int snd_byt_wm5102_mc_probe(struct platform_device *pdev)
486494
487495 if (soc_intel_is_cht ()) {
488496 /* On CHT default to SSP2 */
489- quirk = BYT_WM5102_SSP2 ;
497+ quirk = BYT_WM5102_SSP2 | BYT_WM5102_MCLK_19_2MHZ ;
490498 }
491499 if (quirk_override != -1 ) {
492500 dev_info_once (dev , "Overriding quirk 0x%lx => 0x%x\n" ,
0 commit comments