aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/mfd/wm8994/registers.h9
-rw-r--r--sound/soc/codecs/wm8994.c36
2 files changed, 36 insertions, 9 deletions
diff --git a/include/linux/mfd/wm8994/registers.h b/include/linux/mfd/wm8994/registers.h
index ccf3a774fe36..be072faec6f0 100644
--- a/include/linux/mfd/wm8994/registers.h
+++ b/include/linux/mfd/wm8994/registers.h
@@ -64,6 +64,7 @@
64#define WM8994_LDO_1 0x3B 64#define WM8994_LDO_1 0x3B
65#define WM8994_LDO_2 0x3C 65#define WM8994_LDO_2 0x3C
66#define WM8994_CHARGE_PUMP_1 0x4C 66#define WM8994_CHARGE_PUMP_1 0x4C
67#define WM8958_CHARGE_PUMP_2 0x4D
67#define WM8994_CLASS_W_1 0x51 68#define WM8994_CLASS_W_1 0x51
68#define WM8994_DC_SERVO_1 0x54 69#define WM8994_DC_SERVO_1 0x54
69#define WM8994_DC_SERVO_2 0x55 70#define WM8994_DC_SERVO_2 0x55
@@ -1926,6 +1927,14 @@
1926#define WM8994_CP_ENA_WIDTH 1 /* CP_ENA */ 1927#define WM8994_CP_ENA_WIDTH 1 /* CP_ENA */
1927 1928
1928/* 1929/*
1930 * R77 (0x4D) - Charge Pump (2)
1931 */
1932#define WM8958_CP_DISCH 0x8000 /* CP_DISCH */
1933#define WM8958_CP_DISCH_MASK 0x8000 /* CP_DISCH */
1934#define WM8958_CP_DISCH_SHIFT 15 /* CP_DISCH */
1935#define WM8958_CP_DISCH_WIDTH 1 /* CP_DISCH */
1936
1937/*
1929 * R81 (0x51) - Class W (1) 1938 * R81 (0x51) - Class W (1)
1930 */ 1939 */
1931#define WM8994_CP_DYN_SRC_SEL_MASK 0x0300 /* CP_DYN_SRC_SEL - [9:8] */ 1940#define WM8994_CP_DYN_SRC_SEL_MASK 0x0300 /* CP_DYN_SRC_SEL - [9:8] */
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c
index 59d361145b15..af3a98ae0579 100644
--- a/sound/soc/codecs/wm8994.c
+++ b/sound/soc/codecs/wm8994.c
@@ -1858,15 +1858,33 @@ static int wm8994_set_bias_level(struct snd_soc_codec *codec,
1858 if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) { 1858 if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) {
1859 pm_runtime_get_sync(codec->dev); 1859 pm_runtime_get_sync(codec->dev);
1860 1860
1861 /* Tweak DC servo and DSP configuration for 1861 switch (control->type) {
1862 * improved performance. */ 1862 case WM8994:
1863 if (control->type == WM8994 && wm8994->revision < 4) { 1863 if (wm8994->revision < 4) {
1864 /* Tweak DC servo and DSP configuration for 1864 /* Tweak DC servo and DSP
1865 * improved performance. */ 1865 * configuration for improved
1866 snd_soc_write(codec, 0x102, 0x3); 1866 * performance. */
1867 snd_soc_write(codec, 0x56, 0x3); 1867 snd_soc_write(codec, 0x102, 0x3);
1868 snd_soc_write(codec, 0x817, 0); 1868 snd_soc_write(codec, 0x56, 0x3);
1869 snd_soc_write(codec, 0x102, 0); 1869 snd_soc_write(codec, 0x817, 0);
1870 snd_soc_write(codec, 0x102, 0);
1871 }
1872 break;
1873
1874 case WM8958:
1875 if (wm8994->revision == 0) {
1876 /* Optimise performance for rev A */
1877 snd_soc_write(codec, 0x102, 0x3);
1878 snd_soc_write(codec, 0xcb, 0x81);
1879 snd_soc_write(codec, 0x817, 0);
1880 snd_soc_write(codec, 0x102, 0);
1881
1882 snd_soc_update_bits(codec,
1883 WM8958_CHARGE_PUMP_2,
1884 WM8958_CP_DISCH,
1885 WM8958_CP_DISCH);
1886 }
1887 break;
1870 } 1888 }
1871 1889
1872 /* Discharge LINEOUT1 & 2 */ 1890 /* Discharge LINEOUT1 & 2 */