[go: nahoru, domu]

1/*
2 *  cx18 ADEC audio functions
3 *
4 *  Derived from cx25840-audio.c
5 *
6 *  Copyright (C) 2007  Hans Verkuil <hverkuil@xs4all.nl>
7 *  Copyright (C) 2008  Andy Walls <awalls@md.metrocast.net>
8 *
9 *  This program is free software; you can redistribute it and/or
10 *  modify it under the terms of the GNU General Public License
11 *  as published by the Free Software Foundation; either version 2
12 *  of the License, or (at your option) any later version.
13 *
14 *  This program is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this program; if not, write to the Free Software
21 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22 *  02110-1301, USA.
23 */
24
25#include "cx18-driver.h"
26
27static int set_audclk_freq(struct cx18 *cx, u32 freq)
28{
29	struct cx18_av_state *state = &cx->av_state;
30
31	if (freq != 32000 && freq != 44100 && freq != 48000)
32		return -EINVAL;
33
34	/*
35	 * The PLL parameters are based on the external crystal frequency that
36	 * would ideally be:
37	 *
38	 * NTSC Color subcarrier freq * 8 =
39	 * 	4.5 MHz/286 * 455/2 * 8 = 28.63636363... MHz
40	 *
41	 * The accidents of history and rationale that explain from where this
42	 * combination of magic numbers originate can be found in:
43	 *
44	 * [1] Abrahams, I. C., "Choice of Chrominance Subcarrier Frequency in
45	 * the NTSC Standards", Proceedings of the I-R-E, January 1954, pp 79-80
46	 *
47	 * [2] Abrahams, I. C., "The 'Frequency Interleaving' Principle in the
48	 * NTSC Standards", Proceedings of the I-R-E, January 1954, pp 81-83
49	 *
50	 * As Mike Bradley has rightly pointed out, it's not the exact crystal
51	 * frequency that matters, only that all parts of the driver and
52	 * firmware are using the same value (close to the ideal value).
53	 *
54	 * Since I have a strong suspicion that, if the firmware ever assumes a
55	 * crystal value at all, it will assume 28.636360 MHz, the crystal
56	 * freq used in calculations in this driver will be:
57	 *
58	 *	xtal_freq = 28.636360 MHz
59	 *
60	 * an error of less than 0.13 ppm which is way, way better than any off
61	 * the shelf crystal will have for accuracy anyway.
62	 *
63	 * Below I aim to run the PLLs' VCOs near 400 MHz to minimze error.
64	 *
65	 * Many thanks to Jeff Campbell and Mike Bradley for their extensive
66	 * investigation, experimentation, testing, and suggested solutions of
67	 * of audio/video sync problems with SVideo and CVBS captures.
68	 */
69
70	if (state->aud_input > CX18_AV_AUDIO_SERIAL2) {
71		switch (freq) {
72		case 32000:
73			/*
74			 * VID_PLL Integer = 0x0f, VID_PLL Post Divider = 0x04
75			 * AUX_PLL Integer = 0x0d, AUX PLL Post Divider = 0x20
76			 */
77			cx18_av_write4(cx, 0x108, 0x200d040f);
78
79			/* VID_PLL Fraction = 0x2be2fe */
80			/* xtal * 0xf.15f17f0/4 = 108 MHz: 432 MHz pre-postdiv*/
81			cx18_av_write4(cx, 0x10c, 0x002be2fe);
82
83			/* AUX_PLL Fraction = 0x176740c */
84			/* xtal * 0xd.bb3a060/0x20 = 32000 * 384: 393 MHz p-pd*/
85			cx18_av_write4(cx, 0x110, 0x0176740c);
86
87			/* src3/4/6_ctl */
88			/* 0x1.f77f = (4 * xtal/8*2/455) / 32000 */
89			cx18_av_write4(cx, 0x900, 0x0801f77f);
90			cx18_av_write4(cx, 0x904, 0x0801f77f);
91			cx18_av_write4(cx, 0x90c, 0x0801f77f);
92
93			/* SA_MCLK_SEL=1, SA_MCLK_DIV=0x20 */
94			cx18_av_write(cx, 0x127, 0x60);
95
96			/* AUD_COUNT = 0x2fff = 8 samples * 4 * 384 - 1 */
97			cx18_av_write4(cx, 0x12c, 0x11202fff);
98
99			/*
100			 * EN_AV_LOCK = 0
101			 * VID_COUNT = 0x0d2ef8 = 107999.000 * 8 =
102			 *  ((8 samples/32,000) * (13,500,000 * 8) * 4 - 1) * 8
103			 */
104			cx18_av_write4(cx, 0x128, 0xa00d2ef8);
105			break;
106
107		case 44100:
108			/*
109			 * VID_PLL Integer = 0x0f, VID_PLL Post Divider = 0x04
110			 * AUX_PLL Integer = 0x0e, AUX PLL Post Divider = 0x18
111			 */
112			cx18_av_write4(cx, 0x108, 0x180e040f);
113
114			/* VID_PLL Fraction = 0x2be2fe */
115			/* xtal * 0xf.15f17f0/4 = 108 MHz: 432 MHz pre-postdiv*/
116			cx18_av_write4(cx, 0x10c, 0x002be2fe);
117
118			/* AUX_PLL Fraction = 0x062a1f2 */
119			/* xtal * 0xe.3150f90/0x18 = 44100 * 384: 406 MHz p-pd*/
120			cx18_av_write4(cx, 0x110, 0x0062a1f2);
121
122			/* src3/4/6_ctl */
123			/* 0x1.6d59 = (4 * xtal/8*2/455) / 44100 */
124			cx18_av_write4(cx, 0x900, 0x08016d59);
125			cx18_av_write4(cx, 0x904, 0x08016d59);
126			cx18_av_write4(cx, 0x90c, 0x08016d59);
127
128			/* SA_MCLK_SEL=1, SA_MCLK_DIV=0x18 */
129			cx18_av_write(cx, 0x127, 0x58);
130
131			/* AUD_COUNT = 0x92ff = 49 samples * 2 * 384 - 1 */
132			cx18_av_write4(cx, 0x12c, 0x112092ff);
133
134			/*
135			 * EN_AV_LOCK = 0
136			 * VID_COUNT = 0x1d4bf8 = 239999.000 * 8 =
137			 *  ((49 samples/44,100) * (13,500,000 * 8) * 2 - 1) * 8
138			 */
139			cx18_av_write4(cx, 0x128, 0xa01d4bf8);
140			break;
141
142		case 48000:
143			/*
144			 * VID_PLL Integer = 0x0f, VID_PLL Post Divider = 0x04
145			 * AUX_PLL Integer = 0x0e, AUX PLL Post Divider = 0x16
146			 */
147			cx18_av_write4(cx, 0x108, 0x160e040f);
148
149			/* VID_PLL Fraction = 0x2be2fe */
150			/* xtal * 0xf.15f17f0/4 = 108 MHz: 432 MHz pre-postdiv*/
151			cx18_av_write4(cx, 0x10c, 0x002be2fe);
152
153			/* AUX_PLL Fraction = 0x05227ad */
154			/* xtal * 0xe.2913d68/0x16 = 48000 * 384: 406 MHz p-pd*/
155			cx18_av_write4(cx, 0x110, 0x005227ad);
156
157			/* src3/4/6_ctl */
158			/* 0x1.4faa = (4 * xtal/8*2/455) / 48000 */
159			cx18_av_write4(cx, 0x900, 0x08014faa);
160			cx18_av_write4(cx, 0x904, 0x08014faa);
161			cx18_av_write4(cx, 0x90c, 0x08014faa);
162
163			/* SA_MCLK_SEL=1, SA_MCLK_DIV=0x16 */
164			cx18_av_write(cx, 0x127, 0x56);
165
166			/* AUD_COUNT = 0x5fff = 4 samples * 16 * 384 - 1 */
167			cx18_av_write4(cx, 0x12c, 0x11205fff);
168
169			/*
170			 * EN_AV_LOCK = 0
171			 * VID_COUNT = 0x1193f8 = 143999.000 * 8 =
172			 *  ((4 samples/48,000) * (13,500,000 * 8) * 16 - 1) * 8
173			 */
174			cx18_av_write4(cx, 0x128, 0xa01193f8);
175			break;
176		}
177	} else {
178		switch (freq) {
179		case 32000:
180			/*
181			 * VID_PLL Integer = 0x0f, VID_PLL Post Divider = 0x04
182			 * AUX_PLL Integer = 0x0d, AUX PLL Post Divider = 0x30
183			 */
184			cx18_av_write4(cx, 0x108, 0x300d040f);
185
186			/* VID_PLL Fraction = 0x2be2fe */
187			/* xtal * 0xf.15f17f0/4 = 108 MHz: 432 MHz pre-postdiv*/
188			cx18_av_write4(cx, 0x10c, 0x002be2fe);
189
190			/* AUX_PLL Fraction = 0x176740c */
191			/* xtal * 0xd.bb3a060/0x30 = 32000 * 256: 393 MHz p-pd*/
192			cx18_av_write4(cx, 0x110, 0x0176740c);
193
194			/* src1_ctl */
195			/* 0x1.0000 = 32000/32000 */
196			cx18_av_write4(cx, 0x8f8, 0x08010000);
197
198			/* src3/4/6_ctl */
199			/* 0x2.0000 = 2 * (32000/32000) */
200			cx18_av_write4(cx, 0x900, 0x08020000);
201			cx18_av_write4(cx, 0x904, 0x08020000);
202			cx18_av_write4(cx, 0x90c, 0x08020000);
203
204			/* SA_MCLK_SEL=1, SA_MCLK_DIV=0x30 */
205			cx18_av_write(cx, 0x127, 0x70);
206
207			/* AUD_COUNT = 0x1fff = 8 samples * 4 * 256 - 1 */
208			cx18_av_write4(cx, 0x12c, 0x11201fff);
209
210			/*
211			 * EN_AV_LOCK = 0
212			 * VID_COUNT = 0x0d2ef8 = 107999.000 * 8 =
213			 *  ((8 samples/32,000) * (13,500,000 * 8) * 4 - 1) * 8
214			 */
215			cx18_av_write4(cx, 0x128, 0xa00d2ef8);
216			break;
217
218		case 44100:
219			/*
220			 * VID_PLL Integer = 0x0f, VID_PLL Post Divider = 0x04
221			 * AUX_PLL Integer = 0x0e, AUX PLL Post Divider = 0x24
222			 */
223			cx18_av_write4(cx, 0x108, 0x240e040f);
224
225			/* VID_PLL Fraction = 0x2be2fe */
226			/* xtal * 0xf.15f17f0/4 = 108 MHz: 432 MHz pre-postdiv*/
227			cx18_av_write4(cx, 0x10c, 0x002be2fe);
228
229			/* AUX_PLL Fraction = 0x062a1f2 */
230			/* xtal * 0xe.3150f90/0x24 = 44100 * 256: 406 MHz p-pd*/
231			cx18_av_write4(cx, 0x110, 0x0062a1f2);
232
233			/* src1_ctl */
234			/* 0x1.60cd = 44100/32000 */
235			cx18_av_write4(cx, 0x8f8, 0x080160cd);
236
237			/* src3/4/6_ctl */
238			/* 0x1.7385 = 2 * (32000/44100) */
239			cx18_av_write4(cx, 0x900, 0x08017385);
240			cx18_av_write4(cx, 0x904, 0x08017385);
241			cx18_av_write4(cx, 0x90c, 0x08017385);
242
243			/* SA_MCLK_SEL=1, SA_MCLK_DIV=0x24 */
244			cx18_av_write(cx, 0x127, 0x64);
245
246			/* AUD_COUNT = 0x61ff = 49 samples * 2 * 256 - 1 */
247			cx18_av_write4(cx, 0x12c, 0x112061ff);
248
249			/*
250			 * EN_AV_LOCK = 0
251			 * VID_COUNT = 0x1d4bf8 = 239999.000 * 8 =
252			 *  ((49 samples/44,100) * (13,500,000 * 8) * 2 - 1) * 8
253			 */
254			cx18_av_write4(cx, 0x128, 0xa01d4bf8);
255			break;
256
257		case 48000:
258			/*
259			 * VID_PLL Integer = 0x0f, VID_PLL Post Divider = 0x04
260			 * AUX_PLL Integer = 0x0d, AUX PLL Post Divider = 0x20
261			 */
262			cx18_av_write4(cx, 0x108, 0x200d040f);
263
264			/* VID_PLL Fraction = 0x2be2fe */
265			/* xtal * 0xf.15f17f0/4 = 108 MHz: 432 MHz pre-postdiv*/
266			cx18_av_write4(cx, 0x10c, 0x002be2fe);
267
268			/* AUX_PLL Fraction = 0x176740c */
269			/* xtal * 0xd.bb3a060/0x20 = 48000 * 256: 393 MHz p-pd*/
270			cx18_av_write4(cx, 0x110, 0x0176740c);
271
272			/* src1_ctl */
273			/* 0x1.8000 = 48000/32000 */
274			cx18_av_write4(cx, 0x8f8, 0x08018000);
275
276			/* src3/4/6_ctl */
277			/* 0x1.5555 = 2 * (32000/48000) */
278			cx18_av_write4(cx, 0x900, 0x08015555);
279			cx18_av_write4(cx, 0x904, 0x08015555);
280			cx18_av_write4(cx, 0x90c, 0x08015555);
281
282			/* SA_MCLK_SEL=1, SA_MCLK_DIV=0x20 */
283			cx18_av_write(cx, 0x127, 0x60);
284
285			/* AUD_COUNT = 0x3fff = 4 samples * 16 * 256 - 1 */
286			cx18_av_write4(cx, 0x12c, 0x11203fff);
287
288			/*
289			 * EN_AV_LOCK = 0
290			 * VID_COUNT = 0x1193f8 = 143999.000 * 8 =
291			 *  ((4 samples/48,000) * (13,500,000 * 8) * 16 - 1) * 8
292			 */
293			cx18_av_write4(cx, 0x128, 0xa01193f8);
294			break;
295		}
296	}
297
298	state->audclk_freq = freq;
299
300	return 0;
301}
302
303void cx18_av_audio_set_path(struct cx18 *cx)
304{
305	struct cx18_av_state *state = &cx->av_state;
306	u8 v;
307
308	/* stop microcontroller */
309	v = cx18_av_read(cx, 0x803) & ~0x10;
310	cx18_av_write_expect(cx, 0x803, v, v, 0x1f);
311
312	/* assert soft reset */
313	v = cx18_av_read(cx, 0x810) | 0x01;
314	cx18_av_write_expect(cx, 0x810, v, v, 0x0f);
315
316	/* Mute everything to prevent the PFFT! */
317	cx18_av_write(cx, 0x8d3, 0x1f);
318
319	if (state->aud_input <= CX18_AV_AUDIO_SERIAL2) {
320		/* Set Path1 to Serial Audio Input */
321		cx18_av_write4(cx, 0x8d0, 0x01011012);
322
323		/* The microcontroller should not be started for the
324		 * non-tuner inputs: autodetection is specific for
325		 * TV audio. */
326	} else {
327		/* Set Path1 to Analog Demod Main Channel */
328		cx18_av_write4(cx, 0x8d0, 0x1f063870);
329	}
330
331	set_audclk_freq(cx, state->audclk_freq);
332
333	/* deassert soft reset */
334	v = cx18_av_read(cx, 0x810) & ~0x01;
335	cx18_av_write_expect(cx, 0x810, v, v, 0x0f);
336
337	if (state->aud_input > CX18_AV_AUDIO_SERIAL2) {
338		/* When the microcontroller detects the
339		 * audio format, it will unmute the lines */
340		v = cx18_av_read(cx, 0x803) | 0x10;
341		cx18_av_write_expect(cx, 0x803, v, v, 0x1f);
342	}
343}
344
345static void set_volume(struct cx18 *cx, int volume)
346{
347	/* First convert the volume to msp3400 values (0-127) */
348	int vol = volume >> 9;
349	/* now scale it up to cx18_av values
350	 * -114dB to -96dB maps to 0
351	 * this should be 19, but in my testing that was 4dB too loud */
352	if (vol <= 23)
353		vol = 0;
354	else
355		vol -= 23;
356
357	/* PATH1_VOLUME */
358	cx18_av_write(cx, 0x8d4, 228 - (vol * 2));
359}
360
361static void set_bass(struct cx18 *cx, int bass)
362{
363	/* PATH1_EQ_BASS_VOL */
364	cx18_av_and_or(cx, 0x8d9, ~0x3f, 48 - (bass * 48 / 0xffff));
365}
366
367static void set_treble(struct cx18 *cx, int treble)
368{
369	/* PATH1_EQ_TREBLE_VOL */
370	cx18_av_and_or(cx, 0x8db, ~0x3f, 48 - (treble * 48 / 0xffff));
371}
372
373static void set_balance(struct cx18 *cx, int balance)
374{
375	int bal = balance >> 8;
376	if (bal > 0x80) {
377		/* PATH1_BAL_LEFT */
378		cx18_av_and_or(cx, 0x8d5, 0x7f, 0x80);
379		/* PATH1_BAL_LEVEL */
380		cx18_av_and_or(cx, 0x8d5, ~0x7f, bal & 0x7f);
381	} else {
382		/* PATH1_BAL_LEFT */
383		cx18_av_and_or(cx, 0x8d5, 0x7f, 0x00);
384		/* PATH1_BAL_LEVEL */
385		cx18_av_and_or(cx, 0x8d5, ~0x7f, 0x80 - bal);
386	}
387}
388
389static void set_mute(struct cx18 *cx, int mute)
390{
391	struct cx18_av_state *state = &cx->av_state;
392	u8 v;
393
394	if (state->aud_input > CX18_AV_AUDIO_SERIAL2) {
395		/* Must turn off microcontroller in order to mute sound.
396		 * Not sure if this is the best method, but it does work.
397		 * If the microcontroller is running, then it will undo any
398		 * changes to the mute register. */
399		v = cx18_av_read(cx, 0x803);
400		if (mute) {
401			/* disable microcontroller */
402			v &= ~0x10;
403			cx18_av_write_expect(cx, 0x803, v, v, 0x1f);
404			cx18_av_write(cx, 0x8d3, 0x1f);
405		} else {
406			/* enable microcontroller */
407			v |= 0x10;
408			cx18_av_write_expect(cx, 0x803, v, v, 0x1f);
409		}
410	} else {
411		/* SRC1_MUTE_EN */
412		cx18_av_and_or(cx, 0x8d3, ~0x2, mute ? 0x02 : 0x00);
413	}
414}
415
416int cx18_av_s_clock_freq(struct v4l2_subdev *sd, u32 freq)
417{
418	struct cx18 *cx = v4l2_get_subdevdata(sd);
419	struct cx18_av_state *state = &cx->av_state;
420	int retval;
421	u8 v;
422
423	if (state->aud_input > CX18_AV_AUDIO_SERIAL2) {
424		v = cx18_av_read(cx, 0x803) & ~0x10;
425		cx18_av_write_expect(cx, 0x803, v, v, 0x1f);
426		cx18_av_write(cx, 0x8d3, 0x1f);
427	}
428	v = cx18_av_read(cx, 0x810) | 0x1;
429	cx18_av_write_expect(cx, 0x810, v, v, 0x0f);
430
431	retval = set_audclk_freq(cx, freq);
432
433	v = cx18_av_read(cx, 0x810) & ~0x1;
434	cx18_av_write_expect(cx, 0x810, v, v, 0x0f);
435	if (state->aud_input > CX18_AV_AUDIO_SERIAL2) {
436		v = cx18_av_read(cx, 0x803) | 0x10;
437		cx18_av_write_expect(cx, 0x803, v, v, 0x1f);
438	}
439	return retval;
440}
441
442static int cx18_av_audio_s_ctrl(struct v4l2_ctrl *ctrl)
443{
444	struct v4l2_subdev *sd = to_sd(ctrl);
445	struct cx18 *cx = v4l2_get_subdevdata(sd);
446
447	switch (ctrl->id) {
448	case V4L2_CID_AUDIO_VOLUME:
449		set_volume(cx, ctrl->val);
450		break;
451	case V4L2_CID_AUDIO_BASS:
452		set_bass(cx, ctrl->val);
453		break;
454	case V4L2_CID_AUDIO_TREBLE:
455		set_treble(cx, ctrl->val);
456		break;
457	case V4L2_CID_AUDIO_BALANCE:
458		set_balance(cx, ctrl->val);
459		break;
460	case V4L2_CID_AUDIO_MUTE:
461		set_mute(cx, ctrl->val);
462		break;
463	default:
464		return -EINVAL;
465	}
466	return 0;
467}
468
469const struct v4l2_ctrl_ops cx18_av_audio_ctrl_ops = {
470	.s_ctrl = cx18_av_audio_s_ctrl,
471};
472