diff options
Diffstat (limited to 'firmware/drivers/audio')
-rw-r--r-- | firmware/drivers/audio/as3514.c | 4 | ||||
-rw-r--r-- | firmware/drivers/audio/tlv320.c | 16 | ||||
-rw-r--r-- | firmware/drivers/audio/tsc2100.c | 6 | ||||
-rw-r--r-- | firmware/drivers/audio/uda1380.c | 35 | ||||
-rw-r--r-- | firmware/drivers/audio/wm8731.c | 39 | ||||
-rw-r--r-- | firmware/drivers/audio/wm8751.c | 14 | ||||
-rw-r--r-- | firmware/drivers/audio/wm8758.c | 6 | ||||
-rw-r--r-- | firmware/drivers/audio/wm8975.c | 6 | ||||
-rw-r--r-- | firmware/drivers/audio/wm8978.c | 24 | ||||
-rw-r--r-- | firmware/drivers/audio/wm8985.c | 6 |
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 | ||
293 | void audiohw_set_sample_rate(int sampling_control) | 293 | void 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 | */ |
155 | void audiohw_set_frequency(unsigned fsel) | 155 | void 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 | ||
133 | void audiohw_set_sample_rate(int sampling_control) | 133 | void 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 | */ |
223 | void audiohw_set_frequency(unsigned fsel) | 223 | void 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 | ||
227 | void audiohw_set_sample_rate(int sampling_control) | 227 | void 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 */ | ||
233 | void audiohw_set_frequency(int fsel) | 232 | void 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 */ |
173 | void audiohw_set_sample_rate(int sampling_control) | 173 | void 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 */ |
227 | void audiohw_set_sample_rate(int sampling_control) | 227 | void 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 | ||
366 | void audiohw_set_frequency(int sampling_control) | 366 | void 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 */ |
238 | void audiohw_set_sample_rate(int sampling_control) | 238 | void 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 | ||