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