summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/drivers/tlv320.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/firmware/drivers/tlv320.c b/firmware/drivers/tlv320.c
index 5027d744c9..5be7facdd2 100644
--- a/firmware/drivers/tlv320.c
+++ b/firmware/drivers/tlv320.c
@@ -102,20 +102,25 @@ void tlv320_reset(void)
102 */ 102 */
103void tlv320_set_headphone_vol(int vol_l, int vol_r) 103void tlv320_set_headphone_vol(int vol_l, int vol_r)
104{ 104{
105 unsigned value_l = tlv320_regs[REG_LHV]; 105 unsigned value_dap = tlv320_regs[REG_DAP];
106 unsigned value_r = tlv320_regs[REG_RHV]; 106 unsigned value_dap_last = value_dap;
107 unsigned value_l = LHV_LHV(vol_l);
108 unsigned value_r = RHV_RHV(vol_r);
107 109
108 /* keep track of current setting */ 110 /* keep track of current setting */
109 tlv320.vol_l = vol_l; 111 tlv320.vol_l = vol_l;
110 tlv320.vol_r = vol_r; 112 tlv320.vol_r = vol_r;
111 113
112 /* set new values in local register holders */ 114 if (value_l > HEADPHONE_MUTE || value_r > HEADPHONE_MUTE)
113 value_l = LHV_LHV(vol_l); 115 value_dap &= ~DAP_DACM;
114 value_r = RHV_RHV(vol_r); 116 else
117 value_dap |= DAP_DACM;
115 118
116 /* update */ 119 /* update */
117 tlv320_write_reg(REG_LHV, LHV_LZC | value_l); 120 tlv320_write_reg(REG_LHV, LHV_LZC | value_l);
118 tlv320_write_reg(REG_RHV, RHV_RZC | value_r); 121 tlv320_write_reg(REG_RHV, RHV_RZC | value_r);
122 if (value_dap != value_dap_last)
123 tlv320_write_reg(REG_DAP, value_dap);
119} 124}
120 125
121/** 126/**
@@ -152,22 +157,26 @@ void tlv320_set_recvol(int left, int right, int type)
152 */ 157 */
153void tlv320_mute(bool mute) 158void tlv320_mute(bool mute)
154{ 159{
155 unsigned value_l = tlv320_regs[REG_LHV]; 160 unsigned value_dap = tlv320_regs[REG_DAP];
156 unsigned value_r = tlv320_regs[REG_RHV]; 161 unsigned value_l, value_r;
157 162
158 if (mute) 163 if (mute)
159 { 164 {
160 value_l = LHV_LHV(HEADPHONE_MUTE); 165 value_l = LHV_LHV(HEADPHONE_MUTE);
161 value_r = RHV_RHV(HEADPHONE_MUTE); 166 value_r = RHV_RHV(HEADPHONE_MUTE);
167 value_dap |= DAP_DACM;
162 } 168 }
163 else 169 else
164 { 170 {
165 value_l = LHV_LHV(tlv320.vol_l); 171 value_l = LHV_LHV(tlv320.vol_l);
166 value_r = RHV_RHV(tlv320.vol_r); 172 value_r = RHV_RHV(tlv320.vol_r);
173 if (value_l > HEADPHONE_MUTE || value_r > HEADPHONE_MUTE)
174 value_dap &= ~DAP_DACM;
167 } 175 }
168 176
169 tlv320_write_reg(REG_LHV, LHV_LZC | value_l); 177 tlv320_write_reg(REG_LHV, LHV_LZC | value_l);
170 tlv320_write_reg(REG_RHV, RHV_RZC | value_r); 178 tlv320_write_reg(REG_RHV, RHV_RZC | value_r);
179 tlv320_write_reg(REG_DAP, value_dap);
171} 180}
172 181
173/* Nice shutdown of TLV320 codec */ 182/* Nice shutdown of TLV320 codec */