1/*
2 * av7110_v4l.c: av7110 video4linux interface for DVB and Siemens DVB-C analog module
3 *
4 * Copyright (C) 1999-2002 Ralph  Metzler
5 *                       & Marcus Metzler for convergence integrated media GmbH
6 *
7 * originally based on code by:
8 * Copyright (C) 1998,1999 Christian Theiss <mistert@rz.fh-augsburg.de>
9 *
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
24 *
25 * the project's page is at http://www.linuxtv.org/dvb/
26 */
27
28#include <linux/kernel.h>
29#include <linux/types.h>
30#include <linux/delay.h>
31#include <linux/fs.h>
32#include <linux/timer.h>
33#include <linux/poll.h>
34
35#include "av7110.h"
36#include "av7110_hw.h"
37#include "av7110_av.h"
38
39int msp_writereg(struct av7110 *av7110, u8 dev, u16 reg, u16 val)
40{
41	u8 msg[5] = { dev, reg >> 8, reg & 0xff, val >> 8 , val & 0xff };
42	struct i2c_msg msgs = { .flags = 0, .len = 5, .buf = msg };
43
44	switch (av7110->adac_type) {
45	case DVB_ADAC_MSP34x0:
46		msgs.addr = 0x40;
47		break;
48	case DVB_ADAC_MSP34x5:
49		msgs.addr = 0x42;
50		break;
51	default:
52		return 0;
53	}
54
55	if (i2c_transfer(&av7110->i2c_adap, &msgs, 1) != 1) {
56		dprintk(1, "dvb-ttpci: failed @ card %d, %u = %u\n",
57		       av7110->dvb_adapter.num, reg, val);
58		return -EIO;
59	}
60	return 0;
61}
62
63static int msp_readreg(struct av7110 *av7110, u8 dev, u16 reg, u16 *val)
64{
65	u8 msg1[3] = { dev, reg >> 8, reg & 0xff };
66	u8 msg2[2];
67	struct i2c_msg msgs[2] = {
68		{ .flags = 0	   , .len = 3, .buf = msg1 },
69		{ .flags = I2C_M_RD, .len = 2, .buf = msg2 }
70	};
71
72	switch (av7110->adac_type) {
73	case DVB_ADAC_MSP34x0:
74		msgs[0].addr = 0x40;
75		msgs[1].addr = 0x40;
76		break;
77	case DVB_ADAC_MSP34x5:
78		msgs[0].addr = 0x42;
79		msgs[1].addr = 0x42;
80		break;
81	default:
82		return 0;
83	}
84
85	if (i2c_transfer(&av7110->i2c_adap, &msgs[0], 2) != 2) {
86		dprintk(1, "dvb-ttpci: failed @ card %d, %u\n",
87		       av7110->dvb_adapter.num, reg);
88		return -EIO;
89	}
90	*val = (msg2[0] << 8) | msg2[1];
91	return 0;
92}
93
94static struct v4l2_input inputs[4] = {
95	{
96		.index		= 0,
97		.name		= "DVB",
98		.type		= V4L2_INPUT_TYPE_CAMERA,
99		.audioset	= 1,
100		.tuner		= 0, /* ignored */
101		.std		= V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
102		.status		= 0,
103	}, {
104		.index		= 1,
105		.name		= "Television",
106		.type		= V4L2_INPUT_TYPE_TUNER,
107		.audioset	= 2,
108		.tuner		= 0,
109		.std		= V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
110		.status		= 0,
111	}, {
112		.index		= 2,
113		.name		= "Video",
114		.type		= V4L2_INPUT_TYPE_CAMERA,
115		.audioset	= 0,
116		.tuner		= 0,
117		.std		= V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
118		.status		= 0,
119	}, {
120		.index		= 3,
121		.name		= "Y/C",
122		.type		= V4L2_INPUT_TYPE_CAMERA,
123		.audioset	= 0,
124		.tuner		= 0,
125		.std		= V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
126		.status		= 0,
127	}
128};
129
130static int ves1820_writereg(struct saa7146_dev *dev, u8 addr, u8 reg, u8 data)
131{
132	u8 buf[] = { 0x00, reg, data };
133	struct i2c_msg msg = { .addr = addr, .flags = 0, .buf = buf, .len = 3 };
134
135	dprintk(4, "dev: %p\n", dev);
136
137	if (1 != saa7146_i2c_transfer(dev, &msg, 1, 1))
138		return -1;
139	return 0;
140}
141
142static int tuner_write(struct saa7146_dev *dev, u8 addr, u8 data [4])
143{
144	struct i2c_msg msg = { .addr = addr, .flags = 0, .buf = data, .len = 4 };
145
146	dprintk(4, "dev: %p\n", dev);
147
148	if (1 != saa7146_i2c_transfer(dev, &msg, 1, 1))
149		return -1;
150	return 0;
151}
152
153static int ves1820_set_tv_freq(struct saa7146_dev *dev, u32 freq)
154{
155	u32 div;
156	u8 config;
157	u8 buf[4];
158
159	dprintk(4, "freq: 0x%08x\n", freq);
160
161	/* magic number: 614. tuning with the frequency given by v4l2
162	   is always off by 614*62.5 = 38375 kHz...*/
163	div = freq + 614;
164
165	buf[0] = (div >> 8) & 0x7f;
166	buf[1] = div & 0xff;
167	buf[2] = 0x8e;
168
169	if (freq < (u32) (16 * 168.25))
170		config = 0xa0;
171	else if (freq < (u32) (16 * 447.25))
172		config = 0x90;
173	else
174		config = 0x30;
175	config &= ~0x02;
176
177	buf[3] = config;
178
179	return tuner_write(dev, 0x61, buf);
180}
181
182static int stv0297_set_tv_freq(struct saa7146_dev *dev, u32 freq)
183{
184	struct av7110 *av7110 = (struct av7110*)dev->ext_priv;
185	u32 div;
186	u8 data[4];
187
188	div = (freq + 38900000 + 31250) / 62500;
189
190	data[0] = (div >> 8) & 0x7f;
191	data[1] = div & 0xff;
192	data[2] = 0xce;
193
194	if (freq < 45000000)
195		return -EINVAL;
196	else if (freq < 137000000)
197		data[3] = 0x01;
198	else if (freq < 403000000)
199		data[3] = 0x02;
200	else if (freq < 860000000)
201		data[3] = 0x04;
202	else
203		return -EINVAL;
204
205	if (av7110->fe->ops.i2c_gate_ctrl)
206		av7110->fe->ops.i2c_gate_ctrl(av7110->fe, 1);
207	return tuner_write(dev, 0x63, data);
208}
209
210
211
212static struct saa7146_standard analog_standard[];
213static struct saa7146_standard dvb_standard[];
214static struct saa7146_standard standard[];
215
216static struct v4l2_audio msp3400_v4l2_audio = {
217	.index = 0,
218	.name = "Television",
219	.capability = V4L2_AUDCAP_STEREO
220};
221
222static int av7110_dvb_c_switch(struct saa7146_fh *fh)
223{
224	struct saa7146_dev *dev = fh->dev;
225	struct saa7146_vv *vv = dev->vv_data;
226	struct av7110 *av7110 = (struct av7110*)dev->ext_priv;
227	u16 adswitch;
228	int source, sync, err;
229
230	dprintk(4, "%p\n", av7110);
231
232	if ((vv->video_status & STATUS_OVERLAY) != 0) {
233		vv->ov_suspend = vv->video_fh;
234		err = saa7146_stop_preview(vv->video_fh); /* side effect: video_status is now 0, video_fh is NULL */
235		if (err != 0) {
236			dprintk(2, "suspending video failed\n");
237			vv->ov_suspend = NULL;
238		}
239	}
240
241	if (0 != av7110->current_input) {
242		dprintk(1, "switching to analog TV:\n");
243		adswitch = 1;
244		source = SAA7146_HPS_SOURCE_PORT_B;
245		sync = SAA7146_HPS_SYNC_PORT_B;
246		memcpy(standard, analog_standard, sizeof(struct saa7146_standard) * 2);
247
248		switch (av7110->current_input) {
249		case 1:
250			dprintk(1, "switching SAA7113 to Analog Tuner Input.\n");
251			msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0000); // loudspeaker source
252			msp_writereg(av7110, MSP_WR_DSP, 0x0009, 0x0000); // headphone source
253			msp_writereg(av7110, MSP_WR_DSP, 0x000a, 0x0000); // SCART 1 source
254			msp_writereg(av7110, MSP_WR_DSP, 0x000e, 0x3000); // FM matrix, mono
255			msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x4f00); // loudspeaker + headphone
256			msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x4f00); // SCART 1 volume
257
258			if (av7110->analog_tuner_flags & ANALOG_TUNER_VES1820) {
259				if (ves1820_writereg(dev, 0x09, 0x0f, 0x60))
260					dprintk(1, "setting band in demodulator failed.\n");
261			} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
262				saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // TDA9819 pin9(STD)
263				saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); // TDA9819 pin30(VIF)
264			}
265			if (i2c_writereg(av7110, 0x48, 0x02, 0xd0) != 1)
266				dprintk(1, "saa7113 write failed @ card %d", av7110->dvb_adapter.num);
267			break;
268		case 2:
269			dprintk(1, "switching SAA7113 to Video AV CVBS Input.\n");
270			if (i2c_writereg(av7110, 0x48, 0x02, 0xd2) != 1)
271				dprintk(1, "saa7113 write failed @ card %d", av7110->dvb_adapter.num);
272			break;
273		case 3:
274			dprintk(1, "switching SAA7113 to Video AV Y/C Input.\n");
275			if (i2c_writereg(av7110, 0x48, 0x02, 0xd9) != 1)
276				dprintk(1, "saa7113 write failed @ card %d", av7110->dvb_adapter.num);
277			break;
278		default:
279			dprintk(1, "switching SAA7113 to Input: AV7110: SAA7113: invalid input.\n");
280		}
281	} else {
282		adswitch = 0;
283		source = SAA7146_HPS_SOURCE_PORT_A;
284		sync = SAA7146_HPS_SYNC_PORT_A;
285		memcpy(standard, dvb_standard, sizeof(struct saa7146_standard) * 2);
286		dprintk(1, "switching DVB mode\n");
287		msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0220); // loudspeaker source
288		msp_writereg(av7110, MSP_WR_DSP, 0x0009, 0x0220); // headphone source
289		msp_writereg(av7110, MSP_WR_DSP, 0x000a, 0x0220); // SCART 1 source
290		msp_writereg(av7110, MSP_WR_DSP, 0x000e, 0x3000); // FM matrix, mono
291		msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x7f00); // loudspeaker + headphone
292		msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x7f00); // SCART 1 volume
293
294		if (av7110->analog_tuner_flags & ANALOG_TUNER_VES1820) {
295			if (ves1820_writereg(dev, 0x09, 0x0f, 0x20))
296				dprintk(1, "setting band in demodulator failed.\n");
297		} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
298			saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD)
299			saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF)
300		}
301	}
302
303	/* hmm, this does not do anything!? */
304	if (av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, adswitch))
305		dprintk(1, "ADSwitch error\n");
306
307	saa7146_set_hps_source_and_sync(dev, source, sync);
308
309	if (vv->ov_suspend != NULL) {
310		saa7146_start_preview(vv->ov_suspend);
311		vv->ov_suspend = NULL;
312	}
313
314	return 0;
315}
316
317static int av7110_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg)
318{
319	struct saa7146_dev *dev = fh->dev;
320	struct av7110 *av7110 = (struct av7110*) dev->ext_priv;
321	dprintk(4, "saa7146_dev: %p\n", dev);
322
323	switch (cmd) {
324	case VIDIOC_G_TUNER:
325	{
326		struct v4l2_tuner *t = arg;
327		u16 stereo_det;
328		s8 stereo;
329
330		dprintk(2, "VIDIOC_G_TUNER: %d\n", t->index);
331
332		if (!av7110->analog_tuner_flags || t->index != 0)
333			return -EINVAL;
334
335		memset(t, 0, sizeof(*t));
336		strcpy(t->name, "Television");
337
338		t->type = V4L2_TUNER_ANALOG_TV;
339		t->capability = V4L2_TUNER_CAP_NORM | V4L2_TUNER_CAP_STEREO |
340			V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2 | V4L2_TUNER_CAP_SAP;
341		t->rangelow = 772;	/* 48.25 MHZ / 62.5 kHz = 772, see fi1216mk2-specs, page 2 */
342		t->rangehigh = 13684;	/* 855.25 MHz / 62.5 kHz = 13684 */
343		t->signal = 0xffff;
344		t->afc = 0;
345
346		msp_readreg(av7110, MSP_RD_DEM, 0x007e, &stereo_det);
347		dprintk(1, "VIDIOC_G_TUNER: msp3400 TV standard detection: 0x%04x\n", stereo_det);
348		msp_readreg(av7110, MSP_RD_DSP, 0x0018, &stereo_det);
349		dprintk(1, "VIDIOC_G_TUNER: msp3400 stereo detection: 0x%04x\n", stereo_det);
350		stereo = (s8)(stereo_det >> 8);
351		if (stereo > 0x10) {
352			/* stereo */
353			t->rxsubchans = V4L2_TUNER_SUB_STEREO | V4L2_TUNER_SUB_MONO;
354			t->audmode = V4L2_TUNER_MODE_STEREO;
355		}
356		else if (stereo < -0x10) {
357			/* bilingual */
358			t->rxsubchans = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
359			t->audmode = V4L2_TUNER_MODE_LANG1;
360		}
361		else /* mono */
362			t->rxsubchans = V4L2_TUNER_SUB_MONO;
363
364		return 0;
365	}
366	case VIDIOC_S_TUNER:
367	{
368		struct v4l2_tuner *t = arg;
369		u16 fm_matrix, src;
370		dprintk(2, "VIDIOC_S_TUNER: %d\n", t->index);
371
372		if (!av7110->analog_tuner_flags || av7110->current_input != 1)
373			return -EINVAL;
374
375		switch (t->audmode) {
376		case V4L2_TUNER_MODE_STEREO:
377			dprintk(2, "VIDIOC_S_TUNER: V4L2_TUNER_MODE_STEREO\n");
378			fm_matrix = 0x3001; // stereo
379			src = 0x0020;
380			break;
381		case V4L2_TUNER_MODE_LANG1_LANG2:
382			dprintk(2, "VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG1_LANG2\n");
383			fm_matrix = 0x3000; // bilingual
384			src = 0x0020;
385			break;
386		case V4L2_TUNER_MODE_LANG1:
387			dprintk(2, "VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG1\n");
388			fm_matrix = 0x3000; // mono
389			src = 0x0000;
390			break;
391		case V4L2_TUNER_MODE_LANG2:
392			dprintk(2, "VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG2\n");
393			fm_matrix = 0x3000; // mono
394			src = 0x0010;
395			break;
396		default: /* case V4L2_TUNER_MODE_MONO: */
397			dprintk(2, "VIDIOC_S_TUNER: TDA9840_SET_MONO\n");
398			fm_matrix = 0x3000; // mono
399			src = 0x0030;
400			break;
401		}
402		msp_writereg(av7110, MSP_WR_DSP, 0x000e, fm_matrix);
403		msp_writereg(av7110, MSP_WR_DSP, 0x0008, src);
404		msp_writereg(av7110, MSP_WR_DSP, 0x0009, src);
405		msp_writereg(av7110, MSP_WR_DSP, 0x000a, src);
406		return 0;
407	}
408	case VIDIOC_G_FREQUENCY:
409	{
410		struct v4l2_frequency *f = arg;
411
412		dprintk(2, "VIDIOC_G_FREQ: freq:0x%08x.\n", f->frequency);
413
414		if (!av7110->analog_tuner_flags || av7110->current_input != 1)
415			return -EINVAL;
416
417		memset(f, 0, sizeof(*f));
418		f->type = V4L2_TUNER_ANALOG_TV;
419		f->frequency =	av7110->current_freq;
420		return 0;
421	}
422	case VIDIOC_S_FREQUENCY:
423	{
424		struct v4l2_frequency *f = arg;
425
426		dprintk(2, "VIDIOC_S_FREQUENCY: freq:0x%08x.\n", f->frequency);
427
428		if (!av7110->analog_tuner_flags || av7110->current_input != 1)
429			return -EINVAL;
430
431		if (V4L2_TUNER_ANALOG_TV != f->type)
432			return -EINVAL;
433
434		msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0xffe0); // fast mute
435		msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0xffe0);
436
437		/* tune in desired frequency */
438		if (av7110->analog_tuner_flags & ANALOG_TUNER_VES1820) {
439			ves1820_set_tv_freq(dev, f->frequency);
440		} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
441			stv0297_set_tv_freq(dev, f->frequency);
442		}
443		av7110->current_freq = f->frequency;
444
445		msp_writereg(av7110, MSP_WR_DSP, 0x0015, 0x003f); // start stereo detection
446		msp_writereg(av7110, MSP_WR_DSP, 0x0015, 0x0000);
447		msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x4f00); // loudspeaker + headphone
448		msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x4f00); // SCART 1 volume
449		return 0;
450	}
451	case VIDIOC_ENUMINPUT:
452	{
453		struct v4l2_input *i = arg;
454
455		dprintk(2, "VIDIOC_ENUMINPUT: %d\n", i->index);
456
457		if (av7110->analog_tuner_flags) {
458			if (i->index < 0 || i->index >= 4)
459				return -EINVAL;
460		} else {
461			if (i->index != 0)
462				return -EINVAL;
463		}
464
465		memcpy(i, &inputs[i->index], sizeof(struct v4l2_input));
466
467		return 0;
468	}
469	case VIDIOC_G_INPUT:
470	{
471		int *input = (int *)arg;
472		*input = av7110->current_input;
473		dprintk(2, "VIDIOC_G_INPUT: %d\n", *input);
474		return 0;
475	}
476	case VIDIOC_S_INPUT:
477	{
478		int input = *(int *)arg;
479
480		dprintk(2, "VIDIOC_S_INPUT: %d\n", input);
481
482		if (!av7110->analog_tuner_flags)
483			return 0;
484
485		if (input < 0 || input >= 4)
486			return -EINVAL;
487
488		av7110->current_input = input;
489		return av7110_dvb_c_switch(fh);
490	}
491	case VIDIOC_G_AUDIO:
492	{
493		struct v4l2_audio *a = arg;
494
495		dprintk(2, "VIDIOC_G_AUDIO: %d\n", a->index);
496		if (a->index != 0)
497			return -EINVAL;
498		memcpy(a, &msp3400_v4l2_audio, sizeof(struct v4l2_audio));
499		break;
500	}
501	case VIDIOC_S_AUDIO:
502	{
503		struct v4l2_audio *a = arg;
504		dprintk(2, "VIDIOC_S_AUDIO: %d\n", a->index);
505		break;
506	}
507	case VIDIOC_G_SLICED_VBI_CAP:
508	{
509		struct v4l2_sliced_vbi_cap *cap = arg;
510		dprintk(2, "VIDIOC_G_SLICED_VBI_CAP\n");
511		memset(cap, 0, sizeof *cap);
512		if (FW_VERSION(av7110->arm_app) >= 0x2623) {
513			cap->service_set = V4L2_SLICED_WSS_625;
514			cap->service_lines[0][23] = V4L2_SLICED_WSS_625;
515		}
516		break;
517	}
518	case VIDIOC_G_FMT:
519	{
520		struct v4l2_format *f = arg;
521		dprintk(2, "VIDIOC_G_FMT:\n");
522		if (f->type != V4L2_BUF_TYPE_SLICED_VBI_OUTPUT ||
523		    FW_VERSION(av7110->arm_app) < 0x2623)
524			return -EAGAIN; /* handled by core driver */
525		memset(&f->fmt.sliced, 0, sizeof f->fmt.sliced);
526		if (av7110->wssMode) {
527			f->fmt.sliced.service_set = V4L2_SLICED_WSS_625;
528			f->fmt.sliced.service_lines[0][23] = V4L2_SLICED_WSS_625;
529			f->fmt.sliced.io_size = sizeof (struct v4l2_sliced_vbi_data);
530		}
531		break;
532	}
533	case VIDIOC_S_FMT:
534	{
535		struct v4l2_format *f = arg;
536		dprintk(2, "VIDIOC_S_FMT\n");
537		if (f->type != V4L2_BUF_TYPE_SLICED_VBI_OUTPUT ||
538		    FW_VERSION(av7110->arm_app) < 0x2623)
539			return -EAGAIN; /* handled by core driver */
540		if (f->fmt.sliced.service_set != V4L2_SLICED_WSS_625 &&
541		    f->fmt.sliced.service_lines[0][23] != V4L2_SLICED_WSS_625) {
542			memset(&f->fmt.sliced, 0, sizeof f->fmt.sliced);
543			/* WSS controlled by firmware */
544			av7110->wssMode = 0;
545			av7110->wssData = 0;
546			return av7110_fw_cmd(av7110, COMTYPE_ENCODER,
547					     SetWSSConfig, 1, 0);
548		} else {
549			memset(&f->fmt.sliced, 0, sizeof f->fmt.sliced);
550			f->fmt.sliced.service_set = V4L2_SLICED_WSS_625;
551			f->fmt.sliced.service_lines[0][23] = V4L2_SLICED_WSS_625;
552			f->fmt.sliced.io_size = sizeof (struct v4l2_sliced_vbi_data);
553			/* WSS controlled by userspace */
554			av7110->wssMode = 1;
555			av7110->wssData = 0;
556		}
557		break;
558	}
559	default:
560		printk("no such ioctl\n");
561		return -ENOIOCTLCMD;
562	}
563	return 0;
564}
565
566static int av7110_vbi_reset(struct inode *inode, struct file *file)
567{
568	struct saa7146_fh *fh = file->private_data;
569	struct saa7146_dev *dev = fh->dev;
570	struct av7110 *av7110 = (struct av7110*) dev->ext_priv;
571
572	dprintk(2, "%s\n", __FUNCTION__);
573	av7110->wssMode = 0;
574	av7110->wssData = 0;
575	if (FW_VERSION(av7110->arm_app) < 0x2623)
576		return 0;
577	else
578		return av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetWSSConfig, 1, 0);
579}
580
581static ssize_t av7110_vbi_write(struct file *file, const char __user *data, size_t count, loff_t *ppos)
582{
583	struct saa7146_fh *fh = file->private_data;
584	struct saa7146_dev *dev = fh->dev;
585	struct av7110 *av7110 = (struct av7110*) dev->ext_priv;
586	struct v4l2_sliced_vbi_data d;
587	int rc;
588
589	dprintk(2, "%s\n", __FUNCTION__);
590	if (FW_VERSION(av7110->arm_app) < 0x2623 || !av7110->wssMode || count != sizeof d)
591		return -EINVAL;
592	if (copy_from_user(&d, data, count))
593		return -EFAULT;
594	if ((d.id != 0 && d.id != V4L2_SLICED_WSS_625) || d.field != 0 || d.line != 23)
595		return -EINVAL;
596	if (d.id)
597		av7110->wssData = ((d.data[1] << 8) & 0x3f00) | d.data[0];
598	else
599		av7110->wssData = 0x8000;
600	rc = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetWSSConfig, 2, 1, av7110->wssData);
601	return (rc < 0) ? rc : count;
602}
603
604/****************************************************************************
605 * INITIALIZATION
606 ****************************************************************************/
607
608static struct saa7146_extension_ioctls ioctls[] = {
609	{ VIDIOC_ENUMINPUT,	SAA7146_EXCLUSIVE },
610	{ VIDIOC_G_INPUT,	SAA7146_EXCLUSIVE },
611	{ VIDIOC_S_INPUT,	SAA7146_EXCLUSIVE },
612	{ VIDIOC_G_FREQUENCY,	SAA7146_EXCLUSIVE },
613	{ VIDIOC_S_FREQUENCY,	SAA7146_EXCLUSIVE },
614	{ VIDIOC_G_TUNER,	SAA7146_EXCLUSIVE },
615	{ VIDIOC_S_TUNER,	SAA7146_EXCLUSIVE },
616	{ VIDIOC_G_AUDIO,	SAA7146_EXCLUSIVE },
617	{ VIDIOC_S_AUDIO,	SAA7146_EXCLUSIVE },
618	{ VIDIOC_G_SLICED_VBI_CAP, SAA7146_EXCLUSIVE },
619	{ VIDIOC_G_FMT,		SAA7146_BEFORE },
620	{ VIDIOC_S_FMT,		SAA7146_BEFORE },
621	{ 0, 0 }
622};
623
624static u8 saa7113_init_regs[] = {
625	0x02, 0xd0,
626	0x03, 0x23,
627	0x04, 0x00,
628	0x05, 0x00,
629	0x06, 0xe9,
630	0x07, 0x0d,
631	0x08, 0x98,
632	0x09, 0x02,
633	0x0a, 0x80,
634	0x0b, 0x40,
635	0x0c, 0x40,
636	0x0d, 0x00,
637	0x0e, 0x01,
638	0x0f, 0x7c,
639	0x10, 0x48,
640	0x11, 0x0c,
641	0x12, 0x8b,
642	0x13, 0x1a,
643	0x14, 0x00,
644	0x15, 0x00,
645	0x16, 0x00,
646	0x17, 0x00,
647	0x18, 0x00,
648	0x19, 0x00,
649	0x1a, 0x00,
650	0x1b, 0x00,
651	0x1c, 0x00,
652	0x1d, 0x00,
653	0x1e, 0x00,
654
655	0x41, 0x77,
656	0x42, 0x77,
657	0x43, 0x77,
658	0x44, 0x77,
659	0x45, 0x77,
660	0x46, 0x77,
661	0x47, 0x77,
662	0x48, 0x77,
663	0x49, 0x77,
664	0x4a, 0x77,
665	0x4b, 0x77,
666	0x4c, 0x77,
667	0x4d, 0x77,
668	0x4e, 0x77,
669	0x4f, 0x77,
670	0x50, 0x77,
671	0x51, 0x77,
672	0x52, 0x77,
673	0x53, 0x77,
674	0x54, 0x77,
675	0x55, 0x77,
676	0x56, 0x77,
677	0x57, 0xff,
678
679	0xff
680};
681
682
683static struct saa7146_ext_vv av7110_vv_data_st;
684static struct saa7146_ext_vv av7110_vv_data_c;
685
686int av7110_init_analog_module(struct av7110 *av7110)
687{
688	u16 version1, version2;
689
690	if (i2c_writereg(av7110, 0x80, 0x0, 0x80) == 1 &&
691	    i2c_writereg(av7110, 0x80, 0x0, 0) == 1) {
692		printk("dvb-ttpci: DVB-C analog module @ card %d detected, initializing MSP3400\n",
693			av7110->dvb_adapter.num);
694		av7110->adac_type = DVB_ADAC_MSP34x0;
695	} else if (i2c_writereg(av7110, 0x84, 0x0, 0x80) == 1 &&
696		   i2c_writereg(av7110, 0x84, 0x0, 0) == 1) {
697		printk("dvb-ttpci: DVB-C analog module @ card %d detected, initializing MSP3415\n",
698			av7110->dvb_adapter.num);
699		av7110->adac_type = DVB_ADAC_MSP34x5;
700	} else
701		return -ENODEV;
702
703	msleep(100); // the probing above resets the msp...
704	msp_readreg(av7110, MSP_RD_DSP, 0x001e, &version1);
705	msp_readreg(av7110, MSP_RD_DSP, 0x001f, &version2);
706	dprintk(1, "dvb-ttpci: @ card %d MSP34xx version 0x%04x 0x%04x\n",
707		av7110->dvb_adapter.num, version1, version2);
708	msp_writereg(av7110, MSP_WR_DSP, 0x0013, 0x0c00);
709	msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x7f00); // loudspeaker + headphone
710	msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0220); // loudspeaker source
711	msp_writereg(av7110, MSP_WR_DSP, 0x0009, 0x0220); // headphone source
712	msp_writereg(av7110, MSP_WR_DSP, 0x0004, 0x7f00); // loudspeaker volume
713	msp_writereg(av7110, MSP_WR_DSP, 0x000a, 0x0220); // SCART 1 source
714	msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x7f00); // SCART 1 volume
715	msp_writereg(av7110, MSP_WR_DSP, 0x000d, 0x1900); // prescale SCART
716
717	if (i2c_writereg(av7110, 0x48, 0x01, 0x00)!=1) {
718		INFO(("saa7113 not accessible.\n"));
719	} else {
720		u8 *i = saa7113_init_regs;
721
722		if ((av7110->dev->pci->subsystem_vendor == 0x110a) && (av7110->dev->pci->subsystem_device == 0x0000)) {
723			/* Fujitsu/Siemens DVB-Cable */
724			av7110->analog_tuner_flags |= ANALOG_TUNER_VES1820;
725		} else if ((av7110->dev->pci->subsystem_vendor == 0x13c2) && (av7110->dev->pci->subsystem_device == 0x0002)) {
726			/* Hauppauge/TT DVB-C premium */
727			av7110->analog_tuner_flags |= ANALOG_TUNER_VES1820;
728		} else if ((av7110->dev->pci->subsystem_vendor == 0x13c2) && (av7110->dev->pci->subsystem_device == 0x000A)) {
729			/* Hauppauge/TT DVB-C premium */
730			av7110->analog_tuner_flags |= ANALOG_TUNER_STV0297;
731		}
732
733		/* setup for DVB by default */
734		if (av7110->analog_tuner_flags & ANALOG_TUNER_VES1820) {
735			if (ves1820_writereg(av7110->dev, 0x09, 0x0f, 0x20))
736				dprintk(1, "setting band in demodulator failed.\n");
737		} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
738			saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD)
739			saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF)
740		}
741
742		/* init the saa7113 */
743		while (*i != 0xff) {
744			if (i2c_writereg(av7110, 0x48, i[0], i[1]) != 1) {
745				dprintk(1, "saa7113 initialization failed @ card %d", av7110->dvb_adapter.num);
746				break;
747			}
748			i += 2;
749		}
750		/* setup msp for analog sound: B/G Dual-FM */
751		msp_writereg(av7110, MSP_WR_DEM, 0x00bb, 0x02d0); // AD_CV
752		msp_writereg(av7110, MSP_WR_DEM, 0x0001,  3); // FIR1
753		msp_writereg(av7110, MSP_WR_DEM, 0x0001, 18); // FIR1
754		msp_writereg(av7110, MSP_WR_DEM, 0x0001, 27); // FIR1
755		msp_writereg(av7110, MSP_WR_DEM, 0x0001, 48); // FIR1
756		msp_writereg(av7110, MSP_WR_DEM, 0x0001, 66); // FIR1
757		msp_writereg(av7110, MSP_WR_DEM, 0x0001, 72); // FIR1
758		msp_writereg(av7110, MSP_WR_DEM, 0x0005,  4); // FIR2
759		msp_writereg(av7110, MSP_WR_DEM, 0x0005, 64); // FIR2
760		msp_writereg(av7110, MSP_WR_DEM, 0x0005,  0); // FIR2
761		msp_writereg(av7110, MSP_WR_DEM, 0x0005,  3); // FIR2
762		msp_writereg(av7110, MSP_WR_DEM, 0x0005, 18); // FIR2
763		msp_writereg(av7110, MSP_WR_DEM, 0x0005, 27); // FIR2
764		msp_writereg(av7110, MSP_WR_DEM, 0x0005, 48); // FIR2
765		msp_writereg(av7110, MSP_WR_DEM, 0x0005, 66); // FIR2
766		msp_writereg(av7110, MSP_WR_DEM, 0x0005, 72); // FIR2
767		msp_writereg(av7110, MSP_WR_DEM, 0x0083, 0xa000); // MODE_REG
768		msp_writereg(av7110, MSP_WR_DEM, 0x0093, 0x00aa); // DCO1_LO 5.74MHz
769		msp_writereg(av7110, MSP_WR_DEM, 0x009b, 0x04fc); // DCO1_HI
770		msp_writereg(av7110, MSP_WR_DEM, 0x00a3, 0x038e); // DCO2_LO 5.5MHz
771		msp_writereg(av7110, MSP_WR_DEM, 0x00ab, 0x04c6); // DCO2_HI
772		msp_writereg(av7110, MSP_WR_DEM, 0x0056, 0); // LOAD_REG 1/2
773	}
774
775	memcpy(standard, dvb_standard, sizeof(struct saa7146_standard) * 2);
776	/* set dd1 stream a & b */
777	saa7146_write(av7110->dev, DD1_STREAM_B, 0x00000000);
778	saa7146_write(av7110->dev, DD1_INIT, 0x03000700);
779	saa7146_write(av7110->dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
780
781	return 0;
782}
783
784int av7110_init_v4l(struct av7110 *av7110)
785{
786	struct saa7146_dev* dev = av7110->dev;
787	int ret;
788
789	/* special case DVB-C: these cards have an analog tuner
790	   plus need some special handling, so we have separate
791	   saa7146_ext_vv data for these... */
792	if (av7110->analog_tuner_flags)
793		ret = saa7146_vv_init(dev, &av7110_vv_data_c);
794	else
795		ret = saa7146_vv_init(dev, &av7110_vv_data_st);
796
797	if (ret) {
798		ERR(("cannot init capture device. skipping.\n"));
799		return -ENODEV;
800	}
801
802	if (saa7146_register_device(&av7110->v4l_dev, dev, "av7110", VFL_TYPE_GRABBER)) {
803		ERR(("cannot register capture device. skipping.\n"));
804		saa7146_vv_release(dev);
805		return -ENODEV;
806	}
807	if (saa7146_register_device(&av7110->vbi_dev, dev, "av7110", VFL_TYPE_VBI))
808		ERR(("cannot register vbi v4l2 device. skipping.\n"));
809	return 0;
810}
811
812int av7110_exit_v4l(struct av7110 *av7110)
813{
814	struct saa7146_dev* dev = av7110->dev;
815
816	saa7146_unregister_device(&av7110->v4l_dev, av7110->dev);
817	saa7146_unregister_device(&av7110->vbi_dev, av7110->dev);
818
819	saa7146_vv_release(dev);
820
821	return 0;
822}
823
824
825
826static struct saa7146_standard standard[] = {
827	{
828		.name	= "PAL",	.id		= V4L2_STD_PAL_BG,
829		.v_offset	= 0x15,	.v_field	= 288,
830		.h_offset	= 0x48,	.h_pixels	= 708,
831		.v_max_out	= 576,	.h_max_out	= 768,
832	}, {
833		.name	= "NTSC",	.id		= V4L2_STD_NTSC,
834		.v_offset	= 0x10,	.v_field	= 244,
835		.h_offset	= 0x40,	.h_pixels	= 708,
836		.v_max_out	= 480,	.h_max_out	= 640,
837	}
838};
839
840static struct saa7146_standard analog_standard[] = {
841	{
842		.name	= "PAL",	.id		= V4L2_STD_PAL_BG,
843		.v_offset	= 0x1b,	.v_field	= 288,
844		.h_offset	= 0x08,	.h_pixels	= 708,
845		.v_max_out	= 576,	.h_max_out	= 768,
846	}, {
847		.name	= "NTSC",	.id		= V4L2_STD_NTSC,
848		.v_offset	= 0x10,	.v_field	= 244,
849		.h_offset	= 0x40,	.h_pixels	= 708,
850		.v_max_out	= 480,	.h_max_out	= 640,
851	}
852};
853
854static struct saa7146_standard dvb_standard[] = {
855	{
856		.name	= "PAL",	.id		= V4L2_STD_PAL_BG,
857		.v_offset	= 0x14,	.v_field	= 288,
858		.h_offset	= 0x48,	.h_pixels	= 708,
859		.v_max_out	= 576,	.h_max_out	= 768,
860	}, {
861		.name	= "NTSC",	.id		= V4L2_STD_NTSC,
862		.v_offset	= 0x10,	.v_field	= 244,
863		.h_offset	= 0x40,	.h_pixels	= 708,
864		.v_max_out	= 480,	.h_max_out	= 640,
865	}
866};
867
868static int std_callback(struct saa7146_dev* dev, struct saa7146_standard *std)
869{
870	struct av7110 *av7110 = (struct av7110*) dev->ext_priv;
871
872	if (std->id & V4L2_STD_PAL) {
873		av7110->vidmode = VIDEO_MODE_PAL;
874		av7110_set_vidmode(av7110, av7110->vidmode);
875	}
876	else if (std->id & V4L2_STD_NTSC) {
877		av7110->vidmode = VIDEO_MODE_NTSC;
878		av7110_set_vidmode(av7110, av7110->vidmode);
879	}
880	else
881		return -1;
882
883	return 0;
884}
885
886
887static struct saa7146_ext_vv av7110_vv_data_st = {
888	.inputs		= 1,
889	.audios		= 1,
890	.capabilities	= V4L2_CAP_SLICED_VBI_OUTPUT,
891	.flags		= 0,
892
893	.stds		= &standard[0],
894	.num_stds	= ARRAY_SIZE(standard),
895	.std_callback	= &std_callback,
896
897	.ioctls		= &ioctls[0],
898	.ioctl		= av7110_ioctl,
899
900	.vbi_fops.open	= av7110_vbi_reset,
901	.vbi_fops.release = av7110_vbi_reset,
902	.vbi_fops.write	= av7110_vbi_write,
903};
904
905static struct saa7146_ext_vv av7110_vv_data_c = {
906	.inputs		= 1,
907	.audios		= 1,
908	.capabilities	= V4L2_CAP_TUNER | V4L2_CAP_SLICED_VBI_OUTPUT,
909	.flags		= SAA7146_USE_PORT_B_FOR_VBI,
910
911	.stds		= &standard[0],
912	.num_stds	= ARRAY_SIZE(standard),
913	.std_callback	= &std_callback,
914
915	.ioctls		= &ioctls[0],
916	.ioctl		= av7110_ioctl,
917
918	.vbi_fops.open	= av7110_vbi_reset,
919	.vbi_fops.release = av7110_vbi_reset,
920	.vbi_fops.write	= av7110_vbi_write,
921};
922