summaryrefslogtreecommitdiff
path: root/firmware/drivers
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2006-09-26 18:57:31 +0000
committerMichael Sevakis <jethead71@rockbox.org>2006-09-26 18:57:31 +0000
commit2dbe428abc87b9e2ffc005f3cd181bf3db581b66 (patch)
tree74cdb58d07a5e002b3c9b54a7976a0a407e4d5cb /firmware/drivers
parent7d1dcd118d31ecf26870f226d6454a5409c00a8d (diff)
downloadrockbox-2dbe428abc87b9e2ffc005f3cd181bf3db581b66.tar.gz
rockbox-2dbe428abc87b9e2ffc005f3cd181bf3db581b66.zip
Fixed tlv320 mute problem at least for digital audio path. Analog bypass muting (during FM Radio listening) will require more drastic measures like powering down of part of the chip afaict.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11065 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/drivers')
-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 */