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