aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/video/cx18/cx18-av-audio.c80
1 files changed, 70 insertions, 10 deletions
diff --git a/drivers/media/video/cx18/cx18-av-audio.c b/drivers/media/video/cx18/cx18-av-audio.c
index 7245d37ef34f..0b55837880a7 100644
--- a/drivers/media/video/cx18/cx18-av-audio.c
+++ b/drivers/media/video/cx18/cx18-av-audio.c
@@ -51,6 +51,16 @@ static int set_audclk_freq(struct cx18 *cx, u32 freq)
51 51
52 /* SA_MCLK_SEL=1, SA_MCLK_DIV=0x14 */ 52 /* SA_MCLK_SEL=1, SA_MCLK_DIV=0x14 */
53 cx18_av_write(cx, 0x127, 0x54); 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);
54 break; 64 break;
55 65
56 case 44100: 66 case 44100:
@@ -58,14 +68,24 @@ static int set_audclk_freq(struct cx18 *cx, u32 freq)
58 cx18_av_write4(cx, 0x108, 0x1009040f); 68 cx18_av_write4(cx, 0x108, 0x1009040f);
59 69
60 /* AUX_PLL_FRAC */ 70 /* AUX_PLL_FRAC */
61 /* 0x9.7635eb * 28,636,363 / 0x10 = 44100 * 384 */ 71 /* 0x9.7635e7 * 28,636,363.63 / 0x10 = 44100 * 384 */
62 cx18_av_write4(cx, 0x110, 0x00ec6bd6); 72 cx18_av_write4(cx, 0x110, 0x00ec6bce);
63 73
64 /* src3/4/6_ctl */ 74 /* src3/4/6_ctl */
65 /* 0x1.6d59 = (4 * 15734.26) / 44100 */ 75 /* 0x1.6d59 = (4 * 15734.26) / 44100 */
66 cx18_av_write4(cx, 0x900, 0x08016d59); 76 cx18_av_write4(cx, 0x900, 0x08016d59);
67 cx18_av_write4(cx, 0x904, 0x08016d59); 77 cx18_av_write4(cx, 0x904, 0x08016d59);
68 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);
69 break; 89 break;
70 90
71 case 48000: 91 case 48000:
@@ -73,14 +93,24 @@ static int set_audclk_freq(struct cx18 *cx, u32 freq)
73 cx18_av_write4(cx, 0x108, 0x100a040f); 93 cx18_av_write4(cx, 0x108, 0x100a040f);
74 94
75 /* AUX_PLL_FRAC */ 95 /* AUX_PLL_FRAC */
76 /* 0xa.4c6b728 * 28,636,363 / 0x10 = 48000 * 384 */ 96 /* 0xa.4c6b6ea * 28,636,363.63 / 0x10 = 48000 * 384 */
77 cx18_av_write4(cx, 0x110, 0x0098d6e5); 97 cx18_av_write4(cx, 0x110, 0x0098d6dd);
78 98
79 /* src3/4/6_ctl */ 99 /* src3/4/6_ctl */
80 /* 0x1.4faa = (4 * 15734.26) / 48000 */ 100 /* 0x1.4faa = (4 * 15734.26) / 48000 */
81 cx18_av_write4(cx, 0x900, 0x08014faa); 101 cx18_av_write4(cx, 0x900, 0x08014faa);
82 cx18_av_write4(cx, 0x904, 0x08014faa); 102 cx18_av_write4(cx, 0x904, 0x08014faa);
83 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);
84 break; 114 break;
85 } 115 }
86 } else { 116 } else {
@@ -90,8 +120,8 @@ static int set_audclk_freq(struct cx18 *cx, u32 freq)
90 cx18_av_write4(cx, 0x108, 0x1e08040f); 120 cx18_av_write4(cx, 0x108, 0x1e08040f);
91 121
92 /* AUX_PLL_FRAC */ 122 /* AUX_PLL_FRAC */
93 /* 0x8.9504348 * 28,636,363 / 0x1e = 32000 * 256 */ 123 /* 0x8.9504318 * 28,636,363.63 / 0x1e = 32000 * 256 */
94 cx18_av_write4(cx, 0x110, 0x012a0869); 124 cx18_av_write4(cx, 0x110, 0x012a0863);
95 125
96 /* src1_ctl */ 126 /* src1_ctl */
97 /* 0x1.0000 = 32000/32000 */ 127 /* 0x1.0000 = 32000/32000 */
@@ -105,6 +135,16 @@ static int set_audclk_freq(struct cx18 *cx, u32 freq)
105 135
106 /* SA_MCLK_SEL=1, SA_MCLK_DIV=0x14 */ 136 /* SA_MCLK_SEL=1, SA_MCLK_DIV=0x14 */
107 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);
108 break; 148 break;
109 149
110 case 44100: 150 case 44100:
@@ -112,8 +152,8 @@ static int set_audclk_freq(struct cx18 *cx, u32 freq)
112 cx18_av_write4(cx, 0x108, 0x1809040f); 152 cx18_av_write4(cx, 0x108, 0x1809040f);
113 153
114 /* AUX_PLL_FRAC */ 154 /* AUX_PLL_FRAC */
115 /* 0x9.76346B * 28,636,363 / 0x18 = 44100 * 256 */ 155 /* 0x9.7635e74 * 28,636,363.63 / 0x18 = 44100 * 256 */
116 cx18_av_write4(cx, 0x110, 0x00ec6bd6); 156 cx18_av_write4(cx, 0x110, 0x00ec6bce);
117 157
118 /* src1_ctl */ 158 /* src1_ctl */
119 /* 0x1.60cd = 44100/32000 */ 159 /* 0x1.60cd = 44100/32000 */
@@ -124,6 +164,16 @@ static int set_audclk_freq(struct cx18 *cx, u32 freq)
124 cx18_av_write4(cx, 0x900, 0x08017385); 164 cx18_av_write4(cx, 0x900, 0x08017385);
125 cx18_av_write4(cx, 0x904, 0x08017385); 165 cx18_av_write4(cx, 0x904, 0x08017385);
126 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);
127 break; 177 break;
128 178
129 case 48000: 179 case 48000:
@@ -131,8 +181,8 @@ static int set_audclk_freq(struct cx18 *cx, u32 freq)
131 cx18_av_write4(cx, 0x108, 0x180a040f); 181 cx18_av_write4(cx, 0x108, 0x180a040f);
132 182
133 /* AUX_PLL_FRAC */ 183 /* AUX_PLL_FRAC */
134 /* 0xa.4c6b728 * 28,636,363 / 0x18 = 48000 * 256 */ 184 /* 0xa.4c6b6ea * 28,636,363.63 / 0x18 = 48000 * 256 */
135 cx18_av_write4(cx, 0x110, 0x0098d6e5); 185 cx18_av_write4(cx, 0x110, 0x0098d6dd);
136 186
137 /* src1_ctl */ 187 /* src1_ctl */
138 /* 0x1.8000 = 48000/32000 */ 188 /* 0x1.8000 = 48000/32000 */
@@ -143,6 +193,16 @@ static int set_audclk_freq(struct cx18 *cx, u32 freq)
143 cx18_av_write4(cx, 0x900, 0x08015555); 193 cx18_av_write4(cx, 0x900, 0x08015555);
144 cx18_av_write4(cx, 0x904, 0x08015555); 194 cx18_av_write4(cx, 0x904, 0x08015555);
145 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);
146 break; 206 break;
147 } 207 }
148 } 208 }