diff options
Diffstat (limited to 'firmware/drivers/tlv320.c')
-rw-r--r-- | firmware/drivers/tlv320.c | 23 |
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 | */ |
103 | void tlv320_set_headphone_vol(int vol_l, int vol_r) | 103 | void 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 | */ |
153 | void tlv320_mute(bool mute) | 158 | void 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 */ |