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