diff options
-rw-r--r-- | include/linux/mfd/wm8994/registers.h | 9 | ||||
-rw-r--r-- | sound/soc/codecs/wm8994.c | 36 |
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 */ |