|
@@ -37,6 +37,47 @@ struct wm5110_priv {
|
|
|
struct arizona_fll fll[2];
|
|
|
};
|
|
|
|
|
|
+static const struct reg_default wm5110_sysclk_revd_patch[] = {
|
|
|
+ { 0x3093, 0x1001 },
|
|
|
+ { 0x30E3, 0x1301 },
|
|
|
+ { 0x3133, 0x1201 },
|
|
|
+ { 0x3183, 0x1501 },
|
|
|
+ { 0x31D3, 0x1401 },
|
|
|
+};
|
|
|
+
|
|
|
+static int wm5110_sysclk_ev(struct snd_soc_dapm_widget *w,
|
|
|
+ struct snd_kcontrol *kcontrol, int event)
|
|
|
+{
|
|
|
+ struct snd_soc_codec *codec = w->codec;
|
|
|
+ struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
|
|
|
+ struct regmap *regmap = codec->control_data;
|
|
|
+ const struct reg_default *patch = NULL;
|
|
|
+ int i, patch_size;
|
|
|
+
|
|
|
+ switch (arizona->rev) {
|
|
|
+ case 3:
|
|
|
+ patch = wm5110_sysclk_revd_patch;
|
|
|
+ patch_size = ARRAY_SIZE(wm5110_sysclk_revd_patch);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (event) {
|
|
|
+ case SND_SOC_DAPM_POST_PMU:
|
|
|
+ if (patch)
|
|
|
+ for (i = 0; i < patch_size; i++)
|
|
|
+ regmap_write(regmap, patch[i].reg,
|
|
|
+ patch[i].def);
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static DECLARE_TLV_DB_SCALE(ana_tlv, 0, 100, 0);
|
|
|
static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);
|
|
|
static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0);
|
|
@@ -400,7 +441,7 @@ static const struct snd_kcontrol_new wm5110_aec_loopback_mux =
|
|
|
|
|
|
static const struct snd_soc_dapm_widget wm5110_dapm_widgets[] = {
|
|
|
SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT,
|
|
|
- 0, NULL, 0),
|
|
|
+ 0, wm5110_sysclk_ev, SND_SOC_DAPM_POST_PMU),
|
|
|
SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1,
|
|
|
ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, NULL, 0),
|
|
|
SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK,
|