summaryrefslogtreecommitdiff
path: root/firmware/target/arm/s5l8702/ipod6g/audio-6g.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/s5l8702/ipod6g/audio-6g.c')
-rw-r--r--firmware/target/arm/s5l8702/ipod6g/audio-6g.c58
1 files changed, 50 insertions, 8 deletions
diff --git a/firmware/target/arm/s5l8702/ipod6g/audio-6g.c b/firmware/target/arm/s5l8702/ipod6g/audio-6g.c
index 6a3bab06d6..825249400f 100644
--- a/firmware/target/arm/s5l8702/ipod6g/audio-6g.c
+++ b/firmware/target/arm/s5l8702/ipod6g/audio-6g.c
@@ -23,10 +23,55 @@
23#include "audio.h" 23#include "audio.h"
24#include "sound.h" 24#include "sound.h"
25#include "pmu-target.h" 25#include "pmu-target.h"
26#include "i2c-s5l8702.h"
26 27
27extern int rec_hw_ver; 28extern int rec_hw_ver;
28 29
30/* Mikey is the internal controller for jack microphone and/or
31 * remote accessories.
32 * TODO:
33 * - move to mikey-6g.c
34 * - detect jack accessory
35 * - support for remote buttons
36 */
37unsigned char mikey_read(int address)
38{
39 unsigned char val;
40 i2c_read(0, 0x72, address, 1, &val);
41 return val;
42}
43
44int mikey_write(int address, unsigned char val)
45{
46 return i2c_write(0, 0x72, address, 1, &val);
47}
48
49void mikey_reset(void)
50{
51 mikey_write(0, 5);
52 mikey_write(1, 0x80);
53}
54
29#if INPUT_SRC_CAPS != 0 55#if INPUT_SRC_CAPS != 0
56#ifdef HAVE_RECORDING
57void audio_enable_mic(bool enable)
58{
59 if (rec_hw_ver == 0)
60 return;
61
62 if (enable)
63 {
64 mikey_write(0, 7); /* raise voltage to polarize microphone */
65 GPIOCMD = 0xe070f; /* enable preamp */
66 }
67 else
68 {
69 mikey_reset(); /* microphone line voltage = 0 */
70 GPIOCMD = 0xe070e; /* disable preamp */
71 }
72}
73#endif
74
30void audio_set_output_source(int source) 75void audio_set_output_source(int source)
31{ 76{
32 if ((unsigned)source >= AUDIO_NUM_SOURCES) 77 if ((unsigned)source >= AUDIO_NUM_SOURCES)
@@ -53,8 +98,7 @@ void audio_input_mux(int source, unsigned flags)
53 /* Vcodec = 1800mV (900mV + value*100mV) */ 98 /* Vcodec = 1800mV (900mV + value*100mV) */
54 pmu_ldo_set_voltage(3, 0x9); 99 pmu_ldo_set_voltage(3, 0x9);
55 100
56 if (rec_hw_ver == 1) 101 audio_enable_mic(false);
57 GPIOCMD = 0xe070e;
58 } 102 }
59#endif 103#endif
60 break; 104 break;
@@ -63,13 +107,12 @@ void audio_input_mux(int source, unsigned flags)
63 case AUDIO_SRC_MIC: /* recording only */ 107 case AUDIO_SRC_MIC: /* recording only */
64 if (source != last_source) 108 if (source != last_source)
65 { 109 {
66 if (rec_hw_ver == 1) 110 audio_enable_mic(true);
67 GPIOCMD = 0xe070f;
68 111
69 /* Vcodec = 2400mV (900mV + value*100mV) */ 112 /* Vcodec = 2400mV (900mV + value*100mV) */
70 pmu_ldo_set_voltage(3, 0xf); 113 pmu_ldo_set_voltage(3, 0xf);
71 114
72 audiohw_set_monitor(false); 115 audiohw_set_monitor(true);
73 audiohw_enable_recording(true); /* source mic */ 116 audiohw_enable_recording(true); /* source mic */
74 } 117 }
75 break; 118 break;
@@ -79,13 +122,12 @@ void audio_input_mux(int source, unsigned flags)
79 case AUDIO_SRC_LINEIN: /* recording only */ 122 case AUDIO_SRC_LINEIN: /* recording only */
80 if (source != last_source) 123 if (source != last_source)
81 { 124 {
82 if (rec_hw_ver == 1) 125 audio_enable_mic(false);
83 GPIOCMD = 0xe070e;
84 126
85 /* Vcodec = 2400mV (900mV + value*100mV) */ 127 /* Vcodec = 2400mV (900mV + value*100mV) */
86 pmu_ldo_set_voltage(3, 0xf); 128 pmu_ldo_set_voltage(3, 0xf);
87 129
88 audiohw_set_monitor(false); 130 audiohw_set_monitor(true);
89 audiohw_enable_recording(false); /* source line */ 131 audiohw_enable_recording(false); /* source line */
90 } 132 }
91 break; 133 break;