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