• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  * device driver for philips saa7134 based TV cards
4  * tv audio decoder (fm stereo, nicam, ...)
5  *
6  * (c) 2001-03 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
7  *
8  *  This program is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation; either version 2 of the License, or
11  *  (at your option) any later version.
12  *
13  *  This program is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License
19  *  along with this program; if not, write to the Free Software
20  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21  */
22 
23 #include <linux/init.h>
24 #include <linux/list.h>
25 #include <linux/module.h>
26 #include <linux/kernel.h>
27 #include <linux/kthread.h>
28 #include <linux/slab.h>
29 #include <linux/delay.h>
30 #include <linux/freezer.h>
31 #include <asm/div64.h>
32 
33 #include "saa7134-reg.h"
34 #include "saa7134.h"
35 
36 /* ------------------------------------------------------------------ */
37 
38 static unsigned int audio_debug;
39 module_param(audio_debug, int, 0644);
40 MODULE_PARM_DESC(audio_debug,"enable debug messages [tv audio]");
41 
42 static unsigned int audio_ddep;
43 module_param(audio_ddep, int, 0644);
44 MODULE_PARM_DESC(audio_ddep,"audio ddep overwrite");
45 
46 static int audio_clock_override = UNSET;
47 module_param(audio_clock_override, int, 0644);
48 
49 static int audio_clock_tweak;
50 module_param(audio_clock_tweak, int, 0644);
51 MODULE_PARM_DESC(audio_clock_tweak, "Audio clock tick fine tuning for cards with audio crystal that's slightly off (range [-1024 .. 1024])");
52 
53 #define dprintk(fmt, arg...)	if (audio_debug) \
54 	printk(KERN_DEBUG "%s/audio: " fmt, dev->name , ## arg)
55 #define d2printk(fmt, arg...)	if (audio_debug > 1) \
56 	printk(KERN_DEBUG "%s/audio: " fmt, dev->name, ## arg)
57 
58 #define print_regb(reg) printk("%s:   reg 0x%03x [%-16s]: 0x%02x\n", \
59 		dev->name,(SAA7134_##reg),(#reg),saa_readb((SAA7134_##reg)))
60 
61 /* msecs */
62 #define SCAN_INITIAL_DELAY     1000
63 #define SCAN_SAMPLE_DELAY       200
64 #define SCAN_SUBCARRIER_DELAY  2000
65 
66 /* ------------------------------------------------------------------ */
67 /* saa7134 code                                                       */
68 
69 static struct mainscan {
70 	char         *name;
71 	v4l2_std_id  std;
72 	int          carr;
73 } mainscan[] = {
74 	{
75 		.name = "MN",
76 		.std  = V4L2_STD_MN,
77 		.carr = 4500,
78 	},{
79 		.name = "BGH",
80 		.std  = V4L2_STD_B | V4L2_STD_GH,
81 		.carr = 5500,
82 	},{
83 		.name = "I",
84 		.std  = V4L2_STD_PAL_I,
85 		.carr = 6000,
86 	},{
87 		.name = "DKL",
88 		.std  = V4L2_STD_DK | V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC,
89 		.carr = 6500,
90 	}
91 };
92 
93 static struct saa7134_tvaudio tvaudio[] = {
94 	{
95 		.name          = "PAL-B/G FM-stereo",
96 		.std           = V4L2_STD_PAL_BG,
97 		.mode          = TVAUDIO_FM_BG_STEREO,
98 		.carr1         = 5500,
99 		.carr2         = 5742,
100 	},{
101 		.name          = "PAL-D/K1 FM-stereo",
102 		.std           = V4L2_STD_PAL_DK,
103 		.carr1         = 6500,
104 		.carr2         = 6258,
105 		.mode          = TVAUDIO_FM_BG_STEREO,
106 	},{
107 		.name          = "PAL-D/K2 FM-stereo",
108 		.std           = V4L2_STD_PAL_DK,
109 		.carr1         = 6500,
110 		.carr2         = 6742,
111 		.mode          = TVAUDIO_FM_BG_STEREO,
112 	},{
113 		.name          = "PAL-D/K3 FM-stereo",
114 		.std           = V4L2_STD_PAL_DK,
115 		.carr1         = 6500,
116 		.carr2         = 5742,
117 		.mode          = TVAUDIO_FM_BG_STEREO,
118 	},{
119 		.name          = "PAL-B/G NICAM",
120 		.std           = V4L2_STD_PAL_BG,
121 		.carr1         = 5500,
122 		.carr2         = 5850,
123 		.mode          = TVAUDIO_NICAM_FM,
124 	},{
125 		.name          = "PAL-I NICAM",
126 		.std           = V4L2_STD_PAL_I,
127 		.carr1         = 6000,
128 		.carr2         = 6552,
129 		.mode          = TVAUDIO_NICAM_FM,
130 	},{
131 		.name          = "PAL-D/K NICAM",
132 		.std           = V4L2_STD_PAL_DK,
133 		.carr1         = 6500,
134 		.carr2         = 5850,
135 		.mode          = TVAUDIO_NICAM_FM,
136 	},{
137 		.name          = "SECAM-L NICAM",
138 		.std           = V4L2_STD_SECAM_L,
139 		.carr1         = 6500,
140 		.carr2         = 5850,
141 		.mode          = TVAUDIO_NICAM_AM,
142 	},{
143 		.name          = "SECAM-D/K NICAM",
144 		.std           = V4L2_STD_SECAM_DK,
145 		.carr1         = 6500,
146 		.carr2         = 5850,
147 		.mode          = TVAUDIO_NICAM_FM,
148 	},{
149 		.name          = "NTSC-A2 FM-stereo",
150 		.std           = V4L2_STD_NTSC,
151 		.carr1         = 4500,
152 		.carr2         = 4724,
153 		.mode          = TVAUDIO_FM_K_STEREO,
154 	},{
155 		.name          = "NTSC-M",
156 		.std           = V4L2_STD_NTSC,
157 		.carr1         = 4500,
158 		.carr2         = -1,
159 		.mode          = TVAUDIO_FM_MONO,
160 	}
161 };
162 #define TVAUDIO ARRAY_SIZE(tvaudio)
163 
164 /* ------------------------------------------------------------------ */
165 
tvaudio_carr2reg(u32 carrier)166 static u32 tvaudio_carr2reg(u32 carrier)
167 {
168 	u64 a = carrier;
169 
170 	a <<= 24;
171 	do_div(a,12288);
172 	return a;
173 }
174 
tvaudio_setcarrier(struct saa7134_dev * dev,int primary,int secondary)175 static void tvaudio_setcarrier(struct saa7134_dev *dev,
176 			       int primary, int secondary)
177 {
178 	if (-1 == secondary)
179 		secondary = primary;
180 	saa_writel(SAA7134_CARRIER1_FREQ0 >> 2, tvaudio_carr2reg(primary));
181 	saa_writel(SAA7134_CARRIER2_FREQ0 >> 2, tvaudio_carr2reg(secondary));
182 }
183 
184 #define SAA7134_MUTE_MASK 0xbb
185 #define SAA7134_MUTE_ANALOG 0x04
186 #define SAA7134_MUTE_I2S 0x40
187 
mute_input_7134(struct saa7134_dev * dev)188 static void mute_input_7134(struct saa7134_dev *dev)
189 {
190 	unsigned int mute;
191 	struct saa7134_input *in;
192 	int ausel=0, ics=0, ocs=0;
193 	int mask;
194 
195 	/* look what is to do ... */
196 	in   = dev->input;
197 	mute = (dev->ctl_mute ||
198 		(dev->automute  &&  (&card(dev).radio) != in));
199 	if (card(dev).mute.name) {
200 		/*
201 		 * 7130 - we'll mute using some unconnected audio input
202 		 * 7134 - we'll probably should switch external mux with gpio
203 		 */
204 		if (mute)
205 			in = &card(dev).mute;
206 	}
207 
208 	if (dev->hw_mute  == mute &&
209 		dev->hw_input == in && !dev->insuspend) {
210 		dprintk("mute/input: nothing to do [mute=%d,input=%s]\n",
211 			mute,in->name);
212 		return;
213 	}
214 
215 	dprintk("ctl_mute=%d automute=%d input=%s  =>  mute=%d input=%s\n",
216 		dev->ctl_mute,dev->automute,dev->input->name,mute,in->name);
217 	dev->hw_mute  = mute;
218 	dev->hw_input = in;
219 
220 	if (PCI_DEVICE_ID_PHILIPS_SAA7134 == dev->pci->device)
221 		/* 7134 mute */
222 		saa_writeb(SAA7134_AUDIO_MUTE_CTRL, mute ?
223 						    SAA7134_MUTE_MASK |
224 						    SAA7134_MUTE_ANALOG |
225 						    SAA7134_MUTE_I2S :
226 						    SAA7134_MUTE_MASK);
227 
228 	/* switch internal audio mux */
229 	switch (in->amux) {
230 	case TV:         ausel=0xc0; ics=0x00; ocs=0x02; break;
231 	case LINE1:      ausel=0x80; ics=0x00; ocs=0x00; break;
232 	case LINE2:      ausel=0x80; ics=0x08; ocs=0x01; break;
233 	case LINE2_LEFT: ausel=0x80; ics=0x08; ocs=0x05; break;
234 	}
235 	saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, ausel);
236 	saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x08, ics);
237 	saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x07, ocs);
238 	// for oss, we need to change the clock configuration
239 	if (in->amux == TV)
240 		saa_andorb(SAA7134_SIF_SAMPLE_FREQ,   0x03, 0x00);
241 	else
242 		saa_andorb(SAA7134_SIF_SAMPLE_FREQ,   0x03, 0x01);
243 
244 	/* switch gpio-connected external audio mux */
245 	if (0 == card(dev).gpiomask)
246 		return;
247 
248 	mask = card(dev).gpiomask;
249 	saa_andorl(SAA7134_GPIO_GPMODE0 >> 2,   mask, mask);
250 	saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, mask, in->gpio);
251 	saa7134_track_gpio(dev,in->name);
252 }
253 
tvaudio_setmode(struct saa7134_dev * dev,struct saa7134_tvaudio * audio,char * note)254 static void tvaudio_setmode(struct saa7134_dev *dev,
255 			    struct saa7134_tvaudio *audio,
256 			    char *note)
257 {
258 	int acpf, tweak = 0;
259 
260 	if (dev->tvnorm->id == V4L2_STD_NTSC) {
261 		acpf = 0x19066;
262 	} else {
263 		acpf = 0x1e000;
264 	}
265 	if (audio_clock_tweak > -1024 && audio_clock_tweak < 1024)
266 		tweak = audio_clock_tweak;
267 
268 	if (note)
269 		dprintk("tvaudio_setmode: %s %s [%d.%03d/%d.%03d MHz] acpf=%d%+d\n",
270 			note,audio->name,
271 			audio->carr1 / 1000, audio->carr1 % 1000,
272 			audio->carr2 / 1000, audio->carr2 % 1000,
273 			acpf, tweak);
274 
275 	acpf += tweak;
276 	saa_writeb(SAA7134_AUDIO_CLOCKS_PER_FIELD0, (acpf & 0x0000ff) >> 0);
277 	saa_writeb(SAA7134_AUDIO_CLOCKS_PER_FIELD1, (acpf & 0x00ff00) >> 8);
278 	saa_writeb(SAA7134_AUDIO_CLOCKS_PER_FIELD2, (acpf & 0x030000) >> 16);
279 	tvaudio_setcarrier(dev,audio->carr1,audio->carr2);
280 
281 	switch (audio->mode) {
282 	case TVAUDIO_FM_MONO:
283 	case TVAUDIO_FM_BG_STEREO:
284 		saa_writeb(SAA7134_DEMODULATOR,               0x00);
285 		saa_writeb(SAA7134_DCXO_IDENT_CTRL,           0x00);
286 		saa_writeb(SAA7134_FM_DEEMPHASIS,             0x22);
287 		saa_writeb(SAA7134_FM_DEMATRIX,               0x80);
288 		saa_writeb(SAA7134_STEREO_DAC_OUTPUT_SELECT,  0xa0);
289 		break;
290 	case TVAUDIO_FM_K_STEREO:
291 		saa_writeb(SAA7134_DEMODULATOR,               0x00);
292 		saa_writeb(SAA7134_DCXO_IDENT_CTRL,           0x01);
293 		saa_writeb(SAA7134_FM_DEEMPHASIS,             0x22);
294 		saa_writeb(SAA7134_FM_DEMATRIX,               0x80);
295 		saa_writeb(SAA7134_STEREO_DAC_OUTPUT_SELECT,  0xa0);
296 		break;
297 	case TVAUDIO_NICAM_FM:
298 		saa_writeb(SAA7134_DEMODULATOR,               0x10);
299 		saa_writeb(SAA7134_DCXO_IDENT_CTRL,           0x00);
300 		saa_writeb(SAA7134_FM_DEEMPHASIS,             0x44);
301 		saa_writeb(SAA7134_STEREO_DAC_OUTPUT_SELECT,  0xa1);
302 		saa_writeb(SAA7134_NICAM_CONFIG,              0x00);
303 		break;
304 	case TVAUDIO_NICAM_AM:
305 		saa_writeb(SAA7134_DEMODULATOR,               0x12);
306 		saa_writeb(SAA7134_DCXO_IDENT_CTRL,           0x00);
307 		saa_writeb(SAA7134_FM_DEEMPHASIS,             0x44);
308 		saa_writeb(SAA7134_STEREO_DAC_OUTPUT_SELECT,  0xa1);
309 		saa_writeb(SAA7134_NICAM_CONFIG,              0x00);
310 		break;
311 	case TVAUDIO_FM_SAT_STEREO:
312 		/* not implemented (yet) */
313 		break;
314 	}
315 }
316 
tvaudio_sleep(struct saa7134_dev * dev,int timeout)317 static int tvaudio_sleep(struct saa7134_dev *dev, int timeout)
318 {
319 	if (dev->thread.scan1 == dev->thread.scan2 &&
320 	    !kthread_should_stop()) {
321 		if (timeout < 0) {
322 			set_current_state(TASK_INTERRUPTIBLE);
323 			schedule();
324 		} else {
325 			schedule_timeout_interruptible
326 						(msecs_to_jiffies(timeout));
327 		}
328 	}
329 	return dev->thread.scan1 != dev->thread.scan2;
330 }
331 
tvaudio_checkcarrier(struct saa7134_dev * dev,struct mainscan * scan)332 static int tvaudio_checkcarrier(struct saa7134_dev *dev, struct mainscan *scan)
333 {
334 	__s32 left,right,value;
335 
336 	if (audio_debug > 1) {
337 		int i;
338 		dprintk("debug %d:",scan->carr);
339 		for (i = -150; i <= 150; i += 30) {
340 			tvaudio_setcarrier(dev,scan->carr+i,scan->carr+i);
341 			saa_readl(SAA7134_LEVEL_READOUT1 >> 2);
342 			if (tvaudio_sleep(dev,SCAN_SAMPLE_DELAY))
343 				return -1;
344 			value = saa_readl(SAA7134_LEVEL_READOUT1 >> 2);
345 			if (0 == i)
346 				printk("  #  %6d  # ",value >> 16);
347 			else
348 				printk(" %6d",value >> 16);
349 		}
350 		printk("\n");
351 	}
352 	if (dev->tvnorm->id & scan->std) {
353 		tvaudio_setcarrier(dev,scan->carr-90,scan->carr-90);
354 		saa_readl(SAA7134_LEVEL_READOUT1 >> 2);
355 		if (tvaudio_sleep(dev,SCAN_SAMPLE_DELAY))
356 			return -1;
357 		left = saa_readl(SAA7134_LEVEL_READOUT1 >> 2);
358 
359 		tvaudio_setcarrier(dev,scan->carr+90,scan->carr+90);
360 		saa_readl(SAA7134_LEVEL_READOUT1 >> 2);
361 		if (tvaudio_sleep(dev,SCAN_SAMPLE_DELAY))
362 			return -1;
363 		right = saa_readl(SAA7134_LEVEL_READOUT1 >> 2);
364 
365 		left >>= 16;
366 		right >>= 16;
367 		value = left > right ? left - right : right - left;
368 		dprintk("scanning %d.%03d MHz [%4s] =>  dc is %5d [%d/%d]\n",
369 			scan->carr / 1000, scan->carr % 1000,
370 			scan->name, value, left, right);
371 	} else {
372 		value = 0;
373 		dprintk("skipping %d.%03d MHz [%4s]\n",
374 			scan->carr / 1000, scan->carr % 1000, scan->name);
375 	}
376 	return value;
377 }
378 
379 
tvaudio_getstereo(struct saa7134_dev * dev,struct saa7134_tvaudio * audio)380 static int tvaudio_getstereo(struct saa7134_dev *dev, struct saa7134_tvaudio *audio)
381 {
382 	__u32 idp, nicam, nicam_status;
383 	int retval = -1;
384 
385 	switch (audio->mode) {
386 	case TVAUDIO_FM_MONO:
387 		return V4L2_TUNER_SUB_MONO;
388 	case TVAUDIO_FM_K_STEREO:
389 	case TVAUDIO_FM_BG_STEREO:
390 		idp = (saa_readb(SAA7134_IDENT_SIF) & 0xe0) >> 5;
391 		dprintk("getstereo: fm/stereo: idp=0x%x\n",idp);
392 		if (0x03 == (idp & 0x03))
393 			retval = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
394 		else if (0x05 == (idp & 0x05))
395 			retval = V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
396 		else if (0x01 == (idp & 0x01))
397 			retval = V4L2_TUNER_SUB_MONO;
398 		break;
399 	case TVAUDIO_FM_SAT_STEREO:
400 		/* not implemented (yet) */
401 		break;
402 	case TVAUDIO_NICAM_FM:
403 	case TVAUDIO_NICAM_AM:
404 		nicam = saa_readb(SAA7134_AUDIO_STATUS);
405 		dprintk("getstereo: nicam=0x%x\n",nicam);
406 		if (nicam & 0x1) {
407 			nicam_status = saa_readb(SAA7134_NICAM_STATUS);
408 			dprintk("getstereo: nicam_status=0x%x\n", nicam_status);
409 
410 			switch (nicam_status & 0x03) {
411 			    case 0x01:
412 				retval = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
413 				break;
414 			    case 0x02:
415 				retval = V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
416 				break;
417 			    default:
418 				retval = V4L2_TUNER_SUB_MONO;
419 			}
420 		} else {
421 			/* No nicam detected */
422 		}
423 		break;
424 	}
425 	if (retval != -1)
426 		dprintk("found audio subchannels:%s%s%s%s\n",
427 			(retval & V4L2_TUNER_SUB_MONO)   ? " mono"   : "",
428 			(retval & V4L2_TUNER_SUB_STEREO) ? " stereo" : "",
429 			(retval & V4L2_TUNER_SUB_LANG1)  ? " lang1"  : "",
430 			(retval & V4L2_TUNER_SUB_LANG2)  ? " lang2"  : "");
431 	return retval;
432 }
433 
tvaudio_setstereo(struct saa7134_dev * dev,struct saa7134_tvaudio * audio,u32 mode)434 static int tvaudio_setstereo(struct saa7134_dev *dev, struct saa7134_tvaudio *audio,
435 			     u32 mode)
436 {
437 	static char *name[] = {
438 		[ V4L2_TUNER_MODE_MONO   ] = "mono",
439 		[ V4L2_TUNER_MODE_STEREO ] = "stereo",
440 		[ V4L2_TUNER_MODE_LANG1  ] = "lang1",
441 		[ V4L2_TUNER_MODE_LANG2  ] = "lang2",
442 		[ V4L2_TUNER_MODE_LANG1_LANG2  ] = "lang1+lang2",
443 	};
444 	static u32 fm[] = {
445 		[ V4L2_TUNER_MODE_MONO   ] = 0x00,  /* ch1  */
446 		[ V4L2_TUNER_MODE_STEREO ] = 0x80,  /* auto */
447 		[ V4L2_TUNER_MODE_LANG1  ] = 0x00,  /* ch1  */
448 		[ V4L2_TUNER_MODE_LANG2  ] = 0x01,  /* ch2  */
449 		[ V4L2_TUNER_MODE_LANG1_LANG2 ] = 0x80,  /* auto */
450 	};
451 	u32 reg;
452 
453 	switch (audio->mode) {
454 	case TVAUDIO_FM_MONO:
455 		/* nothing to do ... */
456 		break;
457 	case TVAUDIO_FM_K_STEREO:
458 	case TVAUDIO_FM_BG_STEREO:
459 	case TVAUDIO_NICAM_AM:
460 	case TVAUDIO_NICAM_FM:
461 		dprintk("setstereo [fm] => %s\n",
462 			name[ mode % ARRAY_SIZE(name) ]);
463 		reg = fm[ mode % ARRAY_SIZE(fm) ];
464 		saa_writeb(SAA7134_FM_DEMATRIX, reg);
465 		break;
466 	case TVAUDIO_FM_SAT_STEREO:
467 		/* Not implemented */
468 		break;
469 	}
470 	return 0;
471 }
472 
tvaudio_thread(void * data)473 static int tvaudio_thread(void *data)
474 {
475 	struct saa7134_dev *dev = data;
476 	int carr_vals[ARRAY_SIZE(mainscan)];
477 	unsigned int i, audio, nscan;
478 	int max1,max2,carrier,rx,mode,lastmode,default_carrier;
479 
480 	set_freezable();
481 
482 	for (;;) {
483 		tvaudio_sleep(dev,-1);
484 		if (kthread_should_stop())
485 			goto done;
486 
487 	restart:
488 		try_to_freeze();
489 
490 		dev->thread.scan1 = dev->thread.scan2;
491 		dprintk("tvaudio thread scan start [%d]\n",dev->thread.scan1);
492 		dev->tvaudio  = NULL;
493 
494 		saa_writeb(SAA7134_MONITOR_SELECT,   0xa0);
495 		saa_writeb(SAA7134_FM_DEMATRIX,      0x80);
496 
497 		if (dev->ctl_automute)
498 			dev->automute = 1;
499 
500 		mute_input_7134(dev);
501 
502 		/* give the tuner some time */
503 		if (tvaudio_sleep(dev,SCAN_INITIAL_DELAY))
504 			goto restart;
505 
506 		max1 = 0;
507 		max2 = 0;
508 		nscan = 0;
509 		carrier = 0;
510 		default_carrier = 0;
511 		for (i = 0; i < ARRAY_SIZE(mainscan); i++) {
512 			if (!(dev->tvnorm->id & mainscan[i].std))
513 				continue;
514 			if (!default_carrier)
515 				default_carrier = mainscan[i].carr;
516 			nscan++;
517 		}
518 
519 		if (1 == nscan) {
520 			/* only one candidate -- skip scan ;) */
521 			dprintk("only one main carrier candidate - skipping scan\n");
522 			max1 = 12345;
523 			carrier = default_carrier;
524 		} else {
525 			/* scan for the main carrier */
526 			saa_writeb(SAA7134_MONITOR_SELECT,0x00);
527 			tvaudio_setmode(dev,&tvaudio[0],NULL);
528 			for (i = 0; i < ARRAY_SIZE(mainscan); i++) {
529 				carr_vals[i] = tvaudio_checkcarrier(dev, mainscan+i);
530 				if (dev->thread.scan1 != dev->thread.scan2)
531 					goto restart;
532 			}
533 			for (max1 = 0, max2 = 0, i = 0; i < ARRAY_SIZE(mainscan); i++) {
534 				if (max1 < carr_vals[i]) {
535 					max2 = max1;
536 					max1 = carr_vals[i];
537 					carrier = mainscan[i].carr;
538 				} else if (max2 < carr_vals[i]) {
539 					max2 = carr_vals[i];
540 				}
541 			}
542 		}
543 
544 		if (0 != carrier && max1 > 2000 && max1 > max2*3) {
545 			/* found good carrier */
546 			dprintk("found %s main sound carrier @ %d.%03d MHz [%d/%d]\n",
547 				dev->tvnorm->name, carrier/1000, carrier%1000,
548 				max1, max2);
549 			dev->last_carrier = carrier;
550 
551 		} else if (0 != dev->last_carrier) {
552 			/* no carrier -- try last detected one as fallback */
553 			carrier = dev->last_carrier;
554 			dprintk(KERN_WARNING "%s/audio: audio carrier scan failed, "
555 			       "using %d.%03d MHz [last detected]\n",
556 			       dev->name, carrier/1000, carrier%1000);
557 
558 		} else {
559 			/* no carrier + no fallback -- use default */
560 			carrier = default_carrier;
561 			dprintk(KERN_WARNING "%s/audio: audio carrier scan failed, "
562 			       "using %d.%03d MHz [default]\n",
563 			       dev->name, carrier/1000, carrier%1000);
564 		}
565 		tvaudio_setcarrier(dev,carrier,carrier);
566 		dev->automute = 0;
567 		saa_andorb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0x30, 0x00);
568 		saa7134_tvaudio_setmute(dev);
569 		/* find the exact tv audio norm */
570 		for (audio = UNSET, i = 0; i < TVAUDIO; i++) {
571 			if (dev->tvnorm->id != UNSET &&
572 				!(dev->tvnorm->id & tvaudio[i].std))
573 				continue;
574 			if (tvaudio[i].carr1 != carrier)
575 				continue;
576 			/* Note: at least the primary carrier is right here */
577 			if (UNSET == audio)
578 				audio = i;
579 			tvaudio_setmode(dev,&tvaudio[i],"trying");
580 			if (tvaudio_sleep(dev,SCAN_SUBCARRIER_DELAY))
581 				goto restart;
582 			if (-1 != tvaudio_getstereo(dev,&tvaudio[i])) {
583 				audio = i;
584 				break;
585 			}
586 		}
587 		saa_andorb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0x30, 0x30);
588 		if (UNSET == audio)
589 			continue;
590 		tvaudio_setmode(dev,&tvaudio[audio],"using");
591 
592 		tvaudio_setstereo(dev,&tvaudio[audio],V4L2_TUNER_MODE_MONO);
593 		dev->tvaudio = &tvaudio[audio];
594 
595 		lastmode = 42;
596 		for (;;) {
597 
598 			try_to_freeze();
599 
600 			if (tvaudio_sleep(dev,5000))
601 				goto restart;
602 			if (kthread_should_stop())
603 				break;
604 			if (UNSET == dev->thread.mode) {
605 				rx = tvaudio_getstereo(dev,&tvaudio[i]);
606 				mode = saa7134_tvaudio_rx2mode(rx);
607 			} else {
608 				mode = dev->thread.mode;
609 			}
610 			if (lastmode != mode) {
611 				tvaudio_setstereo(dev,&tvaudio[audio],mode);
612 				lastmode = mode;
613 			}
614 		}
615 	}
616 
617  done:
618 	dev->thread.stopped = 1;
619 	return 0;
620 }
621 
622 /* ------------------------------------------------------------------ */
623 /* saa7133 / saa7135 code                                             */
624 
625 static char *stdres[0x20] = {
626 	[0x00] = "no standard detected",
627 	[0x01] = "B/G (in progress)",
628 	[0x02] = "D/K (in progress)",
629 	[0x03] = "M (in progress)",
630 
631 	[0x04] = "B/G A2",
632 	[0x05] = "B/G NICAM",
633 	[0x06] = "D/K A2 (1)",
634 	[0x07] = "D/K A2 (2)",
635 	[0x08] = "D/K A2 (3)",
636 	[0x09] = "D/K NICAM",
637 	[0x0a] = "L NICAM",
638 	[0x0b] = "I NICAM",
639 
640 	[0x0c] = "M Korea",
641 	[0x0d] = "M BTSC ",
642 	[0x0e] = "M EIAJ",
643 
644 	[0x0f] = "FM radio / IF 10.7 / 50 deemp",
645 	[0x10] = "FM radio / IF 10.7 / 75 deemp",
646 	[0x11] = "FM radio / IF sel / 50 deemp",
647 	[0x12] = "FM radio / IF sel / 75 deemp",
648 
649 	[0x13 ... 0x1e ] = "unknown",
650 	[0x1f] = "??? [in progress]",
651 };
652 
653 #define DSP_RETRY 32
654 #define DSP_DELAY 16
655 #define SAA7135_DSP_RWCLEAR_RERR 1
656 
saa_dsp_reset_error_bit(struct saa7134_dev * dev)657 static inline int saa_dsp_reset_error_bit(struct saa7134_dev *dev)
658 {
659 	int state = saa_readb(SAA7135_DSP_RWSTATE);
660 	if (unlikely(state & SAA7135_DSP_RWSTATE_ERR)) {
661 		d2printk("%s: resetting error bit\n", dev->name);
662 		saa_writeb(SAA7135_DSP_RWCLEAR, SAA7135_DSP_RWCLEAR_RERR);
663 	}
664 	return 0;
665 }
666 
saa_dsp_wait_bit(struct saa7134_dev * dev,int bit)667 static inline int saa_dsp_wait_bit(struct saa7134_dev *dev, int bit)
668 {
669 	int state, count = DSP_RETRY;
670 
671 	state = saa_readb(SAA7135_DSP_RWSTATE);
672 	if (unlikely(state & SAA7135_DSP_RWSTATE_ERR)) {
673 		printk(KERN_WARNING "%s: dsp access error\n", dev->name);
674 		saa_dsp_reset_error_bit(dev);
675 		return -EIO;
676 	}
677 	while (0 == (state & bit)) {
678 		if (unlikely(0 == count)) {
679 			printk("%s: dsp access wait timeout [bit=%s]\n",
680 			       dev->name,
681 			       (bit & SAA7135_DSP_RWSTATE_WRR) ? "WRR" :
682 			       (bit & SAA7135_DSP_RWSTATE_RDB) ? "RDB" :
683 			       (bit & SAA7135_DSP_RWSTATE_IDA) ? "IDA" :
684 			       "???");
685 			return -EIO;
686 		}
687 		saa_wait(DSP_DELAY);
688 		state = saa_readb(SAA7135_DSP_RWSTATE);
689 		count--;
690 	}
691 	return 0;
692 }
693 
694 
saa_dsp_writel(struct saa7134_dev * dev,int reg,u32 value)695 int saa_dsp_writel(struct saa7134_dev *dev, int reg, u32 value)
696 {
697 	int err;
698 
699 	d2printk("dsp write reg 0x%x = 0x%06x\n",reg<<2,value);
700 	err = saa_dsp_wait_bit(dev,SAA7135_DSP_RWSTATE_WRR);
701 	if (err < 0)
702 		return err;
703 	saa_writel(reg,value);
704 	err = saa_dsp_wait_bit(dev,SAA7135_DSP_RWSTATE_WRR);
705 	if (err < 0)
706 		return err;
707 	return 0;
708 }
709 
getstereo_7133(struct saa7134_dev * dev)710 static int getstereo_7133(struct saa7134_dev *dev)
711 {
712 	int retval = V4L2_TUNER_SUB_MONO;
713 	u32 value;
714 
715 	value = saa_readl(0x528 >> 2);
716 	if (value & 0x20)
717 		retval = V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
718 	if (value & 0x40)
719 		retval = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
720 	return retval;
721 }
722 
mute_input_7133(struct saa7134_dev * dev)723 static int mute_input_7133(struct saa7134_dev *dev)
724 {
725 	u32 reg = 0;
726 	u32 xbarin, xbarout;
727 	int mask;
728 	struct saa7134_input *in;
729 
730 	xbarin = 0x03;
731 	switch (dev->input->amux) {
732 	case TV:
733 		reg = 0x02;
734 		xbarin = 0;
735 		break;
736 	case LINE1:
737 		reg = 0x00;
738 		break;
739 	case LINE2:
740 	case LINE2_LEFT:
741 		reg = 0x09;
742 		break;
743 	}
744 	saa_dsp_writel(dev, 0x464 >> 2, xbarin);
745 	if (dev->ctl_mute) {
746 		reg = 0x07;
747 		xbarout = 0xbbbbbb;
748 	} else
749 		xbarout = 0xbbbb10;
750 	saa_dsp_writel(dev, 0x46c >> 2, xbarout);
751 
752 	saa_writel(0x594 >> 2, reg);
753 
754 
755 	/* switch gpio-connected external audio mux */
756 	if (0 != card(dev).gpiomask) {
757 		mask = card(dev).gpiomask;
758 
759 		if (card(dev).mute.name && dev->ctl_mute)
760 			in = &card(dev).mute;
761 		else
762 			in = dev->input;
763 
764 		saa_andorl(SAA7134_GPIO_GPMODE0 >> 2,   mask, mask);
765 		saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, mask, in->gpio);
766 		saa7134_track_gpio(dev,in->name);
767 	}
768 
769 	return 0;
770 }
771 
tvaudio_thread_ddep(void * data)772 static int tvaudio_thread_ddep(void *data)
773 {
774 	struct saa7134_dev *dev = data;
775 	u32 value, norms;
776 
777 	set_freezable();
778 	for (;;) {
779 		tvaudio_sleep(dev,-1);
780 		if (kthread_should_stop())
781 			goto done;
782 	restart:
783 		try_to_freeze();
784 
785 		dev->thread.scan1 = dev->thread.scan2;
786 		dprintk("tvaudio thread scan start [%d]\n",dev->thread.scan1);
787 
788 		if (audio_ddep >= 0x04 && audio_ddep <= 0x0e) {
789 			/* insmod option override */
790 			norms = (audio_ddep << 2) | 0x01;
791 			dprintk("ddep override: %s\n",stdres[audio_ddep]);
792 		} else if (&card(dev).radio == dev->input) {
793 			dprintk("FM Radio\n");
794 			if (dev->tuner_type == TUNER_PHILIPS_TDA8290) {
795 				norms = (0x11 << 2) | 0x01;
796 				saa_dsp_writel(dev, 0x42c >> 2, 0x729555);
797 			} else {
798 				norms = (0x0f << 2) | 0x01;
799 			}
800 		} else {
801 			/* (let chip) scan for sound carrier */
802 			norms = 0;
803 			if (dev->tvnorm->id & (V4L2_STD_B | V4L2_STD_GH))
804 				norms |= 0x04;
805 			if (dev->tvnorm->id & V4L2_STD_PAL_I)
806 				norms |= 0x20;
807 			if (dev->tvnorm->id & V4L2_STD_DK)
808 				norms |= 0x08;
809 			if (dev->tvnorm->id & V4L2_STD_MN)
810 				norms |= 0x40;
811 			if (dev->tvnorm->id & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC))
812 				norms |= 0x10;
813 			if (0 == norms)
814 				norms = 0x7c; /* all */
815 			dprintk("scanning:%s%s%s%s%s\n",
816 				(norms & 0x04) ? " B/G"  : "",
817 				(norms & 0x08) ? " D/K"  : "",
818 				(norms & 0x10) ? " L/L'" : "",
819 				(norms & 0x20) ? " I"    : "",
820 				(norms & 0x40) ? " M"    : "");
821 		}
822 
823 		/* kick automatic standard detection */
824 		saa_dsp_writel(dev, 0x454 >> 2, 0);
825 		saa_dsp_writel(dev, 0x454 >> 2, norms | 0x80);
826 
827 		/* setup crossbars */
828 		saa_dsp_writel(dev, 0x464 >> 2, 0x000000);
829 		saa_dsp_writel(dev, 0x470 >> 2, 0x101010);
830 
831 		if (tvaudio_sleep(dev,3000))
832 			goto restart;
833 		value = saa_readl(0x528 >> 2) & 0xffffff;
834 
835 		dprintk("tvaudio thread status: 0x%x [%s%s%s]\n",
836 			value, stdres[value & 0x1f],
837 			(value & 0x000020) ? ",stereo" : "",
838 			(value & 0x000040) ? ",dual"   : "");
839 		dprintk("detailed status: "
840 			"%s#%s#%s#%s#%s#%s#%s#%s#%s#%s#%s#%s#%s#%s\n",
841 			(value & 0x000080) ? " A2/EIAJ pilot tone "     : "",
842 			(value & 0x000100) ? " A2/EIAJ dual "           : "",
843 			(value & 0x000200) ? " A2/EIAJ stereo "         : "",
844 			(value & 0x000400) ? " A2/EIAJ noise mute "     : "",
845 
846 			(value & 0x000800) ? " BTSC/FM radio pilot "    : "",
847 			(value & 0x001000) ? " SAP carrier "            : "",
848 			(value & 0x002000) ? " BTSC stereo noise mute " : "",
849 			(value & 0x004000) ? " SAP noise mute "         : "",
850 			(value & 0x008000) ? " VDSP "                   : "",
851 
852 			(value & 0x010000) ? " NICST "                  : "",
853 			(value & 0x020000) ? " NICDU "                  : "",
854 			(value & 0x040000) ? " NICAM muted "            : "",
855 			(value & 0x080000) ? " NICAM reserve sound "    : "",
856 
857 			(value & 0x100000) ? " init done "              : "");
858 	}
859 
860  done:
861 	dev->thread.stopped = 1;
862 	return 0;
863 }
864 
865 /* ------------------------------------------------------------------ */
866 /* common stuff + external entry points                               */
867 
saa7134_enable_i2s(struct saa7134_dev * dev)868 void saa7134_enable_i2s(struct saa7134_dev *dev)
869 {
870 	int i2s_format;
871 
872 	if (!card_is_empress(dev))
873 		return;
874 
875 	if (dev->pci->device == PCI_DEVICE_ID_PHILIPS_SAA7130)
876 		return;
877 
878 	/* configure GPIO for out */
879 	saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x0E000000, 0x00000000);
880 
881 	switch (dev->pci->device) {
882 	case PCI_DEVICE_ID_PHILIPS_SAA7133:
883 	case PCI_DEVICE_ID_PHILIPS_SAA7135:
884 	    /* Set I2S format (SONY)  */
885 	    saa_writeb(SAA7133_I2S_AUDIO_CONTROL, 0x00);
886 	    /* Start I2S */
887 	    saa_writeb(SAA7134_I2S_AUDIO_OUTPUT, 0x11);
888 	    break;
889 
890 	case PCI_DEVICE_ID_PHILIPS_SAA7134:
891 	    i2s_format = (dev->input->amux == TV) ? 0x00 : 0x01;
892 
893 	    /* enable I2S audio output for the mpeg encoder */
894 	    saa_writeb(SAA7134_I2S_OUTPUT_SELECT, 0x80);
895 	    saa_writeb(SAA7134_I2S_OUTPUT_FORMAT, i2s_format);
896 	    saa_writeb(SAA7134_I2S_OUTPUT_LEVEL,  0x0F);
897 	    saa_writeb(SAA7134_I2S_AUDIO_OUTPUT,  0x01);
898 
899 	default:
900 	    break;
901 	}
902 }
903 
saa7134_tvaudio_rx2mode(u32 rx)904 int saa7134_tvaudio_rx2mode(u32 rx)
905 {
906 	u32 mode;
907 
908 	mode = V4L2_TUNER_MODE_MONO;
909 	if (rx & V4L2_TUNER_SUB_STEREO)
910 		mode = V4L2_TUNER_MODE_STEREO;
911 	else if (rx & V4L2_TUNER_SUB_LANG1)
912 		mode = V4L2_TUNER_MODE_LANG1;
913 	else if (rx & V4L2_TUNER_SUB_LANG2)
914 		mode = V4L2_TUNER_MODE_LANG2;
915 	return mode;
916 }
917 
saa7134_tvaudio_setmute(struct saa7134_dev * dev)918 void saa7134_tvaudio_setmute(struct saa7134_dev *dev)
919 {
920 	switch (dev->pci->device) {
921 	case PCI_DEVICE_ID_PHILIPS_SAA7130:
922 	case PCI_DEVICE_ID_PHILIPS_SAA7134:
923 		mute_input_7134(dev);
924 		break;
925 	case PCI_DEVICE_ID_PHILIPS_SAA7133:
926 	case PCI_DEVICE_ID_PHILIPS_SAA7135:
927 		mute_input_7133(dev);
928 		break;
929 	}
930 }
931 
saa7134_tvaudio_setinput(struct saa7134_dev * dev,struct saa7134_input * in)932 void saa7134_tvaudio_setinput(struct saa7134_dev *dev,
933 			      struct saa7134_input *in)
934 {
935 	dev->input = in;
936 	switch (dev->pci->device) {
937 	case PCI_DEVICE_ID_PHILIPS_SAA7130:
938 	case PCI_DEVICE_ID_PHILIPS_SAA7134:
939 		mute_input_7134(dev);
940 		break;
941 	case PCI_DEVICE_ID_PHILIPS_SAA7133:
942 	case PCI_DEVICE_ID_PHILIPS_SAA7135:
943 		mute_input_7133(dev);
944 		break;
945 	}
946 	saa7134_enable_i2s(dev);
947 }
948 
saa7134_tvaudio_setvolume(struct saa7134_dev * dev,int level)949 void saa7134_tvaudio_setvolume(struct saa7134_dev *dev, int level)
950 {
951 	switch (dev->pci->device) {
952 	case PCI_DEVICE_ID_PHILIPS_SAA7134:
953 		saa_writeb(SAA7134_CHANNEL1_LEVEL,     level & 0x1f);
954 		saa_writeb(SAA7134_CHANNEL2_LEVEL,     level & 0x1f);
955 		saa_writeb(SAA7134_NICAM_LEVEL_ADJUST, level & 0x1f);
956 		break;
957 	}
958 }
959 
saa7134_tvaudio_getstereo(struct saa7134_dev * dev)960 int saa7134_tvaudio_getstereo(struct saa7134_dev *dev)
961 {
962 	int retval = V4L2_TUNER_SUB_MONO;
963 
964 	switch (dev->pci->device) {
965 	case PCI_DEVICE_ID_PHILIPS_SAA7134:
966 		if (dev->tvaudio)
967 			retval = tvaudio_getstereo(dev,dev->tvaudio);
968 		break;
969 	case PCI_DEVICE_ID_PHILIPS_SAA7133:
970 	case PCI_DEVICE_ID_PHILIPS_SAA7135:
971 		retval = getstereo_7133(dev);
972 		break;
973 	}
974 	return retval;
975 }
976 
saa7134_tvaudio_init(struct saa7134_dev * dev)977 void saa7134_tvaudio_init(struct saa7134_dev *dev)
978 {
979 	int clock = saa7134_boards[dev->board].audio_clock;
980 
981 	if (UNSET != audio_clock_override)
982 		clock = audio_clock_override;
983 
984 	switch (dev->pci->device) {
985 	case PCI_DEVICE_ID_PHILIPS_SAA7134:
986 		/* init all audio registers */
987 		saa_writeb(SAA7134_AUDIO_PLL_CTRL,   0x00);
988 		if (need_resched())
989 			schedule();
990 		else
991 			udelay(10);
992 
993 		saa_writeb(SAA7134_AUDIO_CLOCK0,      clock        & 0xff);
994 		saa_writeb(SAA7134_AUDIO_CLOCK1,     (clock >>  8) & 0xff);
995 		saa_writeb(SAA7134_AUDIO_CLOCK2,     (clock >> 16) & 0xff);
996 		/* frame locked audio is mandatory for NICAM */
997 		saa_writeb(SAA7134_AUDIO_PLL_CTRL,   0x01);
998 		saa_writeb(SAA7134_NICAM_ERROR_LOW,  0x14);
999 		saa_writeb(SAA7134_NICAM_ERROR_HIGH, 0x50);
1000 		break;
1001 	case PCI_DEVICE_ID_PHILIPS_SAA7133:
1002 	case PCI_DEVICE_ID_PHILIPS_SAA7135:
1003 		saa_writel(0x598 >> 2, clock);
1004 		saa_dsp_writel(dev, 0x474 >> 2, 0x00);
1005 		saa_dsp_writel(dev, 0x450 >> 2, 0x00);
1006 	}
1007 }
1008 
saa7134_tvaudio_init2(struct saa7134_dev * dev)1009 int saa7134_tvaudio_init2(struct saa7134_dev *dev)
1010 {
1011 	int (*my_thread)(void *data) = NULL;
1012 
1013 	switch (dev->pci->device) {
1014 	case PCI_DEVICE_ID_PHILIPS_SAA7134:
1015 		my_thread = tvaudio_thread;
1016 		break;
1017 	case PCI_DEVICE_ID_PHILIPS_SAA7133:
1018 	case PCI_DEVICE_ID_PHILIPS_SAA7135:
1019 		my_thread = tvaudio_thread_ddep;
1020 		break;
1021 	}
1022 
1023 	dev->thread.thread = NULL;
1024 	if (my_thread) {
1025 		saa7134_tvaudio_init(dev);
1026 		/* start tvaudio thread */
1027 		dev->thread.thread = kthread_run(my_thread, dev, "%s", dev->name);
1028 		if (IS_ERR(dev->thread.thread)) {
1029 			printk(KERN_WARNING "%s: kernel_thread() failed\n",
1030 			       dev->name);
1031 			/* XXX: missing error handling here */
1032 		}
1033 		saa7134_tvaudio_do_scan(dev);
1034 	}
1035 
1036 	saa7134_enable_i2s(dev);
1037 	return 0;
1038 }
1039 
saa7134_tvaudio_fini(struct saa7134_dev * dev)1040 int saa7134_tvaudio_fini(struct saa7134_dev *dev)
1041 {
1042 	/* shutdown tvaudio thread */
1043 	if (dev->thread.thread && !dev->thread.stopped)
1044 		kthread_stop(dev->thread.thread);
1045 
1046 	saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x07, 0x00); /* LINE1 */
1047 	return 0;
1048 }
1049 
saa7134_tvaudio_do_scan(struct saa7134_dev * dev)1050 int saa7134_tvaudio_do_scan(struct saa7134_dev *dev)
1051 {
1052 	if (dev->input->amux != TV) {
1053 		dprintk("sound IF not in use, skipping scan\n");
1054 		dev->automute = 0;
1055 		saa7134_tvaudio_setmute(dev);
1056 	} else if (dev->thread.thread) {
1057 		dev->thread.mode = UNSET;
1058 		dev->thread.scan2++;
1059 
1060 		if (!dev->insuspend && !dev->thread.stopped)
1061 			wake_up_process(dev->thread.thread);
1062 	} else {
1063 		dev->automute = 0;
1064 		saa7134_tvaudio_setmute(dev);
1065 	}
1066 	return 0;
1067 }
1068 
1069 EXPORT_SYMBOL(saa_dsp_writel);
1070 EXPORT_SYMBOL(saa7134_tvaudio_setmute);
1071 
1072 /* ----------------------------------------------------------- */
1073 /*
1074  * Local variables:
1075  * c-basic-offset: 8
1076  * End:
1077  */
1078