summaryrefslogtreecommitdiff
path: root/firmware/drivers/audio
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/audio')
-rw-r--r--firmware/drivers/audio/as3514.c4
-rw-r--r--firmware/drivers/audio/tlv320.c16
-rw-r--r--firmware/drivers/audio/tsc2100.c6
-rw-r--r--firmware/drivers/audio/uda1380.c35
-rw-r--r--firmware/drivers/audio/wm8731.c39
-rw-r--r--firmware/drivers/audio/wm8751.c14
-rw-r--r--firmware/drivers/audio/wm8758.c6
-rw-r--r--firmware/drivers/audio/wm8975.c6
-rw-r--r--firmware/drivers/audio/wm8978.c24
-rw-r--r--firmware/drivers/audio/wm8985.c6
10 files changed, 84 insertions, 72 deletions
diff --git a/firmware/drivers/audio/as3514.c b/firmware/drivers/audio/as3514.c
index 825cf51655..551a9df9b7 100644
--- a/firmware/drivers/audio/as3514.c
+++ b/firmware/drivers/audio/as3514.c
@@ -290,9 +290,9 @@ void audiohw_close(void)
290 sleep(HZ/4); 290 sleep(HZ/4);
291} 291}
292 292
293void audiohw_set_sample_rate(int sampling_control) 293void audiohw_set_frequency(int fsel)
294{ 294{
295 (void)sampling_control; 295 (void)fsel;
296} 296}
297 297
298#if defined(HAVE_RECORDING) 298#if defined(HAVE_RECORDING)
diff --git a/firmware/drivers/audio/tlv320.c b/firmware/drivers/audio/tlv320.c
index b2c5be8e61..c85627e683 100644
--- a/firmware/drivers/audio/tlv320.c
+++ b/firmware/drivers/audio/tlv320.c
@@ -152,21 +152,21 @@ void audiohw_postinit(void)
152 * 44100: 1 = MCLK MCLK SCLK, LRCK: Audio Clk / 4 (default) 152 * 44100: 1 = MCLK MCLK SCLK, LRCK: Audio Clk / 4 (default)
153 * 88200: 2 = MCLK*2 MCLK SCLK, LRCK: Audio Clk / 2 153 * 88200: 2 = MCLK*2 MCLK SCLK, LRCK: Audio Clk / 2
154 */ 154 */
155void audiohw_set_frequency(unsigned fsel) 155void audiohw_set_frequency(int fsel)
156{ 156{
157 /* All rates available for 11.2896MHz besides 8.021 */ 157 /* All rates available for 11.2896MHz besides 8.021 */
158 unsigned char values_src[3] = 158 static const unsigned char values_src[HW_NUM_FREQ] =
159 { 159 {
160 /* Fs: */ 160 [HW_FREQ_11] = (0x8 << 2) | SRC_CLKIN,
161 (0x8 << 2) | SRC_CLKIN, /* 11025, 22050 */ 161 [HW_FREQ_22] = (0x8 << 2) | SRC_CLKIN,
162 (0x8 << 2), /* 44100 */ 162 [HW_FREQ_44] = (0x8 << 2),
163 (0xf << 2), /* 88200 */ 163 [HW_FREQ_88] = (0xf << 2),
164 }; 164 };
165 165
166 unsigned value_dap, value_pc; 166 unsigned value_dap, value_pc;
167 167
168 if (fsel >= ARRAYLEN(values_src)) 168 if ((unsigned)fsel >= HW_NUM_FREQ)
169 fsel = 1; 169 fsel = HW_FREQ_DEFAULT;
170 170
171 /* Temporarily turn off the DAC and ADC before switching sample 171 /* Temporarily turn off the DAC and ADC before switching sample
172 rates or they don't choose their filters correctly */ 172 rates or they don't choose their filters correctly */
diff --git a/firmware/drivers/audio/tsc2100.c b/firmware/drivers/audio/tsc2100.c
index e0e2c53e69..11f30a8560 100644
--- a/firmware/drivers/audio/tsc2100.c
+++ b/firmware/drivers/audio/tsc2100.c
@@ -130,7 +130,7 @@ void audiohw_close(void)
130 130
131} 131}
132 132
133void audiohw_set_sample_rate(int sampling_control) 133void audiohw_set_frequency(int fsel)
134{ 134
135 (void)sampling_control; 135 (void)fsel;
136} 136}
diff --git a/firmware/drivers/audio/uda1380.c b/firmware/drivers/audio/uda1380.c
index a0e7ef56d8..efe02caca8 100644
--- a/firmware/drivers/audio/uda1380.c
+++ b/firmware/drivers/audio/uda1380.c
@@ -218,23 +218,38 @@ static void reset(void)
218 * 11025: 0 = 6.25 to 12.5 MCLK/2 SCLK, LRCK: Audio Clk / 16 218 * 11025: 0 = 6.25 to 12.5 MCLK/2 SCLK, LRCK: Audio Clk / 16
219 * 22050: 1 = 12.5 to 25 MCLK/2 SCLK, LRCK: Audio Clk / 8 219 * 22050: 1 = 12.5 to 25 MCLK/2 SCLK, LRCK: Audio Clk / 8
220 * 44100: 2 = 25 to 50 MCLK SCLK, LRCK: Audio Clk / 4 (default) 220 * 44100: 2 = 25 to 50 MCLK SCLK, LRCK: Audio Clk / 4 (default)
221 * 88200: 3 = 50 to 100 MCLK SCLK, LRCK: Audio Clk / 2 <= TODO: Needs WSPLL 221 * 88200: 3 = 50 to 100 MCLK SCLK, LRCK: Audio Clk / 2
222 */ 222 */
223void audiohw_set_frequency(unsigned fsel) 223void audiohw_set_frequency(int fsel)
224{ 224{
225 static const unsigned short values_reg[4][2] = 225 static const unsigned short values_reg[HW_NUM_FREQ][2] =
226 { 226 {
227 /* Fs: */ 227 [HW_FREQ_11] = /* Fs: */
228 { 0, WSPLL_625_125 | SYSCLK_512FS }, /* 11025 */ 228 {
229 { 0, WSPLL_125_25 | SYSCLK_256FS }, /* 22050 */ 229 0,
230 { MIX_CTL_SEL_NS, WSPLL_25_50 | SYSCLK_256FS }, /* 44100 */ 230 WSPLL_625_125 | SYSCLK_512FS
231 { MIX_CTL_SEL_NS, WSPLL_50_100 | SYSCLK_256FS }, /* 88200 */ 231 },
232 [HW_FREQ_22] =
233 {
234 0,
235 WSPLL_125_25 | SYSCLK_256FS
236 },
237 [HW_FREQ_44] =
238 {
239 MIX_CTL_SEL_NS,
240 WSPLL_25_50 | SYSCLK_256FS
241 },
242 [HW_FREQ_88] =
243 {
244 MIX_CTL_SEL_NS,
245 WSPLL_50_100 | SYSCLK_256FS
246 },
232 }; 247 };
233 248
234 const unsigned short *ent; 249 const unsigned short *ent;
235 250
236 if (fsel >= ARRAYLEN(values_reg)) 251 if ((unsigned)fsel >= HW_NUM_FREQ)
237 fsel = 2; 252 fsel = HW_FREQ_DEFAULT;
238 253
239 ent = values_reg[fsel]; 254 ent = values_reg[fsel];
240 255
diff --git a/firmware/drivers/audio/wm8731.c b/firmware/drivers/audio/wm8731.c
index c065de620a..2b74d718b0 100644
--- a/firmware/drivers/audio/wm8731.c
+++ b/firmware/drivers/audio/wm8731.c
@@ -224,35 +224,24 @@ void audiohw_close(void)
224 /* 2) Remove the WM codec supplies. */ 224 /* 2) Remove the WM codec supplies. */
225} 225}
226 226
227void audiohw_set_sample_rate(int sampling_control) 227void audiohw_set_frequency(int fsel)
228{ 228{
229 int rate; 229 /* For 24MHz MCLK */
230 230 static const unsigned char srctrl_table[HW_NUM_FREQ] =
231 switch(sampling_control)
232 { 231 {
233 case SAMPR_96: 232 [HW_FREQ_8] = WMC_USB24_8000HZ,
234 rate = WMC_USB24_96000HZ; 233 [HW_FREQ_32] = WMC_USB24_32000HZ,
235 break; 234 [HW_FREQ_44] = WMC_USB24_44100HZ,
236 case SAMPR_88: 235 [HW_FREQ_48] = WMC_USB24_48000HZ,
237 rate = WMC_USB24_88200HZ; 236 [HW_FREQ_88] = WMC_USB24_88200HZ,
238 break; 237 [HW_FREQ_96] = WMC_USB24_96000HZ,
239 case SAMPR_48: 238 };
240 rate = WMC_USB24_48000HZ; 239
241 break; 240 if ((unsigned)fsel >= HW_NUM_FREQ)
242 default: 241 fsel = HW_FREQ_DEFAULT;
243 case SAMPR_44:
244 rate = WMC_USB24_44100HZ;
245 break;
246 case SAMPR_32:
247 rate = WMC_USB24_32000HZ;
248 break;
249 case SAMPR_8:
250 rate = WMC_USB24_8000HZ;
251 break;
252 }
253 242
254 codec_set_active(false); 243 codec_set_active(false);
255 wmc_write(SAMPCTRL, rate); 244 wmc_write(SAMPCTRL, srctrl_table[fsel]);
256 codec_set_active(true); 245 codec_set_active(true);
257} 246}
258 247
diff --git a/firmware/drivers/audio/wm8751.c b/firmware/drivers/audio/wm8751.c
index 2e0eb06dbf..79c7396629 100644
--- a/firmware/drivers/audio/wm8751.c
+++ b/firmware/drivers/audio/wm8751.c
@@ -229,8 +229,18 @@ void audiohw_close(void)
229 wmcodec_write(PWRMGMT1, 0x0); 229 wmcodec_write(PWRMGMT1, 0x0);
230} 230}
231 231
232/* Note: Disable output before calling this function */
233void audiohw_set_frequency(int fsel) 232void audiohw_set_frequency(int fsel)
234{ 233{
235 wmcodec_write(CLOCKING, fsel); 234 static const unsigned char srctrl_table[HW_NUM_FREQ] =
235 {
236 HW_HAVE_11_([HW_FREQ_11] = CODEC_SRCTRL_11025HZ,)
237 HW_HAVE_22_([HW_FREQ_22] = CODEC_SRCTRL_22050HZ,)
238 HW_HAVE_44_([HW_FREQ_44] = CODEC_SRCTRL_44100HZ,)
239 HW_HAVE_88_([HW_FREQ_88] = CODEC_SRCTRL_88200HZ,)
240 };
241
242 if ((unsigned)fsel >= HW_NUM_FREQ)
243 fsel = HW_FREQ_DEFAULT;
244
245 wmcodec_write(CLOCKING, srctrl_table[fsel]);
236} 246}
diff --git a/firmware/drivers/audio/wm8758.c b/firmware/drivers/audio/wm8758.c
index 8ebfbe8e26..defc415f98 100644
--- a/firmware/drivers/audio/wm8758.c
+++ b/firmware/drivers/audio/wm8758.c
@@ -107,7 +107,7 @@ void audiohw_preinit(void)
107 wmcodec_write(OUTCTRL, OUTCTRL_VROI); 107 wmcodec_write(OUTCTRL, OUTCTRL_VROI);
108 wmcodec_write(CLKCTRL, CLKCTRL_MS); /* WM8758 is clock master */ 108 wmcodec_write(CLKCTRL, CLKCTRL_MS); /* WM8758 is clock master */
109 109
110 audiohw_set_sample_rate(WM8758_44100HZ); 110 audiohw_set_sample_rate(HW_FREQ_44);
111 111
112 wmcodec_write(LOUTMIX, LOUTMIX_DACL2LMIX); 112 wmcodec_write(LOUTMIX, LOUTMIX_DACL2LMIX);
113 wmcodec_write(ROUTMIX, ROUTMIX_DACR2RMIX); 113 wmcodec_write(ROUTMIX, ROUTMIX_DACR2RMIX);
@@ -170,10 +170,10 @@ void audiohw_close(void)
170} 170}
171 171
172/* Note: Disable output before calling this function */ 172/* Note: Disable output before calling this function */
173void audiohw_set_sample_rate(int sampling_control) 173void audiohw_set_frequency(int fsel)
174{ 174{
175 /**** We force 44.1KHz for now. ****/ 175 /**** We force 44.1KHz for now. ****/
176 (void)sampling_control; 176 (void)fsel;
177 177
178 /* setup PLL for MHZ=11.2896 */ 178 /* setup PLL for MHZ=11.2896 */
179 wmcodec_write(PLLN, PLLN_PLLPRESCALE | 0x7); 179 wmcodec_write(PLLN, PLLN_PLLPRESCALE | 0x7);
diff --git a/firmware/drivers/audio/wm8975.c b/firmware/drivers/audio/wm8975.c
index aa519e8819..f14890db74 100644
--- a/firmware/drivers/audio/wm8975.c
+++ b/firmware/drivers/audio/wm8975.c
@@ -145,7 +145,7 @@ void audiohw_preinit(void)
145 145
146 wm8975_write(DAPCTRL, wm8975_regs[DAPCTRL] ); 146 wm8975_write(DAPCTRL, wm8975_regs[DAPCTRL] );
147 147
148 audiohw_set_sample_rate(WM8975_44100HZ); 148 wmcodec_write(SAMPCTRL, WM8975_44100HZ);
149 149
150 /* set the volume to -6dB */ 150 /* set the volume to -6dB */
151 wmcodec_write(LOUT1VOL, LOUT1VOL_LO1ZC | IPOD_PCM_LEVEL); 151 wmcodec_write(LOUT1VOL, LOUT1VOL_LO1ZC | IPOD_PCM_LEVEL);
@@ -224,9 +224,9 @@ void audiohw_close(void)
224} 224}
225 225
226/* Note: Disable output before calling this function */ 226/* Note: Disable output before calling this function */
227void audiohw_set_sample_rate(int sampling_control) 227void audiohw_set_frequency(int fsel)
228{ 228{
229 wmcodec_write(SAMPCTRL, sampling_control); 229 (void)fsel;
230} 230}
231 231
232#ifdef HAVE_RECORDING 232#ifdef HAVE_RECORDING
diff --git a/firmware/drivers/audio/wm8978.c b/firmware/drivers/audio/wm8978.c
index 6a7c974f43..d8bf05063f 100644
--- a/firmware/drivers/audio/wm8978.c
+++ b/firmware/drivers/audio/wm8978.c
@@ -363,9 +363,9 @@ void audiohw_mute(bool mute)
363 } 363 }
364} 364}
365 365
366void audiohw_set_frequency(int sampling_control) 366void audiohw_set_frequency(int fsel)
367{ 367{
368 /* For 16.9344MHz MCLK */ 368 /* For 16.9344MHz MCLK, codec as master. */
369 static const struct 369 static const struct
370 { 370 {
371 uint32_t plln : 8; 371 uint32_t plln : 8;
@@ -374,7 +374,7 @@ void audiohw_set_frequency(int sampling_control)
374 uint32_t pllk3 : 9; 374 uint32_t pllk3 : 9;
375 unsigned char mclkdiv; 375 unsigned char mclkdiv;
376 unsigned char filter; 376 unsigned char filter;
377 } sctrl_table[HW_NUM_FREQ] = 377 } srctrl_table[HW_NUM_FREQ] =
378 { 378 {
379 [HW_FREQ_8] = /* PLL = 65.536MHz */ 379 [HW_FREQ_8] = /* PLL = 65.536MHz */
380 { 380 {
@@ -450,16 +450,14 @@ void audiohw_set_frequency(int sampling_control)
450 unsigned int plln; 450 unsigned int plln;
451 unsigned int mclkdiv; 451 unsigned int mclkdiv;
452 452
453 if ((unsigned)sampling_control >= ARRAYLEN(sctrl_table)) 453 if ((unsigned)fsel >= HW_NUM_FREQ)
454 sampling_control = HW_FREQ_DEFAULT; 454 fsel = HW_FREQ_DEFAULT;
455
456 455
457 /* Setup filters. */ 456 /* Setup filters. */
458 wmc_write(WMC_ADDITIONAL_CTRL, 457 wmc_write(WMC_ADDITIONAL_CTRL, srctrl_table[fsel].filter);
459 sctrl_table[sampling_control].filter);
460 458
461 plln = sctrl_table[sampling_control].plln; 459 plln = srctrl_table[fsel].plln;
462 mclkdiv = sctrl_table[sampling_control].mclkdiv; 460 mclkdiv = srctrl_table[fsel].mclkdiv;
463 461
464 if (plln != 0) 462 if (plln != 0)
465 { 463 {
@@ -467,9 +465,9 @@ void audiohw_set_frequency(int sampling_control)
467 465
468 /* Program PLL. */ 466 /* Program PLL. */
469 wmc_write(WMC_PLL_N, plln); 467 wmc_write(WMC_PLL_N, plln);
470 wmc_write(WMC_PLL_K1, sctrl_table[sampling_control].pllk1); 468 wmc_write(WMC_PLL_K1, srctrl_table[fsel].pllk1);
471 wmc_write(WMC_PLL_K2, sctrl_table[sampling_control].pllk2); 469 wmc_write(WMC_PLL_K2, srctrl_table[fsel].pllk2);
472 wmc_write(WMC_PLL_K3, sctrl_table[sampling_control].pllk3); 470 wmc_write(WMC_PLL_K3, srctrl_table[fsel].pllk3);
473 471
474 /* Turn on PLL. */ 472 /* Turn on PLL. */
475 wmc_set(WMC_POWER_MANAGEMENT1, WMC_PLLEN); 473 wmc_set(WMC_POWER_MANAGEMENT1, WMC_PLLEN);
diff --git a/firmware/drivers/audio/wm8985.c b/firmware/drivers/audio/wm8985.c
index 0467e3718a..f7b2e510ae 100644
--- a/firmware/drivers/audio/wm8985.c
+++ b/firmware/drivers/audio/wm8985.c
@@ -235,12 +235,12 @@ void audiohw_close(void)
235} 235}
236 236
237/* Note: Disable output before calling this function */ 237/* Note: Disable output before calling this function */
238void audiohw_set_sample_rate(int sampling_control) 238void audiohw_set_sample_rate(int fsel)
239{ 239{
240 /* Currently the WM8985 acts as slave to the SoC I2S controller, so no 240 /* Currently the WM8985 acts as slave to the SoC I2S controller, so no
241 setup is needed here. This seems to be in contrast to every other WM 241 setup is needed here. This seems to be in contrast to every other WM
242 driver in Rockbox, so this may need to change in the future. */ 242 driver in Rockbox, so this may need to change in the future. */
243 (void)sampling_control; 243 (void)fsel;
244} 244}
245 245
246#ifdef HAVE_RECORDING 246#ifdef HAVE_RECORDING
@@ -261,7 +261,7 @@ void audiohw_enable_recording(bool source_mic)
261 261
262 /* The iPod can handle multiple frequencies, but fix at 44.1KHz 262 /* The iPod can handle multiple frequencies, but fix at 44.1KHz
263 for now */ 263 for now */
264 audiohw_set_sample_rate(WM8985_44100HZ); 264 audiohw_set_frequency(HW_FREQ_DEFAULT);
265 265
266 wmcodec_write(INCTRL,0x44); /* Connect L2 and R2 inputs */ 266 wmcodec_write(INCTRL,0x44); /* Connect L2 and R2 inputs */
267 267