|
@@ -154,6 +154,7 @@ static struct reg_default wm8962_reg[] = {
|
|
|
{ 40, 0x0000 }, /* R40 - SPKOUTL volume */
|
|
|
{ 41, 0x0000 }, /* R41 - SPKOUTR volume */
|
|
|
|
|
|
+ { 49, 0x0010 }, /* R49 - Class D Control 1 */
|
|
|
{ 51, 0x0003 }, /* R51 - Class D Control 2 */
|
|
|
|
|
|
{ 56, 0x0506 }, /* R56 - Clocking 4 */
|
|
@@ -795,7 +796,6 @@ static bool wm8962_volatile_register(struct device *dev, unsigned int reg)
|
|
|
case WM8962_ALC2:
|
|
|
case WM8962_THERMAL_SHUTDOWN_STATUS:
|
|
|
case WM8962_ADDITIONAL_CONTROL_4:
|
|
|
- case WM8962_CLASS_D_CONTROL_1:
|
|
|
case WM8962_DC_SERVO_6:
|
|
|
case WM8962_INTERRUPT_STATUS_1:
|
|
|
case WM8962_INTERRUPT_STATUS_2:
|
|
@@ -2929,13 +2929,22 @@ static int wm8962_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
|
|
|
static int wm8962_mute(struct snd_soc_dai *dai, int mute)
|
|
|
{
|
|
|
struct snd_soc_codec *codec = dai->codec;
|
|
|
- int val;
|
|
|
+ int val, ret;
|
|
|
|
|
|
if (mute)
|
|
|
- val = WM8962_DAC_MUTE;
|
|
|
+ val = WM8962_DAC_MUTE | WM8962_DAC_MUTE_ALT;
|
|
|
else
|
|
|
val = 0;
|
|
|
|
|
|
+ /**
|
|
|
+ * The DAC mute bit is mirrored in two registers, update both to keep
|
|
|
+ * the register cache consistent.
|
|
|
+ */
|
|
|
+ ret = snd_soc_update_bits(codec, WM8962_CLASS_D_CONTROL_1,
|
|
|
+ WM8962_DAC_MUTE_ALT, val);
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
+
|
|
|
return snd_soc_update_bits(codec, WM8962_ADC_DAC_CONTROL_1,
|
|
|
WM8962_DAC_MUTE, val);
|
|
|
}
|