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