diff options
Diffstat (limited to 'drivers/media/video/cx18/cx18-av-audio.c')
-rw-r--r-- | drivers/media/video/cx18/cx18-av-audio.c | 111 |
1 files changed, 94 insertions, 17 deletions
diff --git a/drivers/media/video/cx18/cx18-av-audio.c b/drivers/media/video/cx18/cx18-av-audio.c index c40a286de1b9..0b55837880a7 100644 --- a/drivers/media/video/cx18/cx18-av-audio.c +++ b/drivers/media/video/cx18/cx18-av-audio.c | |||
@@ -30,7 +30,6 @@ static int set_audclk_freq(struct cx18 *cx, u32 freq) | |||
30 | if (freq != 32000 && freq != 44100 && freq != 48000) | 30 | if (freq != 32000 && freq != 44100 && freq != 48000) |
31 | return -EINVAL; | 31 | return -EINVAL; |
32 | 32 | ||
33 | /* common for all inputs and rates */ | ||
34 | /* SA_MCLK_SEL=1, SA_MCLK_DIV=0x10 */ | 33 | /* SA_MCLK_SEL=1, SA_MCLK_DIV=0x10 */ |
35 | cx18_av_write(cx, 0x127, 0x50); | 34 | cx18_av_write(cx, 0x127, 0x50); |
36 | 35 | ||
@@ -38,15 +37,30 @@ static int set_audclk_freq(struct cx18 *cx, u32 freq) | |||
38 | switch (freq) { | 37 | switch (freq) { |
39 | case 32000: | 38 | case 32000: |
40 | /* VID_PLL and AUX_PLL */ | 39 | /* VID_PLL and AUX_PLL */ |
41 | cx18_av_write4(cx, 0x108, 0x1006040f); | 40 | cx18_av_write4(cx, 0x108, 0x1408040f); |
42 | 41 | ||
43 | /* AUX_PLL_FRAC */ | 42 | /* AUX_PLL_FRAC */ |
44 | cx18_av_write4(cx, 0x110, 0x01bb39ee); | 43 | /* 0x8.9504318a * 28,636,363.636 / 0x14 = 32000 * 384 */ |
44 | cx18_av_write4(cx, 0x110, 0x012a0863); | ||
45 | 45 | ||
46 | /* src3/4/6_ctl = 0x0801f77f */ | 46 | /* src3/4/6_ctl */ |
47 | /* 0x1.f77f = (4 * 15734.26) / 32000 */ | ||
47 | cx18_av_write4(cx, 0x900, 0x0801f77f); | 48 | cx18_av_write4(cx, 0x900, 0x0801f77f); |
48 | cx18_av_write4(cx, 0x904, 0x0801f77f); | 49 | cx18_av_write4(cx, 0x904, 0x0801f77f); |
49 | cx18_av_write4(cx, 0x90c, 0x0801f77f); | 50 | cx18_av_write4(cx, 0x90c, 0x0801f77f); |
51 | |||
52 | /* SA_MCLK_SEL=1, SA_MCLK_DIV=0x14 */ | ||
53 | cx18_av_write(cx, 0x127, 0x54); | ||
54 | |||
55 | /* AUD_COUNT = 0x2fff = 8 samples * 4 * 384 - 1 */ | ||
56 | cx18_av_write4(cx, 0x12c, 0x11202fff); | ||
57 | |||
58 | /* | ||
59 | * EN_AV_LOCK = 1 | ||
60 | * VID_COUNT = 0x0d2ef8 = 107999.000 * 8 = | ||
61 | * ((8 samples/32,000) * (13,500,000 * 8) * 4 - 1) * 8 | ||
62 | */ | ||
63 | cx18_av_write4(cx, 0x128, 0xa10d2ef8); | ||
50 | break; | 64 | break; |
51 | 65 | ||
52 | case 44100: | 66 | case 44100: |
@@ -54,12 +68,24 @@ static int set_audclk_freq(struct cx18 *cx, u32 freq) | |||
54 | cx18_av_write4(cx, 0x108, 0x1009040f); | 68 | cx18_av_write4(cx, 0x108, 0x1009040f); |
55 | 69 | ||
56 | /* AUX_PLL_FRAC */ | 70 | /* AUX_PLL_FRAC */ |
57 | cx18_av_write4(cx, 0x110, 0x00ec6bd6); | 71 | /* 0x9.7635e7 * 28,636,363.63 / 0x10 = 44100 * 384 */ |
72 | cx18_av_write4(cx, 0x110, 0x00ec6bce); | ||
58 | 73 | ||
59 | /* src3/4/6_ctl = 0x08016d59 */ | 74 | /* src3/4/6_ctl */ |
75 | /* 0x1.6d59 = (4 * 15734.26) / 44100 */ | ||
60 | cx18_av_write4(cx, 0x900, 0x08016d59); | 76 | cx18_av_write4(cx, 0x900, 0x08016d59); |
61 | cx18_av_write4(cx, 0x904, 0x08016d59); | 77 | cx18_av_write4(cx, 0x904, 0x08016d59); |
62 | cx18_av_write4(cx, 0x90c, 0x08016d59); | 78 | cx18_av_write4(cx, 0x90c, 0x08016d59); |
79 | |||
80 | /* AUD_COUNT = 0x92ff = 49 samples * 2 * 384 - 1 */ | ||
81 | cx18_av_write4(cx, 0x12c, 0x112092ff); | ||
82 | |||
83 | /* | ||
84 | * EN_AV_LOCK = 1 | ||
85 | * VID_COUNT = 0x1d4bf8 = 239999.000 * 8 = | ||
86 | * ((49 samples/44,100) * (13,500,000 * 8) * 2 - 1) * 8 | ||
87 | */ | ||
88 | cx18_av_write4(cx, 0x128, 0xa11d4bf8); | ||
63 | break; | 89 | break; |
64 | 90 | ||
65 | case 48000: | 91 | case 48000: |
@@ -67,12 +93,24 @@ static int set_audclk_freq(struct cx18 *cx, u32 freq) | |||
67 | cx18_av_write4(cx, 0x108, 0x100a040f); | 93 | cx18_av_write4(cx, 0x108, 0x100a040f); |
68 | 94 | ||
69 | /* AUX_PLL_FRAC */ | 95 | /* AUX_PLL_FRAC */ |
70 | cx18_av_write4(cx, 0x110, 0x0098d6e5); | 96 | /* 0xa.4c6b6ea * 28,636,363.63 / 0x10 = 48000 * 384 */ |
97 | cx18_av_write4(cx, 0x110, 0x0098d6dd); | ||
71 | 98 | ||
72 | /* src3/4/6_ctl = 0x08014faa */ | 99 | /* src3/4/6_ctl */ |
100 | /* 0x1.4faa = (4 * 15734.26) / 48000 */ | ||
73 | cx18_av_write4(cx, 0x900, 0x08014faa); | 101 | cx18_av_write4(cx, 0x900, 0x08014faa); |
74 | cx18_av_write4(cx, 0x904, 0x08014faa); | 102 | cx18_av_write4(cx, 0x904, 0x08014faa); |
75 | cx18_av_write4(cx, 0x90c, 0x08014faa); | 103 | cx18_av_write4(cx, 0x90c, 0x08014faa); |
104 | |||
105 | /* AUD_COUNT = 0x5fff = 4 samples * 16 * 384 - 1 */ | ||
106 | cx18_av_write4(cx, 0x12c, 0x11205fff); | ||
107 | |||
108 | /* | ||
109 | * EN_AV_LOCK = 1 | ||
110 | * VID_COUNT = 0x1193f8 = 143999.000 * 8 = | ||
111 | * ((4 samples/48,000) * (13,500,000 * 8) * 16 - 1) * 8 | ||
112 | */ | ||
113 | cx18_av_write4(cx, 0x128, 0xa11193f8); | ||
76 | break; | 114 | break; |
77 | } | 115 | } |
78 | } else { | 116 | } else { |
@@ -82,18 +120,31 @@ static int set_audclk_freq(struct cx18 *cx, u32 freq) | |||
82 | cx18_av_write4(cx, 0x108, 0x1e08040f); | 120 | cx18_av_write4(cx, 0x108, 0x1e08040f); |
83 | 121 | ||
84 | /* AUX_PLL_FRAC */ | 122 | /* AUX_PLL_FRAC */ |
85 | cx18_av_write4(cx, 0x110, 0x012a0869); | 123 | /* 0x8.9504318 * 28,636,363.63 / 0x1e = 32000 * 256 */ |
124 | cx18_av_write4(cx, 0x110, 0x012a0863); | ||
86 | 125 | ||
87 | /* src1_ctl = 0x08010000 */ | 126 | /* src1_ctl */ |
127 | /* 0x1.0000 = 32000/32000 */ | ||
88 | cx18_av_write4(cx, 0x8f8, 0x08010000); | 128 | cx18_av_write4(cx, 0x8f8, 0x08010000); |
89 | 129 | ||
90 | /* src3/4/6_ctl = 0x08020000 */ | 130 | /* src3/4/6_ctl */ |
131 | /* 0x2.0000 = 2 * (32000/32000) */ | ||
91 | cx18_av_write4(cx, 0x900, 0x08020000); | 132 | cx18_av_write4(cx, 0x900, 0x08020000); |
92 | cx18_av_write4(cx, 0x904, 0x08020000); | 133 | cx18_av_write4(cx, 0x904, 0x08020000); |
93 | cx18_av_write4(cx, 0x90c, 0x08020000); | 134 | cx18_av_write4(cx, 0x90c, 0x08020000); |
94 | 135 | ||
95 | /* SA_MCLK_SEL=1, SA_MCLK_DIV=0x14 */ | 136 | /* SA_MCLK_SEL=1, SA_MCLK_DIV=0x14 */ |
96 | cx18_av_write(cx, 0x127, 0x54); | 137 | cx18_av_write(cx, 0x127, 0x54); |
138 | |||
139 | /* AUD_COUNT = 0x1fff = 8 samples * 4 * 256 - 1 */ | ||
140 | cx18_av_write4(cx, 0x12c, 0x11201fff); | ||
141 | |||
142 | /* | ||
143 | * EN_AV_LOCK = 1 | ||
144 | * VID_COUNT = 0x0d2ef8 = 107999.000 * 8 = | ||
145 | * ((8 samples/32,000) * (13,500,000 * 8) * 4 - 1) * 8 | ||
146 | */ | ||
147 | cx18_av_write4(cx, 0x128, 0xa10d2ef8); | ||
97 | break; | 148 | break; |
98 | 149 | ||
99 | case 44100: | 150 | case 44100: |
@@ -101,15 +152,28 @@ static int set_audclk_freq(struct cx18 *cx, u32 freq) | |||
101 | cx18_av_write4(cx, 0x108, 0x1809040f); | 152 | cx18_av_write4(cx, 0x108, 0x1809040f); |
102 | 153 | ||
103 | /* AUX_PLL_FRAC */ | 154 | /* AUX_PLL_FRAC */ |
104 | cx18_av_write4(cx, 0x110, 0x00ec6bd6); | 155 | /* 0x9.7635e74 * 28,636,363.63 / 0x18 = 44100 * 256 */ |
156 | cx18_av_write4(cx, 0x110, 0x00ec6bce); | ||
105 | 157 | ||
106 | /* src1_ctl = 0x08010000 */ | 158 | /* src1_ctl */ |
159 | /* 0x1.60cd = 44100/32000 */ | ||
107 | cx18_av_write4(cx, 0x8f8, 0x080160cd); | 160 | cx18_av_write4(cx, 0x8f8, 0x080160cd); |
108 | 161 | ||
109 | /* src3/4/6_ctl = 0x08020000 */ | 162 | /* src3/4/6_ctl */ |
163 | /* 0x1.7385 = 2 * (32000/44100) */ | ||
110 | cx18_av_write4(cx, 0x900, 0x08017385); | 164 | cx18_av_write4(cx, 0x900, 0x08017385); |
111 | cx18_av_write4(cx, 0x904, 0x08017385); | 165 | cx18_av_write4(cx, 0x904, 0x08017385); |
112 | cx18_av_write4(cx, 0x90c, 0x08017385); | 166 | cx18_av_write4(cx, 0x90c, 0x08017385); |
167 | |||
168 | /* AUD_COUNT = 0x61ff = 49 samples * 2 * 256 - 1 */ | ||
169 | cx18_av_write4(cx, 0x12c, 0x112061ff); | ||
170 | |||
171 | /* | ||
172 | * EN_AV_LOCK = 1 | ||
173 | * VID_COUNT = 0x1d4bf8 = 239999.000 * 8 = | ||
174 | * ((49 samples/44,100) * (13,500,000 * 8) * 2 - 1) * 8 | ||
175 | */ | ||
176 | cx18_av_write4(cx, 0x128, 0xa11d4bf8); | ||
113 | break; | 177 | break; |
114 | 178 | ||
115 | case 48000: | 179 | case 48000: |
@@ -117,15 +181,28 @@ static int set_audclk_freq(struct cx18 *cx, u32 freq) | |||
117 | cx18_av_write4(cx, 0x108, 0x180a040f); | 181 | cx18_av_write4(cx, 0x108, 0x180a040f); |
118 | 182 | ||
119 | /* AUX_PLL_FRAC */ | 183 | /* AUX_PLL_FRAC */ |
120 | cx18_av_write4(cx, 0x110, 0x0098d6e5); | 184 | /* 0xa.4c6b6ea * 28,636,363.63 / 0x18 = 48000 * 256 */ |
185 | cx18_av_write4(cx, 0x110, 0x0098d6dd); | ||
121 | 186 | ||
122 | /* src1_ctl = 0x08010000 */ | 187 | /* src1_ctl */ |
188 | /* 0x1.8000 = 48000/32000 */ | ||
123 | cx18_av_write4(cx, 0x8f8, 0x08018000); | 189 | cx18_av_write4(cx, 0x8f8, 0x08018000); |
124 | 190 | ||
125 | /* src3/4/6_ctl = 0x08020000 */ | 191 | /* src3/4/6_ctl */ |
192 | /* 0x1.5555 = 2 * (32000/48000) */ | ||
126 | cx18_av_write4(cx, 0x900, 0x08015555); | 193 | cx18_av_write4(cx, 0x900, 0x08015555); |
127 | cx18_av_write4(cx, 0x904, 0x08015555); | 194 | cx18_av_write4(cx, 0x904, 0x08015555); |
128 | cx18_av_write4(cx, 0x90c, 0x08015555); | 195 | cx18_av_write4(cx, 0x90c, 0x08015555); |
196 | |||
197 | /* AUD_COUNT = 0x3fff = 4 samples * 16 * 256 - 1 */ | ||
198 | cx18_av_write4(cx, 0x12c, 0x11203fff); | ||
199 | |||
200 | /* | ||
201 | * EN_AV_LOCK = 1 | ||
202 | * VID_COUNT = 0x1193f8 = 143999.000 * 8 = | ||
203 | * ((4 samples/48,000) * (13,500,000 * 8) * 16 - 1) * 8 | ||
204 | */ | ||
205 | cx18_av_write4(cx, 0x128, 0xa11193f8); | ||
129 | break; | 206 | break; |
130 | } | 207 | } |
131 | } | 208 | } |