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