linux/drivers/media/pci/ttpci/av7110.c
<<
>>
Prefs
   1/*
   2 * driver for the SAA7146 based AV110 cards (like the Fujitsu-Siemens DVB)
   3 * av7110.c: initialization and demux stuff
   4 *
   5 * Copyright (C) 1999-2002 Ralph  Metzler
   6 *                       & Marcus Metzler for convergence integrated media GmbH
   7 *
   8 * originally based on code by:
   9 * Copyright (C) 1998,1999 Christian Theiss <mistert@rz.fh-augsburg.de>
  10 *
  11 * This program is free software; you can redistribute it and/or
  12 * modify it under the terms of the GNU General Public License
  13 * as published by the Free Software Foundation; either version 2
  14 * of the License, or (at your option) any later version.
  15 *
  16 *
  17 * This program is distributed in the hope that it will be useful,
  18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20 * GNU General Public License for more details.
  21 *
  22 *
  23 * You should have received a copy of the GNU General Public License
  24 * along with this program; if not, write to the Free Software
  25 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  26 * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
  27 *
  28 *
  29 * the project's page is at https://linuxtv.org
  30 */
  31
  32
  33#include <linux/module.h>
  34#include <linux/kmod.h>
  35#include <linux/delay.h>
  36#include <linux/fs.h>
  37#include <linux/timer.h>
  38#include <linux/poll.h>
  39
  40#include <linux/kernel.h>
  41#include <linux/sched.h>
  42#include <linux/types.h>
  43#include <linux/fcntl.h>
  44#include <linux/interrupt.h>
  45#include <linux/string.h>
  46#include <linux/pci.h>
  47#include <linux/vmalloc.h>
  48#include <linux/firmware.h>
  49#include <linux/crc32.h>
  50#include <linux/i2c.h>
  51#include <linux/kthread.h>
  52#include <linux/slab.h>
  53#include <asm/unaligned.h>
  54#include <asm/byteorder.h>
  55
  56
  57#include <linux/dvb/frontend.h>
  58
  59#include "dvb_frontend.h"
  60
  61#include "ttpci-eeprom.h"
  62#include "av7110.h"
  63#include "av7110_hw.h"
  64#include "av7110_av.h"
  65#include "av7110_ca.h"
  66#include "av7110_ipack.h"
  67
  68#include "bsbe1.h"
  69#include "lnbp21.h"
  70#include "bsru6.h"
  71
  72#define TS_WIDTH  376
  73#define TS_HEIGHT 512
  74#define TS_BUFLEN (TS_WIDTH*TS_HEIGHT)
  75#define TS_MAX_PACKETS (TS_BUFLEN/TS_SIZE)
  76
  77
  78int av7110_debug;
  79
  80static int vidmode = CVBS_RGB_OUT;
  81static int pids_off;
  82static int adac = DVB_ADAC_TI;
  83static int hw_sections;
  84static int rgb_on;
  85static int volume = 255;
  86static int budgetpatch;
  87static int wss_cfg_4_3 = 0x4008;
  88static int wss_cfg_16_9 = 0x0007;
  89static int tv_standard;
  90static int full_ts;
  91
  92module_param_named(debug, av7110_debug, int, 0644);
  93MODULE_PARM_DESC(debug, "debug level (bitmask, default 0)");
  94module_param(vidmode, int, 0444);
  95MODULE_PARM_DESC(vidmode,"analog video out: 0 off, 1 CVBS+RGB (default), 2 CVBS+YC, 3 YC");
  96module_param(pids_off, int, 0444);
  97MODULE_PARM_DESC(pids_off,"clear video/audio/PCR PID filters when demux is closed");
  98module_param(adac, int, 0444);
  99MODULE_PARM_DESC(adac,"audio DAC type: 0 TI, 1 CRYSTAL, 2 MSP (use if autodetection fails)");
 100module_param(hw_sections, int, 0444);
 101MODULE_PARM_DESC(hw_sections, "0 use software section filter, 1 use hardware");
 102module_param(rgb_on, int, 0444);
 103MODULE_PARM_DESC(rgb_on, "For Siemens DVB-C cards only: Enable RGB control"
 104                " signal on SCART pin 16 to switch SCART video mode from CVBS to RGB");
 105module_param(volume, int, 0444);
 106MODULE_PARM_DESC(volume, "initial volume: default 255 (range 0-255)");
 107module_param(budgetpatch, int, 0444);
 108MODULE_PARM_DESC(budgetpatch, "use budget-patch hardware modification: default 0 (0 no, 1 autodetect, 2 always)");
 109module_param(full_ts, int, 0444);
 110MODULE_PARM_DESC(full_ts, "enable code for full-ts hardware modification: 0 disable (default), 1 enable");
 111module_param(wss_cfg_4_3, int, 0444);
 112MODULE_PARM_DESC(wss_cfg_4_3, "WSS 4:3 - default 0x4008 - bit 15: disable, 14: burst mode, 13..0: wss data");
 113module_param(wss_cfg_16_9, int, 0444);
 114MODULE_PARM_DESC(wss_cfg_16_9, "WSS 16:9 - default 0x0007 - bit 15: disable, 14: burst mode, 13..0: wss data");
 115module_param(tv_standard, int, 0444);
 116MODULE_PARM_DESC(tv_standard, "TV standard: 0 PAL (default), 1 NTSC");
 117
 118DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
 119
 120static void restart_feeds(struct av7110 *av7110);
 121static int budget_start_feed(struct dvb_demux_feed *feed);
 122static int budget_stop_feed(struct dvb_demux_feed *feed);
 123
 124static int av7110_num;
 125
 126#define FE_FUNC_OVERRIDE(fe_func, av7110_copy, av7110_func) \
 127{\
 128        if (fe_func != NULL) { \
 129                av7110_copy = fe_func; \
 130                fe_func = av7110_func; \
 131        } \
 132}
 133
 134
 135static void init_av7110_av(struct av7110 *av7110)
 136{
 137        int ret;
 138        struct saa7146_dev *dev = av7110->dev;
 139
 140        /* set internal volume control to maximum */
 141        av7110->adac_type = DVB_ADAC_TI;
 142        ret = av7110_set_volume(av7110, av7110->mixer.volume_left, av7110->mixer.volume_right);
 143        if (ret < 0)
 144                printk("dvb-ttpci:cannot set internal volume to maximum:%d\n",ret);
 145
 146        ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetMonitorType,
 147                            1, (u16) av7110->display_ar);
 148        if (ret < 0)
 149                printk("dvb-ttpci: unable to set aspect ratio\n");
 150        ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetPanScanType,
 151                            1, av7110->display_panscan);
 152        if (ret < 0)
 153                printk("dvb-ttpci: unable to set pan scan\n");
 154
 155        ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetWSSConfig, 2, 2, wss_cfg_4_3);
 156        if (ret < 0)
 157                printk("dvb-ttpci: unable to configure 4:3 wss\n");
 158        ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetWSSConfig, 2, 3, wss_cfg_16_9);
 159        if (ret < 0)
 160                printk("dvb-ttpci: unable to configure 16:9 wss\n");
 161
 162        ret = av7710_set_video_mode(av7110, vidmode);
 163        if (ret < 0)
 164                printk("dvb-ttpci:cannot set video mode:%d\n",ret);
 165
 166        /* handle different card types */
 167        /* remaining inits according to card and frontend type */
 168        av7110->analog_tuner_flags = 0;
 169        av7110->current_input = 0;
 170        if (dev->pci->subsystem_vendor == 0x13c2 && dev->pci->subsystem_device == 0x000a)
 171                av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, 0); // SPDIF on
 172        if (i2c_writereg(av7110, 0x20, 0x00, 0x00) == 1) {
 173                printk ("dvb-ttpci: Crystal audio DAC @ card %d detected\n",
 174                        av7110->dvb_adapter.num);
 175                av7110->adac_type = DVB_ADAC_CRYSTAL;
 176                i2c_writereg(av7110, 0x20, 0x01, 0xd2);
 177                i2c_writereg(av7110, 0x20, 0x02, 0x49);
 178                i2c_writereg(av7110, 0x20, 0x03, 0x00);
 179                i2c_writereg(av7110, 0x20, 0x04, 0x00);
 180
 181                /**
 182                 * some special handling for the Siemens DVB-C cards...
 183                 */
 184        } else if (0 == av7110_init_analog_module(av7110)) {
 185                /* done. */
 186        }
 187        else if (dev->pci->subsystem_vendor == 0x110a) {
 188                printk("dvb-ttpci: DVB-C w/o analog module @ card %d detected\n",
 189                        av7110->dvb_adapter.num);
 190                av7110->adac_type = DVB_ADAC_NONE;
 191        }
 192        else {
 193                av7110->adac_type = adac;
 194                printk("dvb-ttpci: adac type set to %d @ card %d\n",
 195                        av7110->adac_type, av7110->dvb_adapter.num);
 196        }
 197
 198        if (av7110->adac_type == DVB_ADAC_NONE || av7110->adac_type == DVB_ADAC_MSP34x0) {
 199                // switch DVB SCART on
 200                ret = av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, MainSwitch, 1, 0);
 201                if (ret < 0)
 202                        printk("dvb-ttpci:cannot switch on SCART(Main):%d\n",ret);
 203                ret = av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, 1);
 204                if (ret < 0)
 205                        printk("dvb-ttpci:cannot switch on SCART(AD):%d\n",ret);
 206                if (rgb_on &&
 207                    ((av7110->dev->pci->subsystem_vendor == 0x110a) ||
 208                     (av7110->dev->pci->subsystem_vendor == 0x13c2)) &&
 209                     (av7110->dev->pci->subsystem_device == 0x0000)) {
 210                        saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // RGB on, SCART pin 16
 211                        //saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // SCARTpin 8
 212                }
 213        }
 214
 215        if (dev->pci->subsystem_vendor == 0x13c2 && dev->pci->subsystem_device == 0x000e)
 216                av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, SpdifSwitch, 1, 0); // SPDIF on
 217
 218        ret = av7110_set_volume(av7110, av7110->mixer.volume_left, av7110->mixer.volume_right);
 219        if (ret < 0)
 220                printk("dvb-ttpci:cannot set volume :%d\n",ret);
 221}
 222
 223static void recover_arm(struct av7110 *av7110)
 224{
 225        dprintk(4, "%p\n",av7110);
 226
 227        av7110_bootarm(av7110);
 228        msleep(100);
 229
 230        init_av7110_av(av7110);
 231
 232        /* card-specific recovery */
 233        if (av7110->recover)
 234                av7110->recover(av7110);
 235
 236        restart_feeds(av7110);
 237
 238#if IS_ENABLED(CONFIG_DVB_AV7110_IR)
 239        av7110_check_ir_config(av7110, true);
 240#endif
 241}
 242
 243static void av7110_arm_sync(struct av7110 *av7110)
 244{
 245        if (av7110->arm_thread)
 246                kthread_stop(av7110->arm_thread);
 247
 248        av7110->arm_thread = NULL;
 249}
 250
 251static int arm_thread(void *data)
 252{
 253        struct av7110 *av7110 = data;
 254        u16 newloops = 0;
 255        int timeout;
 256
 257        dprintk(4, "%p\n",av7110);
 258
 259        for (;;) {
 260                timeout = wait_event_interruptible_timeout(av7110->arm_wait,
 261                        kthread_should_stop(), 5 * HZ);
 262
 263                if (-ERESTARTSYS == timeout || kthread_should_stop()) {
 264                        /* got signal or told to quit*/
 265                        break;
 266                }
 267
 268                if (!av7110->arm_ready)
 269                        continue;
 270
 271#if IS_ENABLED(CONFIG_DVB_AV7110_IR)
 272                av7110_check_ir_config(av7110, false);
 273#endif
 274
 275                if (mutex_lock_interruptible(&av7110->dcomlock))
 276                        break;
 277                newloops = rdebi(av7110, DEBINOSWAP, STATUS_LOOPS, 0, 2);
 278                mutex_unlock(&av7110->dcomlock);
 279
 280                if (newloops == av7110->arm_loops || av7110->arm_errors > 3) {
 281                        printk(KERN_ERR "dvb-ttpci: ARM crashed @ card %d\n",
 282                               av7110->dvb_adapter.num);
 283
 284                        recover_arm(av7110);
 285
 286                        if (mutex_lock_interruptible(&av7110->dcomlock))
 287                                break;
 288                        newloops = rdebi(av7110, DEBINOSWAP, STATUS_LOOPS, 0, 2) - 1;
 289                        mutex_unlock(&av7110->dcomlock);
 290                }
 291                av7110->arm_loops = newloops;
 292                av7110->arm_errors = 0;
 293        }
 294
 295        return 0;
 296}
 297
 298
 299/****************************************************************************
 300 * IRQ handling
 301 ****************************************************************************/
 302
 303static int DvbDmxFilterCallback(u8 *buffer1, size_t buffer1_len,
 304                                u8 *buffer2, size_t buffer2_len,
 305                                struct dvb_demux_filter *dvbdmxfilter,
 306                                struct av7110 *av7110)
 307{
 308        if (!dvbdmxfilter->feed->demux->dmx.frontend)
 309                return 0;
 310        if (dvbdmxfilter->feed->demux->dmx.frontend->source == DMX_MEMORY_FE)
 311                return 0;
 312
 313        switch (dvbdmxfilter->type) {
 314        case DMX_TYPE_SEC:
 315                if ((((buffer1[1] << 8) | buffer1[2]) & 0xfff) + 3 != buffer1_len)
 316                        return 0;
 317                if (dvbdmxfilter->doneq) {
 318                        struct dmx_section_filter *filter = &dvbdmxfilter->filter;
 319                        int i;
 320                        u8 xor, neq = 0;
 321
 322                        for (i = 0; i < DVB_DEMUX_MASK_MAX; i++) {
 323                                xor = filter->filter_value[i] ^ buffer1[i];
 324                                neq |= dvbdmxfilter->maskandnotmode[i] & xor;
 325                        }
 326                        if (!neq)
 327                                return 0;
 328                }
 329                return dvbdmxfilter->feed->cb.sec(buffer1, buffer1_len,
 330                                                  buffer2, buffer2_len,
 331                                                  &dvbdmxfilter->filter);
 332        case DMX_TYPE_TS:
 333                if (!(dvbdmxfilter->feed->ts_type & TS_PACKET))
 334                        return 0;
 335                if (dvbdmxfilter->feed->ts_type & TS_PAYLOAD_ONLY)
 336                        return dvbdmxfilter->feed->cb.ts(buffer1, buffer1_len,
 337                                                         buffer2, buffer2_len,
 338                                                         &dvbdmxfilter->feed->feed.ts);
 339                else
 340                        av7110_p2t_write(buffer1, buffer1_len,
 341                                         dvbdmxfilter->feed->pid,
 342                                         &av7110->p2t_filter[dvbdmxfilter->index]);
 343        default:
 344                return 0;
 345        }
 346}
 347
 348
 349//#define DEBUG_TIMING
 350static inline void print_time(char *s)
 351{
 352#ifdef DEBUG_TIMING
 353        struct timeval tv;
 354        do_gettimeofday(&tv);
 355        printk("%s: %d.%d\n", s, (int)tv.tv_sec, (int)tv.tv_usec);
 356#endif
 357}
 358
 359#define DEBI_READ 0
 360#define DEBI_WRITE 1
 361static inline void start_debi_dma(struct av7110 *av7110, int dir,
 362                                  unsigned long addr, unsigned int len)
 363{
 364        dprintk(8, "%c %08lx %u\n", dir == DEBI_READ ? 'R' : 'W', addr, len);
 365        if (saa7146_wait_for_debi_done(av7110->dev, 0)) {
 366                printk(KERN_ERR "%s: saa7146_wait_for_debi_done timed out\n", __func__);
 367                return;
 368        }
 369
 370        SAA7146_ISR_CLEAR(av7110->dev, MASK_19); /* for good measure */
 371        SAA7146_IER_ENABLE(av7110->dev, MASK_19);
 372        if (len < 5)
 373                len = 5; /* we want a real DEBI DMA */
 374        if (dir == DEBI_WRITE)
 375                iwdebi(av7110, DEBISWAB, addr, 0, (len + 3) & ~3);
 376        else
 377                irdebi(av7110, DEBISWAB, addr, 0, len);
 378}
 379
 380static void debiirq(unsigned long cookie)
 381{
 382        struct av7110 *av7110 = (struct av7110 *)cookie;
 383        int type = av7110->debitype;
 384        int handle = (type >> 8) & 0x1f;
 385        unsigned int xfer = 0;
 386
 387        print_time("debi");
 388        dprintk(4, "type 0x%04x\n", type);
 389
 390        if (type == -1) {
 391                printk("DEBI irq oops @ %ld, psr:0x%08x, ssr:0x%08x\n",
 392                       jiffies, saa7146_read(av7110->dev, PSR),
 393                       saa7146_read(av7110->dev, SSR));
 394                goto debi_done;
 395        }
 396        av7110->debitype = -1;
 397
 398        switch (type & 0xff) {
 399
 400        case DATA_TS_RECORD:
 401                dvb_dmx_swfilter_packets(&av7110->demux,
 402                                         (const u8 *) av7110->debi_virt,
 403                                         av7110->debilen / 188);
 404                xfer = RX_BUFF;
 405                break;
 406
 407        case DATA_PES_RECORD:
 408                if (av7110->demux.recording)
 409                        av7110_record_cb(&av7110->p2t[handle],
 410                                         (u8 *) av7110->debi_virt,
 411                                         av7110->debilen);
 412                xfer = RX_BUFF;
 413                break;
 414
 415        case DATA_IPMPE:
 416        case DATA_FSECTION:
 417        case DATA_PIPING:
 418                if (av7110->handle2filter[handle])
 419                        DvbDmxFilterCallback((u8 *)av7110->debi_virt,
 420                                             av7110->debilen, NULL, 0,
 421                                             av7110->handle2filter[handle],
 422                                             av7110);
 423                xfer = RX_BUFF;
 424                break;
 425
 426        case DATA_CI_GET:
 427        {
 428                u8 *data = av7110->debi_virt;
 429
 430                if ((data[0] < 2) && data[2] == 0xff) {
 431                        int flags = 0;
 432                        if (data[5] > 0)
 433                                flags |= CA_CI_MODULE_PRESENT;
 434                        if (data[5] > 5)
 435                                flags |= CA_CI_MODULE_READY;
 436                        av7110->ci_slot[data[0]].flags = flags;
 437                } else
 438                        ci_get_data(&av7110->ci_rbuffer,
 439                                    av7110->debi_virt,
 440                                    av7110->debilen);
 441                xfer = RX_BUFF;
 442                break;
 443        }
 444
 445        case DATA_COMMON_INTERFACE:
 446                CI_handle(av7110, (u8 *)av7110->debi_virt, av7110->debilen);
 447#if 0
 448        {
 449                int i;
 450
 451                printk("av7110%d: ", av7110->num);
 452                printk("%02x ", *(u8 *)av7110->debi_virt);
 453                printk("%02x ", *(1+(u8 *)av7110->debi_virt));
 454                for (i = 2; i < av7110->debilen; i++)
 455                        printk("%02x ", (*(i+(unsigned char *)av7110->debi_virt)));
 456                for (i = 2; i < av7110->debilen; i++)
 457                        printk("%c", chtrans(*(i+(unsigned char *)av7110->debi_virt)));
 458
 459                printk("\n");
 460        }
 461#endif
 462                xfer = RX_BUFF;
 463                break;
 464
 465        case DATA_DEBUG_MESSAGE:
 466                ((s8*)av7110->debi_virt)[Reserved_SIZE - 1] = 0;
 467                printk("%s\n", (s8 *) av7110->debi_virt);
 468                xfer = RX_BUFF;
 469                break;
 470
 471        case DATA_CI_PUT:
 472                dprintk(4, "debi DATA_CI_PUT\n");
 473        case DATA_MPEG_PLAY:
 474                dprintk(4, "debi DATA_MPEG_PLAY\n");
 475        case DATA_BMP_LOAD:
 476                dprintk(4, "debi DATA_BMP_LOAD\n");
 477                xfer = TX_BUFF;
 478                break;
 479        default:
 480                break;
 481        }
 482debi_done:
 483        spin_lock(&av7110->debilock);
 484        if (xfer)
 485                iwdebi(av7110, DEBINOSWAP, xfer, 0, 2);
 486        ARM_ClearMailBox(av7110);
 487        spin_unlock(&av7110->debilock);
 488}
 489
 490/* irq from av7110 firmware writing the mailbox register in the DPRAM */
 491static void gpioirq(unsigned long cookie)
 492{
 493        struct av7110 *av7110 = (struct av7110 *)cookie;
 494        u32 rxbuf, txbuf;
 495        int len;
 496
 497        if (av7110->debitype != -1)
 498                /* we shouldn't get any irq while a debi xfer is running */
 499                printk("dvb-ttpci: GPIO0 irq oops @ %ld, psr:0x%08x, ssr:0x%08x\n",
 500                       jiffies, saa7146_read(av7110->dev, PSR),
 501                       saa7146_read(av7110->dev, SSR));
 502
 503        if (saa7146_wait_for_debi_done(av7110->dev, 0)) {
 504                printk(KERN_ERR "%s: saa7146_wait_for_debi_done timed out\n", __func__);
 505                BUG(); /* maybe we should try resetting the debi? */
 506        }
 507
 508        spin_lock(&av7110->debilock);
 509        ARM_ClearIrq(av7110);
 510
 511        /* see what the av7110 wants */
 512        av7110->debitype = irdebi(av7110, DEBINOSWAP, IRQ_STATE, 0, 2);
 513        av7110->debilen  = irdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
 514        rxbuf = irdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
 515        txbuf = irdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
 516        len = (av7110->debilen + 3) & ~3;
 517
 518        print_time("gpio");
 519        dprintk(8, "GPIO0 irq 0x%04x %d\n", av7110->debitype, av7110->debilen);
 520
 521        switch (av7110->debitype & 0xff) {
 522
 523        case DATA_TS_PLAY:
 524        case DATA_PES_PLAY:
 525                break;
 526
 527        case DATA_MPEG_VIDEO_EVENT:
 528        {
 529                u32 h_ar;
 530                struct video_event event;
 531
 532                av7110->video_size.w = irdebi(av7110, DEBINOSWAP, STATUS_MPEG_WIDTH, 0, 2);
 533                h_ar = irdebi(av7110, DEBINOSWAP, STATUS_MPEG_HEIGHT_AR, 0, 2);
 534
 535                iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
 536                iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
 537
 538                av7110->video_size.h = h_ar & 0xfff;
 539
 540                event.type = VIDEO_EVENT_SIZE_CHANGED;
 541                event.u.size.w = av7110->video_size.w;
 542                event.u.size.h = av7110->video_size.h;
 543                switch ((h_ar >> 12) & 0xf)
 544                {
 545                case 3:
 546                        av7110->video_size.aspect_ratio = VIDEO_FORMAT_16_9;
 547                        event.u.size.aspect_ratio = VIDEO_FORMAT_16_9;
 548                        av7110->videostate.video_format = VIDEO_FORMAT_16_9;
 549                        break;
 550                case 4:
 551                        av7110->video_size.aspect_ratio = VIDEO_FORMAT_221_1;
 552                        event.u.size.aspect_ratio = VIDEO_FORMAT_221_1;
 553                        av7110->videostate.video_format = VIDEO_FORMAT_221_1;
 554                        break;
 555                default:
 556                        av7110->video_size.aspect_ratio = VIDEO_FORMAT_4_3;
 557                        event.u.size.aspect_ratio = VIDEO_FORMAT_4_3;
 558                        av7110->videostate.video_format = VIDEO_FORMAT_4_3;
 559                }
 560
 561                dprintk(8, "GPIO0 irq: DATA_MPEG_VIDEO_EVENT: w/h/ar = %u/%u/%u\n",
 562                        av7110->video_size.w, av7110->video_size.h,
 563                        av7110->video_size.aspect_ratio);
 564
 565                dvb_video_add_event(av7110, &event);
 566                break;
 567        }
 568
 569        case DATA_CI_PUT:
 570        {
 571                int avail;
 572                struct dvb_ringbuffer *cibuf = &av7110->ci_wbuffer;
 573
 574                avail = dvb_ringbuffer_avail(cibuf);
 575                if (avail <= 2) {
 576                        iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
 577                        iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
 578                        iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
 579                        break;
 580                }
 581                len = DVB_RINGBUFFER_PEEK(cibuf, 0) << 8;
 582                len |= DVB_RINGBUFFER_PEEK(cibuf, 1);
 583                if (avail < len + 2) {
 584                        iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
 585                        iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
 586                        iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
 587                        break;
 588                }
 589                DVB_RINGBUFFER_SKIP(cibuf, 2);
 590
 591                dvb_ringbuffer_read(cibuf, av7110->debi_virt, len);
 592
 593                iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2);
 594                iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2);
 595                dprintk(8, "DMA: CI\n");
 596                start_debi_dma(av7110, DEBI_WRITE, DPRAM_BASE + txbuf, len);
 597                spin_unlock(&av7110->debilock);
 598                wake_up(&cibuf->queue);
 599                return;
 600        }
 601
 602        case DATA_MPEG_PLAY:
 603                if (!av7110->playing) {
 604                        iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
 605                        iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
 606                        iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
 607                        break;
 608                }
 609                len = 0;
 610                if (av7110->debitype & 0x100) {
 611                        spin_lock(&av7110->aout.lock);
 612                        len = av7110_pes_play(av7110->debi_virt, &av7110->aout, 2048);
 613                        spin_unlock(&av7110->aout.lock);
 614                }
 615                if (len <= 0 && (av7110->debitype & 0x200)
 616                    &&av7110->videostate.play_state != VIDEO_FREEZED) {
 617                        spin_lock(&av7110->avout.lock);
 618                        len = av7110_pes_play(av7110->debi_virt, &av7110->avout, 2048);
 619                        spin_unlock(&av7110->avout.lock);
 620                }
 621                if (len <= 0) {
 622                        iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
 623                        iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
 624                        iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
 625                        break;
 626                }
 627                dprintk(8, "GPIO0 PES_PLAY len=%04x\n", len);
 628                iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2);
 629                iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2);
 630                dprintk(8, "DMA: MPEG_PLAY\n");
 631                start_debi_dma(av7110, DEBI_WRITE, DPRAM_BASE + txbuf, len);
 632                spin_unlock(&av7110->debilock);
 633                return;
 634
 635        case DATA_BMP_LOAD:
 636                len = av7110->debilen;
 637                dprintk(8, "gpio DATA_BMP_LOAD len %d\n", len);
 638                if (!len) {
 639                        av7110->bmp_state = BMP_LOADED;
 640                        iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
 641                        iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
 642                        iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
 643                        wake_up(&av7110->bmpq);
 644                        dprintk(8, "gpio DATA_BMP_LOAD done\n");
 645                        break;
 646                }
 647                if (len > av7110->bmplen)
 648                        len = av7110->bmplen;
 649                if (len > 2 * 1024)
 650                        len = 2 * 1024;
 651                iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2);
 652                iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2);
 653                memcpy(av7110->debi_virt, av7110->bmpbuf+av7110->bmpp, len);
 654                av7110->bmpp += len;
 655                av7110->bmplen -= len;
 656                dprintk(8, "gpio DATA_BMP_LOAD DMA len %d\n", len);
 657                start_debi_dma(av7110, DEBI_WRITE, DPRAM_BASE+txbuf, len);
 658                spin_unlock(&av7110->debilock);
 659                return;
 660
 661        case DATA_CI_GET:
 662        case DATA_COMMON_INTERFACE:
 663        case DATA_FSECTION:
 664        case DATA_IPMPE:
 665        case DATA_PIPING:
 666                if (!len || len > 4 * 1024) {
 667                        iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
 668                        break;
 669                }
 670                /* fall through */
 671
 672        case DATA_TS_RECORD:
 673        case DATA_PES_RECORD:
 674                dprintk(8, "DMA: TS_REC etc.\n");
 675                start_debi_dma(av7110, DEBI_READ, DPRAM_BASE+rxbuf, len);
 676                spin_unlock(&av7110->debilock);
 677                return;
 678
 679        case DATA_DEBUG_MESSAGE:
 680                if (!len || len > 0xff) {
 681                        iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
 682                        break;
 683                }
 684                start_debi_dma(av7110, DEBI_READ, Reserved, len);
 685                spin_unlock(&av7110->debilock);
 686                return;
 687
 688        case DATA_IRCOMMAND:
 689                if (av7110->ir.ir_handler)
 690                        av7110->ir.ir_handler(av7110,
 691                                swahw32(irdebi(av7110, DEBINOSWAP, Reserved, 0, 4)));
 692                iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
 693                break;
 694
 695        default:
 696                printk("dvb-ttpci: gpioirq unknown type=%d len=%d\n",
 697                       av7110->debitype, av7110->debilen);
 698                break;
 699        }
 700        av7110->debitype = -1;
 701        ARM_ClearMailBox(av7110);
 702        spin_unlock(&av7110->debilock);
 703}
 704
 705
 706#ifdef CONFIG_DVB_AV7110_OSD
 707static int dvb_osd_ioctl(struct file *file,
 708                         unsigned int cmd, void *parg)
 709{
 710        struct dvb_device *dvbdev = file->private_data;
 711        struct av7110 *av7110 = dvbdev->priv;
 712
 713        dprintk(4, "%p\n", av7110);
 714
 715        if (cmd == OSD_SEND_CMD)
 716                return av7110_osd_cmd(av7110, (osd_cmd_t *) parg);
 717        if (cmd == OSD_GET_CAPABILITY)
 718                return av7110_osd_capability(av7110, (osd_cap_t *) parg);
 719
 720        return -EINVAL;
 721}
 722
 723
 724static const struct file_operations dvb_osd_fops = {
 725        .owner          = THIS_MODULE,
 726        .unlocked_ioctl = dvb_generic_ioctl,
 727        .open           = dvb_generic_open,
 728        .release        = dvb_generic_release,
 729        .llseek         = noop_llseek,
 730};
 731
 732static struct dvb_device dvbdev_osd = {
 733        .priv           = NULL,
 734        .users          = 1,
 735        .writers        = 1,
 736        .fops           = &dvb_osd_fops,
 737        .kernel_ioctl   = dvb_osd_ioctl,
 738};
 739#endif /* CONFIG_DVB_AV7110_OSD */
 740
 741
 742static inline int SetPIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid,
 743                          u16 subpid, u16 pcrpid)
 744{
 745        u16 aflags = 0;
 746
 747        dprintk(4, "%p\n", av7110);
 748
 749        if (vpid == 0x1fff || apid == 0x1fff ||
 750            ttpid == 0x1fff || subpid == 0x1fff || pcrpid == 0x1fff) {
 751                vpid = apid = ttpid = subpid = pcrpid = 0;
 752                av7110->pids[DMX_PES_VIDEO] = 0;
 753                av7110->pids[DMX_PES_AUDIO] = 0;
 754                av7110->pids[DMX_PES_TELETEXT] = 0;
 755                av7110->pids[DMX_PES_PCR] = 0;
 756        }
 757
 758        if (av7110->audiostate.bypass_mode)
 759                aflags |= 0x8000;
 760
 761        return av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, MultiPID, 6,
 762                             pcrpid, vpid, apid, ttpid, subpid, aflags);
 763}
 764
 765int ChangePIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid,
 766                u16 subpid, u16 pcrpid)
 767{
 768        int ret = 0;
 769        dprintk(4, "%p\n", av7110);
 770
 771        if (mutex_lock_interruptible(&av7110->pid_mutex))
 772                return -ERESTARTSYS;
 773
 774        if (!(vpid & 0x8000))
 775                av7110->pids[DMX_PES_VIDEO] = vpid;
 776        if (!(apid & 0x8000))
 777                av7110->pids[DMX_PES_AUDIO] = apid;
 778        if (!(ttpid & 0x8000))
 779                av7110->pids[DMX_PES_TELETEXT] = ttpid;
 780        if (!(pcrpid & 0x8000))
 781                av7110->pids[DMX_PES_PCR] = pcrpid;
 782
 783        av7110->pids[DMX_PES_SUBTITLE] = 0;
 784
 785        if (av7110->fe_synced) {
 786                pcrpid = av7110->pids[DMX_PES_PCR];
 787                ret = SetPIDs(av7110, vpid, apid, ttpid, subpid, pcrpid);
 788        }
 789
 790        mutex_unlock(&av7110->pid_mutex);
 791        return ret;
 792}
 793
 794
 795/******************************************************************************
 796 * hardware filter functions
 797 ******************************************************************************/
 798
 799static int StartHWFilter(struct dvb_demux_filter *dvbdmxfilter)
 800{
 801        struct dvb_demux_feed *dvbdmxfeed = dvbdmxfilter->feed;
 802        struct av7110 *av7110 = dvbdmxfeed->demux->priv;
 803        u16 buf[20];
 804        int ret, i;
 805        u16 handle;
 806//      u16 mode = 0x0320;
 807        u16 mode = 0xb96a;
 808
 809        dprintk(4, "%p\n", av7110);
 810
 811        if (av7110->full_ts)
 812                return 0;
 813
 814        if (dvbdmxfilter->type == DMX_TYPE_SEC) {
 815                if (hw_sections) {
 816                        buf[4] = (dvbdmxfilter->filter.filter_value[0] << 8) |
 817                                dvbdmxfilter->maskandmode[0];
 818                        for (i = 3; i < 18; i++)
 819                                buf[i + 4 - 2] =
 820                                        (dvbdmxfilter->filter.filter_value[i] << 8) |
 821                                        dvbdmxfilter->maskandmode[i];
 822                        mode = 4;
 823                }
 824        } else if ((dvbdmxfeed->ts_type & TS_PACKET) &&
 825                   !(dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY)) {
 826                av7110_p2t_init(&av7110->p2t_filter[dvbdmxfilter->index], dvbdmxfeed);
 827        }
 828
 829        buf[0] = (COMTYPE_PID_FILTER << 8) + AddPIDFilter;
 830        buf[1] = 16;
 831        buf[2] = dvbdmxfeed->pid;
 832        buf[3] = mode;
 833
 834        ret = av7110_fw_request(av7110, buf, 20, &handle, 1);
 835        if (ret != 0 || handle >= 32) {
 836                printk("dvb-ttpci: %s error  buf %04x %04x %04x %04x  "
 837                                "ret %d  handle %04x\n",
 838                                __func__, buf[0], buf[1], buf[2], buf[3],
 839                                ret, handle);
 840                dvbdmxfilter->hw_handle = 0xffff;
 841                if (!ret)
 842                        ret = -1;
 843                return ret;
 844        }
 845
 846        av7110->handle2filter[handle] = dvbdmxfilter;
 847        dvbdmxfilter->hw_handle = handle;
 848
 849        return ret;
 850}
 851
 852static int StopHWFilter(struct dvb_demux_filter *dvbdmxfilter)
 853{
 854        struct av7110 *av7110 = dvbdmxfilter->feed->demux->priv;
 855        u16 buf[3];
 856        u16 answ[2];
 857        int ret;
 858        u16 handle;
 859
 860        dprintk(4, "%p\n", av7110);
 861
 862        if (av7110->full_ts)
 863                return 0;
 864
 865        handle = dvbdmxfilter->hw_handle;
 866        if (handle >= 32) {
 867                printk("%s tried to stop invalid filter %04x, filter type = %x\n",
 868                                __func__, handle, dvbdmxfilter->type);
 869                return -EINVAL;
 870        }
 871
 872        av7110->handle2filter[handle] = NULL;
 873
 874        buf[0] = (COMTYPE_PID_FILTER << 8) + DelPIDFilter;
 875        buf[1] = 1;
 876        buf[2] = handle;
 877        ret = av7110_fw_request(av7110, buf, 3, answ, 2);
 878        if (ret != 0 || answ[1] != handle) {
 879                printk("dvb-ttpci: %s error  cmd %04x %04x %04x  ret %x  "
 880                                "resp %04x %04x  pid %d\n",
 881                                __func__, buf[0], buf[1], buf[2], ret,
 882                                answ[0], answ[1], dvbdmxfilter->feed->pid);
 883                if (!ret)
 884                        ret = -1;
 885        }
 886        return ret;
 887}
 888
 889
 890static int dvb_feed_start_pid(struct dvb_demux_feed *dvbdmxfeed)
 891{
 892        struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
 893        struct av7110 *av7110 = dvbdmx->priv;
 894        u16 *pid = dvbdmx->pids, npids[5];
 895        int i;
 896        int ret = 0;
 897
 898        dprintk(4, "%p\n", av7110);
 899
 900        npids[0] = npids[1] = npids[2] = npids[3] = npids[4] = 0xffff;
 901        i = dvbdmxfeed->pes_type;
 902        npids[i] = (pid[i]&0x8000) ? 0 : pid[i];
 903        if ((i == 2) && npids[i] && (dvbdmxfeed->ts_type & TS_PACKET)) {
 904                npids[i] = 0;
 905                ret = ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]);
 906                if (!ret)
 907                        ret = StartHWFilter(dvbdmxfeed->filter);
 908                return ret;
 909        }
 910        if (dvbdmxfeed->pes_type <= 2 || dvbdmxfeed->pes_type == 4) {
 911                ret = ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]);
 912                if (ret)
 913                        return ret;
 914        }
 915
 916        if (dvbdmxfeed->pes_type < 2 && npids[0])
 917                if (av7110->fe_synced)
 918                {
 919                        ret = av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, Scan, 0);
 920                        if (ret)
 921                                return ret;
 922                }
 923
 924        if ((dvbdmxfeed->ts_type & TS_PACKET) && !av7110->full_ts) {
 925                if (dvbdmxfeed->pes_type == 0 && !(dvbdmx->pids[0] & 0x8000))
 926                        ret = av7110_av_start_record(av7110, RP_AUDIO, dvbdmxfeed);
 927                if (dvbdmxfeed->pes_type == 1 && !(dvbdmx->pids[1] & 0x8000))
 928                        ret = av7110_av_start_record(av7110, RP_VIDEO, dvbdmxfeed);
 929        }
 930        return ret;
 931}
 932
 933static int dvb_feed_stop_pid(struct dvb_demux_feed *dvbdmxfeed)
 934{
 935        struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
 936        struct av7110 *av7110 = dvbdmx->priv;
 937        u16 *pid = dvbdmx->pids, npids[5];
 938        int i;
 939
 940        int ret = 0;
 941
 942        dprintk(4, "%p\n", av7110);
 943
 944        if (dvbdmxfeed->pes_type <= 1) {
 945                ret = av7110_av_stop(av7110, dvbdmxfeed->pes_type ?  RP_VIDEO : RP_AUDIO);
 946                if (ret)
 947                        return ret;
 948                if (!av7110->rec_mode)
 949                        dvbdmx->recording = 0;
 950                if (!av7110->playing)
 951                        dvbdmx->playing = 0;
 952        }
 953        npids[0] = npids[1] = npids[2] = npids[3] = npids[4] = 0xffff;
 954        i = dvbdmxfeed->pes_type;
 955        switch (i) {
 956        case 2: //teletext
 957                if (dvbdmxfeed->ts_type & TS_PACKET)
 958                        ret = StopHWFilter(dvbdmxfeed->filter);
 959                npids[2] = 0;
 960                break;
 961        case 0:
 962        case 1:
 963        case 4:
 964                if (!pids_off)
 965                        return 0;
 966                npids[i] = (pid[i]&0x8000) ? 0 : pid[i];
 967                break;
 968        }
 969        if (!ret)
 970                ret = ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]);
 971        return ret;
 972}
 973
 974static int av7110_start_feed(struct dvb_demux_feed *feed)
 975{
 976        struct dvb_demux *demux = feed->demux;
 977        struct av7110 *av7110 = demux->priv;
 978        int ret = 0;
 979
 980        dprintk(4, "%p\n", av7110);
 981
 982        if (!demux->dmx.frontend)
 983                return -EINVAL;
 984
 985        if (!av7110->full_ts && feed->pid > 0x1fff)
 986                return -EINVAL;
 987
 988        if (feed->type == DMX_TYPE_TS) {
 989                if ((feed->ts_type & TS_DECODER) &&
 990                    (feed->pes_type <= DMX_PES_PCR)) {
 991                        switch (demux->dmx.frontend->source) {
 992                        case DMX_MEMORY_FE:
 993                                if (feed->ts_type & TS_DECODER)
 994                                       if (feed->pes_type < 2 &&
 995                                           !(demux->pids[0] & 0x8000) &&
 996                                           !(demux->pids[1] & 0x8000)) {
 997                                               dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout);
 998                                               dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout);
 999                                               ret = av7110_av_start_play(av7110,RP_AV);
1000                                               if (!ret)
1001                                                       demux->playing = 1;
1002                                        }
1003                                break;
1004                        default:
1005                                ret = dvb_feed_start_pid(feed);
1006                                break;
1007                        }
1008                } else if ((feed->ts_type & TS_PACKET) &&
1009                           (demux->dmx.frontend->source != DMX_MEMORY_FE)) {
1010                        ret = StartHWFilter(feed->filter);
1011                }
1012        }
1013
1014        if (av7110->full_ts) {
1015                budget_start_feed(feed);
1016                return ret;
1017        }
1018
1019        if (feed->type == DMX_TYPE_SEC) {
1020                int i;
1021
1022                for (i = 0; i < demux->filternum; i++) {
1023                        if (demux->filter[i].state != DMX_STATE_READY)
1024                                continue;
1025                        if (demux->filter[i].type != DMX_TYPE_SEC)
1026                                continue;
1027                        if (demux->filter[i].filter.parent != &feed->feed.sec)
1028                                continue;
1029                        demux->filter[i].state = DMX_STATE_GO;
1030                        if (demux->dmx.frontend->source != DMX_MEMORY_FE) {
1031                                ret = StartHWFilter(&demux->filter[i]);
1032                                if (ret)
1033                                        break;
1034                        }
1035                }
1036        }
1037
1038        return ret;
1039}
1040
1041
1042static int av7110_stop_feed(struct dvb_demux_feed *feed)
1043{
1044        struct dvb_demux *demux = feed->demux;
1045        struct av7110 *av7110 = demux->priv;
1046        int i, rc, ret = 0;
1047        dprintk(4, "%p\n", av7110);
1048
1049        if (feed->type == DMX_TYPE_TS) {
1050                if (feed->ts_type & TS_DECODER) {
1051                        if (feed->pes_type >= DMX_PES_OTHER ||
1052                            !demux->pesfilter[feed->pes_type])
1053                                return -EINVAL;
1054                        demux->pids[feed->pes_type] |= 0x8000;
1055                        demux->pesfilter[feed->pes_type] = NULL;
1056                }
1057                if (feed->ts_type & TS_DECODER &&
1058                    feed->pes_type < DMX_PES_OTHER) {
1059                        ret = dvb_feed_stop_pid(feed);
1060                } else
1061                        if ((feed->ts_type & TS_PACKET) &&
1062                            (demux->dmx.frontend->source != DMX_MEMORY_FE))
1063                                ret = StopHWFilter(feed->filter);
1064        }
1065
1066        if (av7110->full_ts) {
1067                budget_stop_feed(feed);
1068                return ret;
1069        }
1070
1071        if (feed->type == DMX_TYPE_SEC) {
1072                for (i = 0; i<demux->filternum; i++) {
1073                        if (demux->filter[i].state == DMX_STATE_GO &&
1074                            demux->filter[i].filter.parent == &feed->feed.sec) {
1075                                demux->filter[i].state = DMX_STATE_READY;
1076                                if (demux->dmx.frontend->source != DMX_MEMORY_FE) {
1077                                        rc = StopHWFilter(&demux->filter[i]);
1078                                        if (!ret)
1079                                                ret = rc;
1080                                        /* keep going, stop as many filters as possible */
1081                                }
1082                        }
1083                }
1084        }
1085
1086        return ret;
1087}
1088
1089
1090static void restart_feeds(struct av7110 *av7110)
1091{
1092        struct dvb_demux *dvbdmx = &av7110->demux;
1093        struct dvb_demux_feed *feed;
1094        int mode;
1095        int feeding;
1096        int i, j;
1097
1098        dprintk(4, "%p\n", av7110);
1099
1100        mode = av7110->playing;
1101        av7110->playing = 0;
1102        av7110->rec_mode = 0;
1103
1104        feeding = av7110->feeding1; /* full_ts mod */
1105
1106        for (i = 0; i < dvbdmx->feednum; i++) {
1107                feed = &dvbdmx->feed[i];
1108                if (feed->state == DMX_STATE_GO) {
1109                        if (feed->type == DMX_TYPE_SEC) {
1110                                for (j = 0; j < dvbdmx->filternum; j++) {
1111                                        if (dvbdmx->filter[j].type != DMX_TYPE_SEC)
1112                                                continue;
1113                                        if (dvbdmx->filter[j].filter.parent != &feed->feed.sec)
1114                                                continue;
1115                                        if (dvbdmx->filter[j].state == DMX_STATE_GO)
1116                                                dvbdmx->filter[j].state = DMX_STATE_READY;
1117                                }
1118                        }
1119                        av7110_start_feed(feed);
1120                }
1121        }
1122
1123        av7110->feeding1 = feeding; /* full_ts mod */
1124
1125        if (mode)
1126                av7110_av_start_play(av7110, mode);
1127}
1128
1129static int dvb_get_stc(struct dmx_demux *demux, unsigned int num,
1130                       uint64_t *stc, unsigned int *base)
1131{
1132        int ret;
1133        u16 fwstc[4];
1134        u16 tag = ((COMTYPE_REQUEST << 8) + ReqSTC);
1135        struct dvb_demux *dvbdemux;
1136        struct av7110 *av7110;
1137
1138        /* pointer casting paranoia... */
1139        BUG_ON(!demux);
1140        dvbdemux = demux->priv;
1141        BUG_ON(!dvbdemux);
1142        av7110 = dvbdemux->priv;
1143
1144        dprintk(4, "%p\n", av7110);
1145
1146        if (num != 0)
1147                return -EINVAL;
1148
1149        ret = av7110_fw_request(av7110, &tag, 0, fwstc, 4);
1150        if (ret) {
1151                printk(KERN_ERR "%s: av7110_fw_request error\n", __func__);
1152                return ret;
1153        }
1154        dprintk(2, "fwstc = %04hx %04hx %04hx %04hx\n",
1155                fwstc[0], fwstc[1], fwstc[2], fwstc[3]);
1156
1157        *stc =  (((uint64_t) ((fwstc[3] & 0x8000) >> 15)) << 32) |
1158                (((uint64_t)  fwstc[1]) << 16) | ((uint64_t) fwstc[0]);
1159        *base = 1;
1160
1161        dprintk(4, "stc = %lu\n", (unsigned long)*stc);
1162
1163        return 0;
1164}
1165
1166
1167/******************************************************************************
1168 * SEC device file operations
1169 ******************************************************************************/
1170
1171
1172static int av7110_set_tone(struct dvb_frontend *fe, enum fe_sec_tone_mode tone)
1173{
1174        struct av7110* av7110 = fe->dvb->priv;
1175
1176        switch (tone) {
1177        case SEC_TONE_ON:
1178                return Set22K(av7110, 1);
1179
1180        case SEC_TONE_OFF:
1181                return Set22K(av7110, 0);
1182
1183        default:
1184                return -EINVAL;
1185        }
1186}
1187
1188static int av7110_diseqc_send_master_cmd(struct dvb_frontend* fe,
1189                                         struct dvb_diseqc_master_cmd* cmd)
1190{
1191        struct av7110* av7110 = fe->dvb->priv;
1192
1193        return av7110_diseqc_send(av7110, cmd->msg_len, cmd->msg, -1);
1194}
1195
1196static int av7110_diseqc_send_burst(struct dvb_frontend* fe,
1197                                    enum fe_sec_mini_cmd minicmd)
1198{
1199        struct av7110* av7110 = fe->dvb->priv;
1200
1201        return av7110_diseqc_send(av7110, 0, NULL, minicmd);
1202}
1203
1204/* simplified code from budget-core.c */
1205static int stop_ts_capture(struct av7110 *budget)
1206{
1207        dprintk(2, "budget: %p\n", budget);
1208
1209        if (--budget->feeding1)
1210                return budget->feeding1;
1211        saa7146_write(budget->dev, MC1, MASK_20);       /* DMA3 off */
1212        SAA7146_IER_DISABLE(budget->dev, MASK_10);
1213        SAA7146_ISR_CLEAR(budget->dev, MASK_10);
1214        return 0;
1215}
1216
1217static int start_ts_capture(struct av7110 *budget)
1218{
1219        unsigned y;
1220
1221        dprintk(2, "budget: %p\n", budget);
1222
1223        if (budget->feeding1)
1224                return ++budget->feeding1;
1225        for (y = 0; y < TS_HEIGHT; y++)
1226                memset(budget->grabbing + y * TS_WIDTH, 0x00, TS_WIDTH);
1227        budget->ttbp = 0;
1228        SAA7146_ISR_CLEAR(budget->dev, MASK_10);  /* VPE */
1229        SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */
1230        saa7146_write(budget->dev, MC1, (MASK_04 | MASK_20)); /* DMA3 on */
1231        return ++budget->feeding1;
1232}
1233
1234static int budget_start_feed(struct dvb_demux_feed *feed)
1235{
1236        struct dvb_demux *demux = feed->demux;
1237        struct av7110 *budget = demux->priv;
1238        int status;
1239
1240        dprintk(2, "av7110: %p\n", budget);
1241
1242        spin_lock(&budget->feedlock1);
1243        feed->pusi_seen = 0; /* have a clean section start */
1244        status = start_ts_capture(budget);
1245        spin_unlock(&budget->feedlock1);
1246        return status;
1247}
1248
1249static int budget_stop_feed(struct dvb_demux_feed *feed)
1250{
1251        struct dvb_demux *demux = feed->demux;
1252        struct av7110 *budget = demux->priv;
1253        int status;
1254
1255        dprintk(2, "budget: %p\n", budget);
1256
1257        spin_lock(&budget->feedlock1);
1258        status = stop_ts_capture(budget);
1259        spin_unlock(&budget->feedlock1);
1260        return status;
1261}
1262
1263static void vpeirq(unsigned long cookie)
1264{
1265        struct av7110 *budget = (struct av7110 *)cookie;
1266        u8 *mem = (u8 *) (budget->grabbing);
1267        u32 olddma = budget->ttbp;
1268        u32 newdma = saa7146_read(budget->dev, PCI_VDP3);
1269        struct dvb_demux *demux = budget->full_ts ? &budget->demux : &budget->demux1;
1270
1271        /* nearest lower position divisible by 188 */
1272        newdma -= newdma % 188;
1273
1274        if (newdma >= TS_BUFLEN)
1275                return;
1276
1277        budget->ttbp = newdma;
1278
1279        if (!budget->feeding1 || (newdma == olddma))
1280                return;
1281
1282        /* Ensure streamed PCI data is synced to CPU */
1283        pci_dma_sync_sg_for_cpu(budget->dev->pci, budget->pt.slist, budget->pt.nents, PCI_DMA_FROMDEVICE);
1284
1285#if 0
1286        /* track rps1 activity */
1287        printk("vpeirq: %02x Event Counter 1 0x%04x\n",
1288               mem[olddma],
1289               saa7146_read(budget->dev, EC1R) & 0x3fff);
1290#endif
1291
1292        if (newdma > olddma)
1293                /* no wraparound, dump olddma..newdma */
1294                dvb_dmx_swfilter_packets(demux, mem + olddma, (newdma - olddma) / 188);
1295        else {
1296                /* wraparound, dump olddma..buflen and 0..newdma */
1297                dvb_dmx_swfilter_packets(demux, mem + olddma, (TS_BUFLEN - olddma) / 188);
1298                dvb_dmx_swfilter_packets(demux, mem, newdma / 188);
1299        }
1300}
1301
1302static int av7110_register(struct av7110 *av7110)
1303{
1304        int ret, i;
1305        struct dvb_demux *dvbdemux = &av7110->demux;
1306        struct dvb_demux *dvbdemux1 = &av7110->demux1;
1307
1308        dprintk(4, "%p\n", av7110);
1309
1310        if (av7110->registered)
1311                return -1;
1312
1313        av7110->registered = 1;
1314
1315        dvbdemux->priv = (void *) av7110;
1316
1317        for (i = 0; i < 32; i++)
1318                av7110->handle2filter[i] = NULL;
1319
1320        dvbdemux->filternum = (av7110->full_ts) ? 256 : 32;
1321        dvbdemux->feednum = (av7110->full_ts) ? 256 : 32;
1322        dvbdemux->start_feed = av7110_start_feed;
1323        dvbdemux->stop_feed = av7110_stop_feed;
1324        dvbdemux->write_to_decoder = av7110_write_to_decoder;
1325        dvbdemux->dmx.capabilities = (DMX_TS_FILTERING | DMX_SECTION_FILTERING |
1326                                      DMX_MEMORY_BASED_FILTERING);
1327
1328        dvb_dmx_init(&av7110->demux);
1329        av7110->demux.dmx.get_stc = dvb_get_stc;
1330
1331        av7110->dmxdev.filternum = (av7110->full_ts) ? 256 : 32;
1332        av7110->dmxdev.demux = &dvbdemux->dmx;
1333        av7110->dmxdev.capabilities = 0;
1334
1335        dvb_dmxdev_init(&av7110->dmxdev, &av7110->dvb_adapter);
1336
1337        av7110->hw_frontend.source = DMX_FRONTEND_0;
1338
1339        ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &av7110->hw_frontend);
1340
1341        if (ret < 0)
1342                return ret;
1343
1344        av7110->mem_frontend.source = DMX_MEMORY_FE;
1345
1346        ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &av7110->mem_frontend);
1347
1348        if (ret < 0)
1349                return ret;
1350
1351        ret = dvbdemux->dmx.connect_frontend(&dvbdemux->dmx,
1352                                             &av7110->hw_frontend);
1353        if (ret < 0)
1354                return ret;
1355
1356        av7110_av_register(av7110);
1357        av7110_ca_register(av7110);
1358
1359#ifdef CONFIG_DVB_AV7110_OSD
1360        dvb_register_device(&av7110->dvb_adapter, &av7110->osd_dev,
1361                            &dvbdev_osd, av7110, DVB_DEVICE_OSD, 0);
1362#endif
1363
1364        dvb_net_init(&av7110->dvb_adapter, &av7110->dvb_net, &dvbdemux->dmx);
1365
1366        if (budgetpatch) {
1367                /* initialize software demux1 without its own frontend
1368                 * demux1 hardware is connected to frontend0 of demux0
1369                 */
1370                dvbdemux1->priv = (void *) av7110;
1371
1372                dvbdemux1->filternum = 256;
1373                dvbdemux1->feednum = 256;
1374                dvbdemux1->start_feed = budget_start_feed;
1375                dvbdemux1->stop_feed = budget_stop_feed;
1376                dvbdemux1->write_to_decoder = NULL;
1377
1378                dvbdemux1->dmx.capabilities = (DMX_TS_FILTERING | DMX_SECTION_FILTERING |
1379                                               DMX_MEMORY_BASED_FILTERING);
1380
1381                dvb_dmx_init(&av7110->demux1);
1382
1383                av7110->dmxdev1.filternum = 256;
1384                av7110->dmxdev1.demux = &dvbdemux1->dmx;
1385                av7110->dmxdev1.capabilities = 0;
1386
1387                dvb_dmxdev_init(&av7110->dmxdev1, &av7110->dvb_adapter);
1388
1389                dvb_net_init(&av7110->dvb_adapter, &av7110->dvb_net1, &dvbdemux1->dmx);
1390                printk("dvb-ttpci: additional demux1 for budget-patch registered\n");
1391        }
1392        return 0;
1393}
1394
1395
1396static void dvb_unregister(struct av7110 *av7110)
1397{
1398        struct dvb_demux *dvbdemux = &av7110->demux;
1399        struct dvb_demux *dvbdemux1 = &av7110->demux1;
1400
1401        dprintk(4, "%p\n", av7110);
1402
1403        if (!av7110->registered)
1404                return;
1405
1406        if (budgetpatch) {
1407                dvb_net_release(&av7110->dvb_net1);
1408                dvbdemux->dmx.close(&dvbdemux1->dmx);
1409                dvb_dmxdev_release(&av7110->dmxdev1);
1410                dvb_dmx_release(&av7110->demux1);
1411        }
1412
1413        dvb_net_release(&av7110->dvb_net);
1414
1415        dvbdemux->dmx.close(&dvbdemux->dmx);
1416        dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->hw_frontend);
1417        dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->mem_frontend);
1418
1419        dvb_dmxdev_release(&av7110->dmxdev);
1420        dvb_dmx_release(&av7110->demux);
1421
1422        if (av7110->fe != NULL) {
1423                dvb_unregister_frontend(av7110->fe);
1424                dvb_frontend_detach(av7110->fe);
1425        }
1426        dvb_unregister_device(av7110->osd_dev);
1427        av7110_av_unregister(av7110);
1428        av7110_ca_unregister(av7110);
1429}
1430
1431
1432/****************************************************************************
1433 * I2C client commands
1434 ****************************************************************************/
1435
1436int i2c_writereg(struct av7110 *av7110, u8 id, u8 reg, u8 val)
1437{
1438        u8 msg[2] = { reg, val };
1439        struct i2c_msg msgs;
1440
1441        msgs.flags = 0;
1442        msgs.addr = id / 2;
1443        msgs.len = 2;
1444        msgs.buf = msg;
1445        return i2c_transfer(&av7110->i2c_adap, &msgs, 1);
1446}
1447
1448u8 i2c_readreg(struct av7110 *av7110, u8 id, u8 reg)
1449{
1450        u8 mm1[] = {0x00};
1451        u8 mm2[] = {0x00};
1452        struct i2c_msg msgs[2];
1453
1454        msgs[0].flags = 0;
1455        msgs[1].flags = I2C_M_RD;
1456        msgs[0].addr = msgs[1].addr = id / 2;
1457        mm1[0] = reg;
1458        msgs[0].len = 1; msgs[1].len = 1;
1459        msgs[0].buf = mm1; msgs[1].buf = mm2;
1460        i2c_transfer(&av7110->i2c_adap, msgs, 2);
1461
1462        return mm2[0];
1463}
1464
1465/****************************************************************************
1466 * INITIALIZATION
1467 ****************************************************************************/
1468
1469
1470static int check_firmware(struct av7110* av7110)
1471{
1472        u32 crc = 0, len = 0;
1473        unsigned char *ptr;
1474
1475        /* check for firmware magic */
1476        ptr = av7110->bin_fw;
1477        if (ptr[0] != 'A' || ptr[1] != 'V' ||
1478            ptr[2] != 'F' || ptr[3] != 'W') {
1479                printk("dvb-ttpci: this is not an av7110 firmware\n");
1480                return -EINVAL;
1481        }
1482        ptr += 4;
1483
1484        /* check dpram file */
1485        crc = get_unaligned_be32(ptr);
1486        ptr += 4;
1487        len = get_unaligned_be32(ptr);
1488        ptr += 4;
1489        if (len >= 512) {
1490                printk("dvb-ttpci: dpram file is way too big.\n");
1491                return -EINVAL;
1492        }
1493        if (crc != crc32_le(0, ptr, len)) {
1494                printk("dvb-ttpci: crc32 of dpram file does not match.\n");
1495                return -EINVAL;
1496        }
1497        av7110->bin_dpram = ptr;
1498        av7110->size_dpram = len;
1499        ptr += len;
1500
1501        /* check root file */
1502        crc = get_unaligned_be32(ptr);
1503        ptr += 4;
1504        len = get_unaligned_be32(ptr);
1505        ptr += 4;
1506
1507        if (len <= 200000 || len >= 300000 ||
1508            len > ((av7110->bin_fw + av7110->size_fw) - ptr)) {
1509                printk("dvb-ttpci: root file has strange size (%d). aborting.\n", len);
1510                return -EINVAL;
1511        }
1512        if( crc != crc32_le(0, ptr, len)) {
1513                printk("dvb-ttpci: crc32 of root file does not match.\n");
1514                return -EINVAL;
1515        }
1516        av7110->bin_root = ptr;
1517        av7110->size_root = len;
1518        return 0;
1519}
1520
1521static void put_firmware(struct av7110* av7110)
1522{
1523        vfree(av7110->bin_fw);
1524}
1525
1526static int get_firmware(struct av7110* av7110)
1527{
1528        int ret;
1529        const struct firmware *fw;
1530
1531        /* request the av7110 firmware, this will block until someone uploads it */
1532        ret = request_firmware(&fw, "dvb-ttpci-01.fw", &av7110->dev->pci->dev);
1533        if (ret) {
1534                if (ret == -ENOENT) {
1535                        printk(KERN_ERR "dvb-ttpci: could not load firmware,"
1536                               " file not found: dvb-ttpci-01.fw\n");
1537                        printk(KERN_ERR "dvb-ttpci: usually this should be in "
1538                               "/usr/lib/hotplug/firmware or /lib/firmware\n");
1539                        printk(KERN_ERR "dvb-ttpci: and can be downloaded from"
1540                               " https://linuxtv.org/download/dvb/firmware/\n");
1541                } else
1542                        printk(KERN_ERR "dvb-ttpci: cannot request firmware"
1543                               " (error %i)\n", ret);
1544                return -EINVAL;
1545        }
1546
1547        if (fw->size <= 200000) {
1548                printk("dvb-ttpci: this firmware is way too small.\n");
1549                release_firmware(fw);
1550                return -EINVAL;
1551        }
1552
1553        /* check if the firmware is available */
1554        av7110->bin_fw = vmalloc(fw->size);
1555        if (NULL == av7110->bin_fw) {
1556                dprintk(1, "out of memory\n");
1557                release_firmware(fw);
1558                return -ENOMEM;
1559        }
1560
1561        memcpy(av7110->bin_fw, fw->data, fw->size);
1562        av7110->size_fw = fw->size;
1563        if ((ret = check_firmware(av7110)))
1564                vfree(av7110->bin_fw);
1565
1566        release_firmware(fw);
1567        return ret;
1568}
1569
1570static int alps_bsrv2_tuner_set_params(struct dvb_frontend *fe)
1571{
1572        struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1573        struct av7110* av7110 = fe->dvb->priv;
1574        u8 pwr = 0;
1575        u8 buf[4];
1576        struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) };
1577        u32 div = (p->frequency + 479500) / 125;
1578
1579        if (p->frequency > 2000000)
1580                pwr = 3;
1581        else if (p->frequency > 1800000)
1582                pwr = 2;
1583        else if (p->frequency > 1600000)
1584                pwr = 1;
1585        else if (p->frequency > 1200000)
1586                pwr = 0;
1587        else if (p->frequency >= 1100000)
1588                pwr = 1;
1589        else
1590                pwr = 2;
1591
1592        buf[0] = (div >> 8) & 0x7f;
1593        buf[1] = div & 0xff;
1594        buf[2] = ((div & 0x18000) >> 10) | 0x95;
1595        buf[3] = (pwr << 6) | 0x30;
1596
1597        // NOTE: since we're using a prescaler of 2, we set the
1598        // divisor frequency to 62.5kHz and divide by 125 above
1599
1600        if (fe->ops.i2c_gate_ctrl)
1601                fe->ops.i2c_gate_ctrl(fe, 1);
1602        if (i2c_transfer (&av7110->i2c_adap, &msg, 1) != 1)
1603                return -EIO;
1604        return 0;
1605}
1606
1607static struct ves1x93_config alps_bsrv2_config = {
1608        .demod_address = 0x08,
1609        .xin = 90100000UL,
1610        .invert_pwm = 0,
1611};
1612
1613static int alps_tdbe2_tuner_set_params(struct dvb_frontend *fe)
1614{
1615        struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1616        struct av7110* av7110 = fe->dvb->priv;
1617        u32 div;
1618        u8 data[4];
1619        struct i2c_msg msg = { .addr = 0x62, .flags = 0, .buf = data, .len = sizeof(data) };
1620
1621        div = (p->frequency + 35937500 + 31250) / 62500;
1622
1623        data[0] = (div >> 8) & 0x7f;
1624        data[1] = div & 0xff;
1625        data[2] = 0x85 | ((div >> 10) & 0x60);
1626        data[3] = (p->frequency < 174000000 ? 0x88 : p->frequency < 470000000 ? 0x84 : 0x81);
1627
1628        if (fe->ops.i2c_gate_ctrl)
1629                fe->ops.i2c_gate_ctrl(fe, 1);
1630        if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1)
1631                return -EIO;
1632        return 0;
1633}
1634
1635static struct ves1820_config alps_tdbe2_config = {
1636        .demod_address = 0x09,
1637        .xin = 57840000UL,
1638        .invert = 1,
1639        .selagc = VES1820_SELAGC_SIGNAMPERR,
1640};
1641
1642
1643
1644
1645static int grundig_29504_451_tuner_set_params(struct dvb_frontend *fe)
1646{
1647        struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1648        struct av7110* av7110 = fe->dvb->priv;
1649        u32 div;
1650        u8 data[4];
1651        struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) };
1652
1653        div = p->frequency / 125;
1654        data[0] = (div >> 8) & 0x7f;
1655        data[1] = div & 0xff;
1656        data[2] = 0x8e;
1657        data[3] = 0x00;
1658
1659        if (fe->ops.i2c_gate_ctrl)
1660                fe->ops.i2c_gate_ctrl(fe, 1);
1661        if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1)
1662                return -EIO;
1663        return 0;
1664}
1665
1666static struct tda8083_config grundig_29504_451_config = {
1667        .demod_address = 0x68,
1668};
1669
1670
1671
1672static int philips_cd1516_tuner_set_params(struct dvb_frontend *fe)
1673{
1674        struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1675        struct av7110* av7110 = fe->dvb->priv;
1676        u32 div;
1677        u32 f = p->frequency;
1678        u8 data[4];
1679        struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) };
1680
1681        div = (f + 36125000 + 31250) / 62500;
1682
1683        data[0] = (div >> 8) & 0x7f;
1684        data[1] = div & 0xff;
1685        data[2] = 0x8e;
1686        data[3] = (f < 174000000 ? 0xa1 : f < 470000000 ? 0x92 : 0x34);
1687
1688        if (fe->ops.i2c_gate_ctrl)
1689                fe->ops.i2c_gate_ctrl(fe, 1);
1690        if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1)
1691                return -EIO;
1692        return 0;
1693}
1694
1695static struct ves1820_config philips_cd1516_config = {
1696        .demod_address = 0x09,
1697        .xin = 57840000UL,
1698        .invert = 1,
1699        .selagc = VES1820_SELAGC_SIGNAMPERR,
1700};
1701
1702
1703
1704static int alps_tdlb7_tuner_set_params(struct dvb_frontend *fe)
1705{
1706        struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1707        struct av7110* av7110 = fe->dvb->priv;
1708        u32 div, pwr;
1709        u8 data[4];
1710        struct i2c_msg msg = { .addr = 0x60, .flags = 0, .buf = data, .len = sizeof(data) };
1711
1712        div = (p->frequency + 36200000) / 166666;
1713
1714        if (p->frequency <= 782000000)
1715                pwr = 1;
1716        else
1717                pwr = 2;
1718
1719        data[0] = (div >> 8) & 0x7f;
1720        data[1] = div & 0xff;
1721        data[2] = 0x85;
1722        data[3] = pwr << 6;
1723
1724        if (fe->ops.i2c_gate_ctrl)
1725                fe->ops.i2c_gate_ctrl(fe, 1);
1726        if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1)
1727                return -EIO;
1728        return 0;
1729}
1730
1731static int alps_tdlb7_request_firmware(struct dvb_frontend* fe, const struct firmware **fw, char* name)
1732{
1733#if IS_ENABLED(CONFIG_DVB_SP8870)
1734        struct av7110* av7110 = fe->dvb->priv;
1735
1736        return request_firmware(fw, name, &av7110->dev->pci->dev);
1737#else
1738        return -EINVAL;
1739#endif
1740}
1741
1742static struct sp8870_config alps_tdlb7_config = {
1743
1744        .demod_address = 0x71,
1745        .request_firmware = alps_tdlb7_request_firmware,
1746};
1747
1748
1749static u8 nexusca_stv0297_inittab[] = {
1750        0x80, 0x01,
1751        0x80, 0x00,
1752        0x81, 0x01,
1753        0x81, 0x00,
1754        0x00, 0x09,
1755        0x01, 0x69,
1756        0x03, 0x00,
1757        0x04, 0x00,
1758        0x07, 0x00,
1759        0x08, 0x00,
1760        0x20, 0x00,
1761        0x21, 0x40,
1762        0x22, 0x00,
1763        0x23, 0x00,
1764        0x24, 0x40,
1765        0x25, 0x88,
1766        0x30, 0xff,
1767        0x31, 0x00,
1768        0x32, 0xff,
1769        0x33, 0x00,
1770        0x34, 0x50,
1771        0x35, 0x7f,
1772        0x36, 0x00,
1773        0x37, 0x20,
1774        0x38, 0x00,
1775        0x40, 0x1c,
1776        0x41, 0xff,
1777        0x42, 0x29,
1778        0x43, 0x00,
1779        0x44, 0xff,
1780        0x45, 0x00,
1781        0x46, 0x00,
1782        0x49, 0x04,
1783        0x4a, 0x00,
1784        0x4b, 0x7b,
1785        0x52, 0x30,
1786        0x55, 0xae,
1787        0x56, 0x47,
1788        0x57, 0xe1,
1789        0x58, 0x3a,
1790        0x5a, 0x1e,
1791        0x5b, 0x34,
1792        0x60, 0x00,
1793        0x63, 0x00,
1794        0x64, 0x00,
1795        0x65, 0x00,
1796        0x66, 0x00,
1797        0x67, 0x00,
1798        0x68, 0x00,
1799        0x69, 0x00,
1800        0x6a, 0x02,
1801        0x6b, 0x00,
1802        0x70, 0xff,
1803        0x71, 0x00,
1804        0x72, 0x00,
1805        0x73, 0x00,
1806        0x74, 0x0c,
1807        0x80, 0x00,
1808        0x81, 0x00,
1809        0x82, 0x00,
1810        0x83, 0x00,
1811        0x84, 0x04,
1812        0x85, 0x80,
1813        0x86, 0x24,
1814        0x87, 0x78,
1815        0x88, 0x10,
1816        0x89, 0x00,
1817        0x90, 0x01,
1818        0x91, 0x01,
1819        0xa0, 0x04,
1820        0xa1, 0x00,
1821        0xa2, 0x00,
1822        0xb0, 0x91,
1823        0xb1, 0x0b,
1824        0xc0, 0x53,
1825        0xc1, 0x70,
1826        0xc2, 0x12,
1827        0xd0, 0x00,
1828        0xd1, 0x00,
1829        0xd2, 0x00,
1830        0xd3, 0x00,
1831        0xd4, 0x00,
1832        0xd5, 0x00,
1833        0xde, 0x00,
1834        0xdf, 0x00,
1835        0x61, 0x49,
1836        0x62, 0x0b,
1837        0x53, 0x08,
1838        0x59, 0x08,
1839        0xff, 0xff,
1840};
1841
1842static int nexusca_stv0297_tuner_set_params(struct dvb_frontend *fe)
1843{
1844        struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1845        struct av7110* av7110 = fe->dvb->priv;
1846        u32 div;
1847        u8 data[4];
1848        struct i2c_msg msg = { .addr = 0x63, .flags = 0, .buf = data, .len = sizeof(data) };
1849        struct i2c_msg readmsg = { .addr = 0x63, .flags = I2C_M_RD, .buf = data, .len = 1 };
1850        int i;
1851
1852        div = (p->frequency + 36150000 + 31250) / 62500;
1853
1854        data[0] = (div >> 8) & 0x7f;
1855        data[1] = div & 0xff;
1856        data[2] = 0xce;
1857
1858        if (p->frequency < 45000000)
1859                return -EINVAL;
1860        else if (p->frequency < 137000000)
1861                data[3] = 0x01;
1862        else if (p->frequency < 403000000)
1863                data[3] = 0x02;
1864        else if (p->frequency < 860000000)
1865                data[3] = 0x04;
1866        else
1867                return -EINVAL;
1868
1869        if (fe->ops.i2c_gate_ctrl)
1870                fe->ops.i2c_gate_ctrl(fe, 1);
1871        if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1) {
1872                printk("nexusca: pll transfer failed!\n");
1873                return -EIO;
1874        }
1875
1876        // wait for PLL lock
1877        for(i = 0; i < 20; i++) {
1878                if (fe->ops.i2c_gate_ctrl)
1879                        fe->ops.i2c_gate_ctrl(fe, 1);
1880                if (i2c_transfer(&av7110->i2c_adap, &readmsg, 1) == 1)
1881                        if (data[0] & 0x40) break;
1882                msleep(10);
1883        }
1884
1885        return 0;
1886}
1887
1888static struct stv0297_config nexusca_stv0297_config = {
1889
1890        .demod_address = 0x1C,
1891        .inittab = nexusca_stv0297_inittab,
1892        .invert = 1,
1893        .stop_during_read = 1,
1894};
1895
1896
1897
1898static int grundig_29504_401_tuner_set_params(struct dvb_frontend *fe)
1899{
1900        struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1901        struct av7110* av7110 = fe->dvb->priv;
1902        u32 div;
1903        u8 cfg, cpump, band_select;
1904        u8 data[4];
1905        struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) };
1906
1907        div = (36125000 + p->frequency) / 166666;
1908
1909        cfg = 0x88;
1910
1911        if (p->frequency < 175000000)
1912                cpump = 2;
1913        else if (p->frequency < 390000000)
1914                cpump = 1;
1915        else if (p->frequency < 470000000)
1916                cpump = 2;
1917        else if (p->frequency < 750000000)
1918                cpump = 1;
1919        else
1920                cpump = 3;
1921
1922        if (p->frequency < 175000000)
1923                band_select = 0x0e;
1924        else if (p->frequency < 470000000)
1925                band_select = 0x05;
1926        else
1927                band_select = 0x03;
1928
1929        data[0] = (div >> 8) & 0x7f;
1930        data[1] = div & 0xff;
1931        data[2] = ((div >> 10) & 0x60) | cfg;
1932        data[3] = (cpump << 6) | band_select;
1933
1934        if (fe->ops.i2c_gate_ctrl)
1935                fe->ops.i2c_gate_ctrl(fe, 1);
1936        if (i2c_transfer (&av7110->i2c_adap, &msg, 1) != 1) return -EIO;
1937        return 0;
1938}
1939
1940static struct l64781_config grundig_29504_401_config = {
1941        .demod_address = 0x55,
1942};
1943
1944
1945
1946static int av7110_fe_lock_fix(struct av7110 *av7110, enum fe_status status)
1947{
1948        int ret = 0;
1949        int synced = (status & FE_HAS_LOCK) ? 1 : 0;
1950
1951        av7110->fe_status = status;
1952
1953        if (av7110->fe_synced == synced)
1954                return 0;
1955
1956        if (av7110->playing) {
1957                av7110->fe_synced = synced;
1958                return 0;
1959        }
1960
1961        if (mutex_lock_interruptible(&av7110->pid_mutex))
1962                return -ERESTARTSYS;
1963
1964        if (synced) {
1965                ret = SetPIDs(av7110, av7110->pids[DMX_PES_VIDEO],
1966                        av7110->pids[DMX_PES_AUDIO],
1967                        av7110->pids[DMX_PES_TELETEXT], 0,
1968                        av7110->pids[DMX_PES_PCR]);
1969                if (!ret)
1970                        ret = av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, Scan, 0);
1971        } else {
1972                ret = SetPIDs(av7110, 0, 0, 0, 0, 0);
1973                if (!ret) {
1974                        ret = av7110_fw_cmd(av7110, COMTYPE_PID_FILTER, FlushTSQueue, 0);
1975                        if (!ret)
1976                                ret = av7110_wait_msgstate(av7110, GPMQBusy);
1977                }
1978        }
1979
1980        if (!ret)
1981                av7110->fe_synced = synced;
1982
1983        mutex_unlock(&av7110->pid_mutex);
1984        return ret;
1985}
1986
1987static int av7110_fe_set_frontend(struct dvb_frontend *fe)
1988{
1989        struct av7110* av7110 = fe->dvb->priv;
1990
1991        int ret = av7110_fe_lock_fix(av7110, 0);
1992        if (!ret)
1993                ret = av7110->fe_set_frontend(fe);
1994
1995        return ret;
1996}
1997
1998static int av7110_fe_init(struct dvb_frontend* fe)
1999{
2000        struct av7110* av7110 = fe->dvb->priv;
2001
2002        int ret = av7110_fe_lock_fix(av7110, 0);
2003        if (!ret)
2004                ret = av7110->fe_init(fe);
2005        return ret;
2006}
2007
2008static int av7110_fe_read_status(struct dvb_frontend *fe,
2009                                 enum fe_status *status)
2010{
2011        struct av7110* av7110 = fe->dvb->priv;
2012
2013        /* call the real implementation */
2014        int ret = av7110->fe_read_status(fe, status);
2015        if (!ret)
2016                if (((*status ^ av7110->fe_status) & FE_HAS_LOCK) && (*status & FE_HAS_LOCK))
2017                        ret = av7110_fe_lock_fix(av7110, *status);
2018        return ret;
2019}
2020
2021static int av7110_fe_diseqc_reset_overload(struct dvb_frontend* fe)
2022{
2023        struct av7110* av7110 = fe->dvb->priv;
2024
2025        int ret = av7110_fe_lock_fix(av7110, 0);
2026        if (!ret)
2027                ret = av7110->fe_diseqc_reset_overload(fe);
2028        return ret;
2029}
2030
2031static int av7110_fe_diseqc_send_master_cmd(struct dvb_frontend* fe,
2032                                            struct dvb_diseqc_master_cmd* cmd)
2033{
2034        struct av7110* av7110 = fe->dvb->priv;
2035
2036        int ret = av7110_fe_lock_fix(av7110, 0);
2037        if (!ret) {
2038                av7110->saved_master_cmd = *cmd;
2039                ret = av7110->fe_diseqc_send_master_cmd(fe, cmd);
2040        }
2041        return ret;
2042}
2043
2044static int av7110_fe_diseqc_send_burst(struct dvb_frontend *fe,
2045                                       enum fe_sec_mini_cmd minicmd)
2046{
2047        struct av7110* av7110 = fe->dvb->priv;
2048
2049        int ret = av7110_fe_lock_fix(av7110, 0);
2050        if (!ret) {
2051                av7110->saved_minicmd = minicmd;
2052                ret = av7110->fe_diseqc_send_burst(fe, minicmd);
2053        }
2054        return ret;
2055}
2056
2057static int av7110_fe_set_tone(struct dvb_frontend *fe,
2058                              enum fe_sec_tone_mode tone)
2059{
2060        struct av7110* av7110 = fe->dvb->priv;
2061
2062        int ret = av7110_fe_lock_fix(av7110, 0);
2063        if (!ret) {
2064                av7110->saved_tone = tone;
2065                ret = av7110->fe_set_tone(fe, tone);
2066        }
2067        return ret;
2068}
2069
2070static int av7110_fe_set_voltage(struct dvb_frontend *fe,
2071                                 enum fe_sec_voltage voltage)
2072{
2073        struct av7110* av7110 = fe->dvb->priv;
2074
2075        int ret = av7110_fe_lock_fix(av7110, 0);
2076        if (!ret) {
2077                av7110->saved_voltage = voltage;
2078                ret = av7110->fe_set_voltage(fe, voltage);
2079        }
2080        return ret;
2081}
2082
2083static int av7110_fe_dishnetwork_send_legacy_command(struct dvb_frontend* fe, unsigned long cmd)
2084{
2085        struct av7110* av7110 = fe->dvb->priv;
2086
2087        int ret = av7110_fe_lock_fix(av7110, 0);
2088        if (!ret)
2089                ret = av7110->fe_dishnetwork_send_legacy_command(fe, cmd);
2090        return ret;
2091}
2092
2093static void dvb_s_recover(struct av7110* av7110)
2094{
2095        av7110_fe_init(av7110->fe);
2096
2097        av7110_fe_set_voltage(av7110->fe, av7110->saved_voltage);
2098        if (av7110->saved_master_cmd.msg_len) {
2099                msleep(20);
2100                av7110_fe_diseqc_send_master_cmd(av7110->fe, &av7110->saved_master_cmd);
2101        }
2102        msleep(20);
2103        av7110_fe_diseqc_send_burst(av7110->fe, av7110->saved_minicmd);
2104        msleep(20);
2105        av7110_fe_set_tone(av7110->fe, av7110->saved_tone);
2106
2107        av7110_fe_set_frontend(av7110->fe);
2108}
2109
2110static u8 read_pwm(struct av7110* av7110)
2111{
2112        u8 b = 0xff;
2113        u8 pwm;
2114        struct i2c_msg msg[] = { { .addr = 0x50,.flags = 0,.buf = &b,.len = 1 },
2115                                 { .addr = 0x50,.flags = I2C_M_RD,.buf = &pwm,.len = 1} };
2116
2117        if ((i2c_transfer(&av7110->i2c_adap, msg, 2) != 2) || (pwm == 0xff))
2118                pwm = 0x48;
2119
2120        return pwm;
2121}
2122
2123static int frontend_init(struct av7110 *av7110)
2124{
2125        int ret;
2126
2127        if (av7110->dev->pci->subsystem_vendor == 0x110a) {
2128                switch(av7110->dev->pci->subsystem_device) {
2129                case 0x0000: // Fujitsu/Siemens DVB-Cable (ves1820/Philips CD1516(??))
2130                        av7110->fe = dvb_attach(ves1820_attach, &philips_cd1516_config,
2131                                                    &av7110->i2c_adap, read_pwm(av7110));
2132                        if (av7110->fe) {
2133                                av7110->fe->ops.tuner_ops.set_params = philips_cd1516_tuner_set_params;
2134                        }
2135                        break;
2136                }
2137
2138        } else if (av7110->dev->pci->subsystem_vendor == 0x13c2) {
2139                switch(av7110->dev->pci->subsystem_device) {
2140                case 0x0000: // Hauppauge/TT WinTV DVB-S rev1.X
2141                case 0x0003: // Hauppauge/TT WinTV Nexus-S Rev 2.X
2142                case 0x1002: // Hauppauge/TT WinTV DVB-S rev1.3SE
2143
2144                        // try the ALPS BSRV2 first of all
2145                        av7110->fe = dvb_attach(ves1x93_attach, &alps_bsrv2_config, &av7110->i2c_adap);
2146                        if (av7110->fe) {
2147                                av7110->fe->ops.tuner_ops.set_params = alps_bsrv2_tuner_set_params;
2148                                av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd;
2149                                av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst;
2150                                av7110->fe->ops.set_tone = av7110_set_tone;
2151                                av7110->recover = dvb_s_recover;
2152                                break;
2153                        }
2154
2155                        // try the ALPS BSRU6 now
2156                        av7110->fe = dvb_attach(stv0299_attach, &alps_bsru6_config, &av7110->i2c_adap);
2157                        if (av7110->fe) {
2158                                av7110->fe->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params;
2159                                av7110->fe->tuner_priv = &av7110->i2c_adap;
2160
2161                                av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd;
2162                                av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst;
2163                                av7110->fe->ops.set_tone = av7110_set_tone;
2164                                av7110->recover = dvb_s_recover;
2165                                break;
2166                        }
2167
2168                        // Try the grundig 29504-451
2169                        av7110->fe = dvb_attach(tda8083_attach, &grundig_29504_451_config, &av7110->i2c_adap);
2170                        if (av7110->fe) {
2171                                av7110->fe->ops.tuner_ops.set_params = grundig_29504_451_tuner_set_params;
2172                                av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd;
2173                                av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst;
2174                                av7110->fe->ops.set_tone = av7110_set_tone;
2175                                av7110->recover = dvb_s_recover;
2176                                break;
2177                        }
2178
2179                        /* Try DVB-C cards */
2180                        switch(av7110->dev->pci->subsystem_device) {
2181                        case 0x0000:
2182                                /* Siemens DVB-C (full-length card) VES1820/Philips CD1516 */
2183                                av7110->fe = dvb_attach(ves1820_attach, &philips_cd1516_config, &av7110->i2c_adap,
2184                                                        read_pwm(av7110));
2185                                if (av7110->fe) {
2186                                        av7110->fe->ops.tuner_ops.set_params = philips_cd1516_tuner_set_params;
2187                                }
2188                                break;
2189                        case 0x0003:
2190                                /* Hauppauge DVB-C 2.1 VES1820/ALPS TDBE2 */
2191                                av7110->fe = dvb_attach(ves1820_attach, &alps_tdbe2_config, &av7110->i2c_adap,
2192                                                        read_pwm(av7110));
2193                                if (av7110->fe) {
2194                                        av7110->fe->ops.tuner_ops.set_params = alps_tdbe2_tuner_set_params;
2195                                }
2196                                break;
2197                        }
2198                        break;
2199
2200                case 0x0001: // Hauppauge/TT Nexus-T premium rev1.X
2201                        // try ALPS TDLB7 first, then Grundig 29504-401
2202                        av7110->fe = dvb_attach(sp8870_attach, &alps_tdlb7_config, &av7110->i2c_adap);
2203                        if (av7110->fe) {
2204                                av7110->fe->ops.tuner_ops.set_params = alps_tdlb7_tuner_set_params;
2205                                break;
2206                        }
2207                        /* fall-thru */
2208
2209                case 0x0008: // Hauppauge/TT DVB-T
2210                        // Grundig 29504-401
2211                        av7110->fe = dvb_attach(l64781_attach, &grundig_29504_401_config, &av7110->i2c_adap);
2212                        if (av7110->fe)
2213                                av7110->fe->ops.tuner_ops.set_params = grundig_29504_401_tuner_set_params;
2214                        break;
2215
2216                case 0x0002: // Hauppauge/TT DVB-C premium rev2.X
2217
2218                        av7110->fe = dvb_attach(ves1820_attach, &alps_tdbe2_config, &av7110->i2c_adap, read_pwm(av7110));
2219                        if (av7110->fe) {
2220                                av7110->fe->ops.tuner_ops.set_params = alps_tdbe2_tuner_set_params;
2221                        }
2222                        break;
2223
2224                case 0x0004: // Galaxis DVB-S rev1.3
2225                        /* ALPS BSRV2 */
2226                        av7110->fe = dvb_attach(ves1x93_attach, &alps_bsrv2_config, &av7110->i2c_adap);
2227                        if (av7110->fe) {
2228                                av7110->fe->ops.tuner_ops.set_params = alps_bsrv2_tuner_set_params;
2229                                av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd;
2230                                av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst;
2231                                av7110->fe->ops.set_tone = av7110_set_tone;
2232                                av7110->recover = dvb_s_recover;
2233                        }
2234                        break;
2235
2236                case 0x0006: /* Fujitsu-Siemens DVB-S rev 1.6 */
2237                        /* Grundig 29504-451 */
2238                        av7110->fe = dvb_attach(tda8083_attach, &grundig_29504_451_config, &av7110->i2c_adap);
2239                        if (av7110->fe) {
2240                                av7110->fe->ops.tuner_ops.set_params = grundig_29504_451_tuner_set_params;
2241                                av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd;
2242                                av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst;
2243                                av7110->fe->ops.set_tone = av7110_set_tone;
2244                                av7110->recover = dvb_s_recover;
2245                        }
2246                        break;
2247
2248                case 0x000A: // Hauppauge/TT Nexus-CA rev1.X
2249
2250                        av7110->fe = dvb_attach(stv0297_attach, &nexusca_stv0297_config, &av7110->i2c_adap);
2251                        if (av7110->fe) {
2252                                av7110->fe->ops.tuner_ops.set_params = nexusca_stv0297_tuner_set_params;
2253
2254                                /* set TDA9819 into DVB mode */
2255                                saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD)
2256                                saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF)
2257
2258                                /* tuner on this needs a slower i2c bus speed */
2259                                av7110->dev->i2c_bitrate = SAA7146_I2C_BUS_BIT_RATE_240;
2260                                break;
2261                        }
2262                        break;
2263
2264                case 0x000E: /* Hauppauge/TT Nexus-S rev 2.3 */
2265                        /* ALPS BSBE1 */
2266                        av7110->fe = dvb_attach(stv0299_attach, &alps_bsbe1_config, &av7110->i2c_adap);
2267                        if (av7110->fe) {
2268                                av7110->fe->ops.tuner_ops.set_params = alps_bsbe1_tuner_set_params;
2269                                av7110->fe->tuner_priv = &av7110->i2c_adap;
2270
2271                                if (dvb_attach(lnbp21_attach, av7110->fe, &av7110->i2c_adap, 0, 0) == NULL) {
2272                                        printk("dvb-ttpci: LNBP21 not found!\n");
2273                                        if (av7110->fe->ops.release)
2274                                                av7110->fe->ops.release(av7110->fe);
2275                                        av7110->fe = NULL;
2276                                } else {
2277                                        av7110->fe->ops.dishnetwork_send_legacy_command = NULL;
2278                                        av7110->recover = dvb_s_recover;
2279                                }
2280                        }
2281                        break;
2282                }
2283        }
2284
2285        if (!av7110->fe) {
2286                /* FIXME: propagate the failure code from the lower layers */
2287                ret = -ENOMEM;
2288                printk("dvb-ttpci: A frontend driver was not found for device [%04x:%04x] subsystem [%04x:%04x]\n",
2289                       av7110->dev->pci->vendor,
2290                       av7110->dev->pci->device,
2291                       av7110->dev->pci->subsystem_vendor,
2292                       av7110->dev->pci->subsystem_device);
2293        } else {
2294                FE_FUNC_OVERRIDE(av7110->fe->ops.init, av7110->fe_init, av7110_fe_init);
2295                FE_FUNC_OVERRIDE(av7110->fe->ops.read_status, av7110->fe_read_status, av7110_fe_read_status);
2296                FE_FUNC_OVERRIDE(av7110->fe->ops.diseqc_reset_overload, av7110->fe_diseqc_reset_overload, av7110_fe_diseqc_reset_overload);
2297                FE_FUNC_OVERRIDE(av7110->fe->ops.diseqc_send_master_cmd, av7110->fe_diseqc_send_master_cmd, av7110_fe_diseqc_send_master_cmd);
2298                FE_FUNC_OVERRIDE(av7110->fe->ops.diseqc_send_burst, av7110->fe_diseqc_send_burst, av7110_fe_diseqc_send_burst);
2299                FE_FUNC_OVERRIDE(av7110->fe->ops.set_tone, av7110->fe_set_tone, av7110_fe_set_tone);
2300                FE_FUNC_OVERRIDE(av7110->fe->ops.set_voltage, av7110->fe_set_voltage, av7110_fe_set_voltage);
2301                FE_FUNC_OVERRIDE(av7110->fe->ops.dishnetwork_send_legacy_command, av7110->fe_dishnetwork_send_legacy_command, av7110_fe_dishnetwork_send_legacy_command);
2302                FE_FUNC_OVERRIDE(av7110->fe->ops.set_frontend, av7110->fe_set_frontend, av7110_fe_set_frontend);
2303
2304                ret = dvb_register_frontend(&av7110->dvb_adapter, av7110->fe);
2305                if (ret < 0) {
2306                        printk("av7110: Frontend registration failed!\n");
2307                        dvb_frontend_detach(av7110->fe);
2308                        av7110->fe = NULL;
2309                }
2310        }
2311        return ret;
2312}
2313
2314/* Budgetpatch note:
2315 * Original hardware design by Roberto Deza:
2316 * There is a DVB_Wiki at
2317 * https://linuxtv.org
2318 *
2319 * New software triggering design by Emard that works on
2320 * original Roberto Deza's hardware:
2321 *
2322 * rps1 code for budgetpatch will copy internal HS event to GPIO3 pin.
2323 * GPIO3 is in budget-patch hardware connectd to port B VSYNC
2324 * HS is an internal event of 7146, accessible with RPS
2325 * and temporarily raised high every n lines
2326 * (n in defined in the RPS_THRESH1 counter threshold)
2327 * I think HS is raised high on the beginning of the n-th line
2328 * and remains high until this n-th line that triggered
2329 * it is completely received. When the receiption of n-th line
2330 * ends, HS is lowered.
2331 *
2332 * To transmit data over DMA, 7146 needs changing state at
2333 * port B VSYNC pin. Any changing of port B VSYNC will
2334 * cause some DMA data transfer, with more or less packets loss.
2335 * It depends on the phase and frequency of VSYNC and
2336 * the way of 7146 is instructed to trigger on port B (defined
2337 * in DD1_INIT register, 3rd nibble from the right valid
2338 * numbers are 0-7, see datasheet)
2339 *
2340 * The correct triggering can minimize packet loss,
2341 * dvbtraffic should give this stable bandwidths:
2342 *   22k transponder = 33814 kbit/s
2343 * 27.5k transponder = 38045 kbit/s
2344 * by experiment it is found that the best results
2345 * (stable bandwidths and almost no packet loss)
2346 * are obtained using DD1_INIT triggering number 2
2347 * (Va at rising edge of VS Fa = HS x VS-failing forced toggle)
2348 * and a VSYNC phase that occurs in the middle of DMA transfer
2349 * (about byte 188*512=96256 in the DMA window).
2350 *
2351 * Phase of HS is still not clear to me how to control,
2352 * It just happens to be so. It can be seen if one enables
2353 * RPS_IRQ and print Event Counter 1 in vpeirq(). Every
2354 * time RPS_INTERRUPT is called, the Event Counter 1 will
2355 * increment. That's how the 7146 is programmed to do event
2356 * counting in this budget-patch.c
2357 * I *think* HPS setting has something to do with the phase
2358 * of HS but I can't be 100% sure in that.
2359 *
2360 * hardware debug note: a working budget card (including budget patch)
2361 * with vpeirq() interrupt setup in mode "0x90" (every 64K) will
2362 * generate 3 interrupts per 25-Hz DMA frame of 2*188*512 bytes
2363 * and that means 3*25=75 Hz of interrupt freqency, as seen by
2364 * watch cat /proc/interrupts
2365 *
2366 * If this frequency is 3x lower (and data received in the DMA
2367 * buffer don't start with 0x47, but in the middle of packets,
2368 * whose lengths appear to be like 188 292 188 104 etc.
2369 * this means VSYNC line is not connected in the hardware.
2370 * (check soldering pcb and pins)
2371 * The same behaviour of missing VSYNC can be duplicated on budget
2372 * cards, by seting DD1_INIT trigger mode 7 in 3rd nibble.
2373 */
2374static int av7110_attach(struct saa7146_dev* dev,
2375                         struct saa7146_pci_extension_data *pci_ext)
2376{
2377        const int length = TS_WIDTH * TS_HEIGHT;
2378        struct pci_dev *pdev = dev->pci;
2379        struct av7110 *av7110;
2380        struct task_struct *thread;
2381        int ret, count = 0;
2382
2383        dprintk(4, "dev: %p\n", dev);
2384
2385        /* Set RPS_IRQ to 1 to track rps1 activity.
2386         * Enabling this won't send any interrupt to PC CPU.
2387         */
2388#define RPS_IRQ 0
2389
2390        if (budgetpatch == 1) {
2391                budgetpatch = 0;
2392                /* autodetect the presence of budget patch
2393                 * this only works if saa7146 has been recently
2394                 * reset with with MASK_31 to MC1
2395                 *
2396                 * will wait for VBI_B event (vertical blank at port B)
2397                 * and will reset GPIO3 after VBI_B is detected.
2398                 * (GPIO3 should be raised high by CPU to
2399                 * test if GPIO3 will generate vertical blank signal
2400                 * in budget patch GPIO3 is connected to VSYNC_B
2401                 */
2402
2403                /* RESET SAA7146 */
2404                saa7146_write(dev, MC1, MASK_31);
2405                /* autodetection success seems to be time-dependend after reset */
2406
2407                /* Fix VSYNC level */
2408                saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
2409                /* set vsync_b triggering */
2410                saa7146_write(dev, DD1_STREAM_B, 0);
2411                /* port B VSYNC at rising edge */
2412                saa7146_write(dev, DD1_INIT, 0x00000200);
2413                saa7146_write(dev, BRS_CTRL, 0x00000000);  // VBI
2414                saa7146_write(dev, MC2,
2415                              1 * (MASK_08 | MASK_24)  |   // BRS control
2416                              0 * (MASK_09 | MASK_25)  |   // a
2417                              1 * (MASK_10 | MASK_26)  |   // b
2418                              0 * (MASK_06 | MASK_22)  |   // HPS_CTRL1
2419                              0 * (MASK_05 | MASK_21)  |   // HPS_CTRL2
2420                              0 * (MASK_01 | MASK_15)      // DEBI
2421                );
2422
2423                /* start writing RPS1 code from beginning */
2424                count = 0;
2425                /* Disable RPS1 */
2426                saa7146_write(dev, MC1, MASK_29);
2427                /* RPS1 timeout disable */
2428                saa7146_write(dev, RPS_TOV1, 0);
2429                WRITE_RPS1(CMD_PAUSE | EVT_VBI_B);
2430                WRITE_RPS1(CMD_WR_REG_MASK | (GPIO_CTRL>>2));
2431                WRITE_RPS1(GPIO3_MSK);
2432                WRITE_RPS1(SAA7146_GPIO_OUTLO<<24);
2433#if RPS_IRQ
2434                /* issue RPS1 interrupt to increment counter */
2435                WRITE_RPS1(CMD_INTERRUPT);
2436#endif
2437                WRITE_RPS1(CMD_STOP);
2438                /* Jump to begin of RPS program as safety measure               (p37) */
2439                WRITE_RPS1(CMD_JUMP);
2440                WRITE_RPS1(dev->d_rps1.dma_handle);
2441
2442#if RPS_IRQ
2443                /* set event counter 1 source as RPS1 interrupt (0x03)          (rE4 p53)
2444                 * use 0x03 to track RPS1 interrupts - increase by 1 every gpio3 is toggled
2445                 * use 0x15 to track VPE  interrupts - increase by 1 every vpeirq() is called
2446                 */
2447                saa7146_write(dev, EC1SSR, (0x03<<2) | 3 );
2448                /* set event counter 1 threshold to maximum allowed value        (rEC p55) */
2449                saa7146_write(dev, ECT1R,  0x3fff );
2450#endif
2451                /* Set RPS1 Address register to point to RPS code               (r108 p42) */
2452                saa7146_write(dev, RPS_ADDR1, dev->d_rps1.dma_handle);
2453                /* Enable RPS1,                                                 (rFC p33) */
2454                saa7146_write(dev, MC1, (MASK_13 | MASK_29 ));
2455
2456                mdelay(10);
2457                /* now send VSYNC_B to rps1 by rising GPIO3 */
2458                saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI);
2459                mdelay(10);
2460                /* if rps1 responded by lowering the GPIO3,
2461                 * then we have budgetpatch hardware
2462                 */
2463                if ((saa7146_read(dev, GPIO_CTRL) & 0x10000000) == 0) {
2464                        budgetpatch = 1;
2465                        printk("dvb-ttpci: BUDGET-PATCH DETECTED.\n");
2466                }
2467                /* Disable RPS1 */
2468                saa7146_write(dev, MC1, ( MASK_29 ));
2469#if RPS_IRQ
2470                printk("dvb-ttpci: Event Counter 1 0x%04x\n", saa7146_read(dev, EC1R) & 0x3fff );
2471#endif
2472        }
2473
2474        /* prepare the av7110 device struct */
2475        av7110 = kzalloc(sizeof(struct av7110), GFP_KERNEL);
2476        if (!av7110) {
2477                dprintk(1, "out of memory\n");
2478                return -ENOMEM;
2479        }
2480
2481        av7110->card_name = (char*) pci_ext->ext_priv;
2482        av7110->dev = dev;
2483        dev->ext_priv = av7110;
2484
2485        ret = get_firmware(av7110);
2486        if (ret < 0)
2487                goto err_kfree_0;
2488
2489        ret = dvb_register_adapter(&av7110->dvb_adapter, av7110->card_name,
2490                                   THIS_MODULE, &dev->pci->dev, adapter_nr);
2491        if (ret < 0)
2492                goto err_put_firmware_1;
2493
2494        /* the Siemens DVB needs this if you want to have the i2c chips
2495           get recognized before the main driver is fully loaded */
2496        saa7146_write(dev, GPIO_CTRL, 0x500000);
2497
2498        strlcpy(av7110->i2c_adap.name, pci_ext->ext_priv, sizeof(av7110->i2c_adap.name));
2499
2500        saa7146_i2c_adapter_prepare(dev, &av7110->i2c_adap, SAA7146_I2C_BUS_BIT_RATE_120); /* 275 kHz */
2501
2502        ret = i2c_add_adapter(&av7110->i2c_adap);
2503        if (ret < 0)
2504                goto err_dvb_unregister_adapter_2;
2505
2506        ttpci_eeprom_parse_mac(&av7110->i2c_adap,
2507                               av7110->dvb_adapter.proposed_mac);
2508        ret = -ENOMEM;
2509
2510        /* full-ts mod? */
2511        if (full_ts)
2512                av7110->full_ts = true;
2513
2514        /* check for full-ts flag in eeprom */
2515        if (i2c_readreg(av7110, 0xaa, 0) == 0x4f && i2c_readreg(av7110, 0xaa, 1) == 0x45) {
2516                u8 flags = i2c_readreg(av7110, 0xaa, 2);
2517                if (flags != 0xff && (flags & 0x01))
2518                        av7110->full_ts = true;
2519        }
2520
2521        if (av7110->full_ts) {
2522                printk(KERN_INFO "dvb-ttpci: full-ts mode enabled for saa7146 port B\n");
2523                spin_lock_init(&av7110->feedlock1);
2524                av7110->grabbing = saa7146_vmalloc_build_pgtable(pdev, length,
2525                                                                 &av7110->pt);
2526                if (!av7110->grabbing)
2527                        goto err_i2c_del_3;
2528
2529                saa7146_write(dev, DD1_STREAM_B, 0x00000000);
2530                saa7146_write(dev, MC2, (MASK_10 | MASK_26));
2531
2532                saa7146_write(dev, DD1_INIT, 0x00000600);
2533                saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
2534
2535                saa7146_write(dev, BRS_CTRL, 0x60000000);
2536                saa7146_write(dev, MC2, MASK_08 | MASK_24);
2537
2538                /* dma3 */
2539                saa7146_write(dev, PCI_BT_V1, 0x001c0000 | (saa7146_read(dev, PCI_BT_V1) & ~0x001f0000));
2540                saa7146_write(dev, BASE_ODD3, 0);
2541                saa7146_write(dev, BASE_EVEN3, 0);
2542                saa7146_write(dev, PROT_ADDR3, TS_WIDTH * TS_HEIGHT);
2543                saa7146_write(dev, PITCH3, TS_WIDTH);
2544                saa7146_write(dev, BASE_PAGE3, av7110->pt.dma | ME1 | 0x90);
2545                saa7146_write(dev, NUM_LINE_BYTE3, (TS_HEIGHT << 16) | TS_WIDTH);
2546                saa7146_write(dev, MC2, MASK_04 | MASK_20);
2547
2548                tasklet_init(&av7110->vpe_tasklet, vpeirq, (unsigned long) av7110);
2549
2550        } else if (budgetpatch) {
2551                spin_lock_init(&av7110->feedlock1);
2552                av7110->grabbing = saa7146_vmalloc_build_pgtable(pdev, length,
2553                                                                 &av7110->pt);
2554                if (!av7110->grabbing)
2555                        goto err_i2c_del_3;
2556
2557                saa7146_write(dev, PCI_BT_V1, 0x1c1f101f);
2558                saa7146_write(dev, BCS_CTRL, 0x80400040);
2559                /* set dd1 stream a & b */
2560                saa7146_write(dev, DD1_STREAM_B, 0x00000000);
2561                saa7146_write(dev, DD1_INIT, 0x03000200);
2562                saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
2563                saa7146_write(dev, BRS_CTRL, 0x60000000);
2564                saa7146_write(dev, BASE_ODD3, 0);
2565                saa7146_write(dev, BASE_EVEN3, 0);
2566                saa7146_write(dev, PROT_ADDR3, TS_WIDTH * TS_HEIGHT);
2567                saa7146_write(dev, BASE_PAGE3, av7110->pt.dma | ME1 | 0x90);
2568
2569                saa7146_write(dev, PITCH3, TS_WIDTH);
2570                saa7146_write(dev, NUM_LINE_BYTE3, (TS_HEIGHT << 16) | TS_WIDTH);
2571
2572                /* upload all */
2573                saa7146_write(dev, MC2, 0x077c077c);
2574                saa7146_write(dev, GPIO_CTRL, 0x000000);
2575#if RPS_IRQ
2576                /* set event counter 1 source as RPS1 interrupt (0x03)          (rE4 p53)
2577                 * use 0x03 to track RPS1 interrupts - increase by 1 every gpio3 is toggled
2578                 * use 0x15 to track VPE  interrupts - increase by 1 every vpeirq() is called
2579                 */
2580                saa7146_write(dev, EC1SSR, (0x03<<2) | 3 );
2581                /* set event counter 1 threshold to maximum allowed value        (rEC p55) */
2582                saa7146_write(dev, ECT1R,  0x3fff );
2583#endif
2584                /* Setup BUDGETPATCH MAIN RPS1 "program" (p35) */
2585                count = 0;
2586
2587                /* Wait Source Line Counter Threshold                           (p36) */
2588                WRITE_RPS1(CMD_PAUSE | EVT_HS);
2589                /* Set GPIO3=1                                                  (p42) */
2590                WRITE_RPS1(CMD_WR_REG_MASK | (GPIO_CTRL>>2));
2591                WRITE_RPS1(GPIO3_MSK);
2592                WRITE_RPS1(SAA7146_GPIO_OUTHI<<24);
2593#if RPS_IRQ
2594                /* issue RPS1 interrupt */
2595                WRITE_RPS1(CMD_INTERRUPT);
2596#endif
2597                /* Wait reset Source Line Counter Threshold                     (p36) */
2598                WRITE_RPS1(CMD_PAUSE | RPS_INV | EVT_HS);
2599                /* Set GPIO3=0                                                  (p42) */
2600                WRITE_RPS1(CMD_WR_REG_MASK | (GPIO_CTRL>>2));
2601                WRITE_RPS1(GPIO3_MSK);
2602                WRITE_RPS1(SAA7146_GPIO_OUTLO<<24);
2603#if RPS_IRQ
2604                /* issue RPS1 interrupt */
2605                WRITE_RPS1(CMD_INTERRUPT);
2606#endif
2607                /* Jump to begin of RPS program                                 (p37) */
2608                WRITE_RPS1(CMD_JUMP);
2609                WRITE_RPS1(dev->d_rps1.dma_handle);
2610
2611                /* Fix VSYNC level */
2612                saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
2613                /* Set RPS1 Address register to point to RPS code               (r108 p42) */
2614                saa7146_write(dev, RPS_ADDR1, dev->d_rps1.dma_handle);
2615                /* Set Source Line Counter Threshold, using BRS                 (rCC p43)
2616                 * It generates HS event every TS_HEIGHT lines
2617                 * this is related to TS_WIDTH set in register
2618                 * NUM_LINE_BYTE3. If NUM_LINE_BYTE low 16 bits
2619                 * are set to TS_WIDTH bytes (TS_WIDTH=2*188),
2620                 * then RPS_THRESH1 should be set to trigger
2621                 * every TS_HEIGHT (512) lines.
2622                 */
2623                saa7146_write(dev, RPS_THRESH1, (TS_HEIGHT*1) | MASK_12 );
2624
2625                /* Enable RPS1                                                  (rFC p33) */
2626                saa7146_write(dev, MC1, (MASK_13 | MASK_29));
2627
2628                /* end of budgetpatch register initialization */
2629                tasklet_init (&av7110->vpe_tasklet,  vpeirq,  (unsigned long) av7110);
2630        } else {
2631                saa7146_write(dev, PCI_BT_V1, 0x1c00101f);
2632                saa7146_write(dev, BCS_CTRL, 0x80400040);
2633
2634                /* set dd1 stream a & b */
2635                saa7146_write(dev, DD1_STREAM_B, 0x00000000);
2636                saa7146_write(dev, DD1_INIT, 0x03000000);
2637                saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
2638
2639                /* upload all */
2640                saa7146_write(dev, MC2, 0x077c077c);
2641                saa7146_write(dev, GPIO_CTRL, 0x000000);
2642        }
2643
2644        tasklet_init (&av7110->debi_tasklet, debiirq, (unsigned long) av7110);
2645        tasklet_init (&av7110->gpio_tasklet, gpioirq, (unsigned long) av7110);
2646
2647        mutex_init(&av7110->pid_mutex);
2648
2649        /* locks for data transfers from/to AV7110 */
2650        spin_lock_init(&av7110->debilock);
2651        mutex_init(&av7110->dcomlock);
2652        av7110->debitype = -1;
2653
2654        /* default OSD window */
2655        av7110->osdwin = 1;
2656        mutex_init(&av7110->osd_mutex);
2657
2658        /* TV standard */
2659        av7110->vidmode = tv_standard == 1 ? AV7110_VIDEO_MODE_NTSC
2660                                           : AV7110_VIDEO_MODE_PAL;
2661
2662        /* ARM "watchdog" */
2663        init_waitqueue_head(&av7110->arm_wait);
2664        av7110->arm_thread = NULL;
2665
2666        /* allocate and init buffers */
2667        av7110->debi_virt = pci_alloc_consistent(pdev, 8192, &av7110->debi_bus);
2668        if (!av7110->debi_virt)
2669                goto err_saa71466_vfree_4;
2670
2671
2672        av7110->iobuf = vmalloc(AVOUTLEN+AOUTLEN+BMPLEN+4*IPACKS);
2673        if (!av7110->iobuf)
2674                goto err_pci_free_5;
2675
2676        ret = av7110_av_init(av7110);
2677        if (ret < 0)
2678                goto err_iobuf_vfree_6;
2679
2680        /* init BMP buffer */
2681        av7110->bmpbuf = av7110->iobuf+AVOUTLEN+AOUTLEN;
2682        init_waitqueue_head(&av7110->bmpq);
2683
2684        ret = av7110_ca_init(av7110);
2685        if (ret < 0)
2686                goto err_av7110_av_exit_7;
2687
2688        /* load firmware into AV7110 cards */
2689        ret = av7110_bootarm(av7110);
2690        if (ret < 0)
2691                goto err_av7110_ca_exit_8;
2692
2693        ret = av7110_firmversion(av7110);
2694        if (ret < 0)
2695                goto err_stop_arm_9;
2696
2697        if (FW_VERSION(av7110->arm_app)<0x2501)
2698                printk ("dvb-ttpci: Warning, firmware version 0x%04x is too old. "
2699                        "System might be unstable!\n", FW_VERSION(av7110->arm_app));
2700
2701        thread = kthread_run(arm_thread, (void *) av7110, "arm_mon");
2702        if (IS_ERR(thread)) {
2703                ret = PTR_ERR(thread);
2704                goto err_stop_arm_9;
2705        }
2706        av7110->arm_thread = thread;
2707
2708        /* set initial volume in mixer struct */
2709        av7110->mixer.volume_left  = volume;
2710        av7110->mixer.volume_right = volume;
2711
2712        ret = av7110_register(av7110);
2713        if (ret < 0)
2714                goto err_arm_thread_stop_10;
2715
2716        init_av7110_av(av7110);
2717
2718        /* special case DVB-C: these cards have an analog tuner
2719           plus need some special handling, so we have separate
2720           saa7146_ext_vv data for these... */
2721        ret = av7110_init_v4l(av7110);
2722        if (ret < 0)
2723                goto err_av7110_unregister_11;
2724
2725        av7110->dvb_adapter.priv = av7110;
2726        ret = frontend_init(av7110);
2727        if (ret < 0)
2728                goto err_av7110_exit_v4l_12;
2729
2730        mutex_init(&av7110->ioctl_mutex);
2731
2732#if IS_ENABLED(CONFIG_DVB_AV7110_IR)
2733        av7110_ir_init(av7110);
2734#endif
2735        printk(KERN_INFO "dvb-ttpci: found av7110-%d.\n", av7110_num);
2736        av7110_num++;
2737out:
2738        return ret;
2739
2740err_av7110_exit_v4l_12:
2741        av7110_exit_v4l(av7110);
2742err_av7110_unregister_11:
2743        dvb_unregister(av7110);
2744err_arm_thread_stop_10:
2745        av7110_arm_sync(av7110);
2746err_stop_arm_9:
2747        /* Nothing to do. Rejoice. */
2748err_av7110_ca_exit_8:
2749        av7110_ca_exit(av7110);
2750err_av7110_av_exit_7:
2751        av7110_av_exit(av7110);
2752err_iobuf_vfree_6:
2753        vfree(av7110->iobuf);
2754err_pci_free_5:
2755        pci_free_consistent(pdev, 8192, av7110->debi_virt, av7110->debi_bus);
2756err_saa71466_vfree_4:
2757        if (av7110->grabbing)
2758                saa7146_vfree_destroy_pgtable(pdev, av7110->grabbing, &av7110->pt);
2759err_i2c_del_3:
2760        i2c_del_adapter(&av7110->i2c_adap);
2761err_dvb_unregister_adapter_2:
2762        dvb_unregister_adapter(&av7110->dvb_adapter);
2763err_put_firmware_1:
2764        put_firmware(av7110);
2765err_kfree_0:
2766        kfree(av7110);
2767        goto out;
2768}
2769
2770static int av7110_detach(struct saa7146_dev* saa)
2771{
2772        struct av7110 *av7110 = saa->ext_priv;
2773        dprintk(4, "%p\n", av7110);
2774
2775#if IS_ENABLED(CONFIG_DVB_AV7110_IR)
2776        av7110_ir_exit(av7110);
2777#endif
2778        if (budgetpatch || av7110->full_ts) {
2779                if (budgetpatch) {
2780                        /* Disable RPS1 */
2781                        saa7146_write(saa, MC1, MASK_29);
2782                        /* VSYNC LOW (inactive) */
2783                        saa7146_setgpio(saa, 3, SAA7146_GPIO_OUTLO);
2784                }
2785                saa7146_write(saa, MC1, MASK_20);       /* DMA3 off */
2786                SAA7146_IER_DISABLE(saa, MASK_10);
2787                SAA7146_ISR_CLEAR(saa, MASK_10);
2788                msleep(50);
2789                tasklet_kill(&av7110->vpe_tasklet);
2790                saa7146_vfree_destroy_pgtable(saa->pci, av7110->grabbing, &av7110->pt);
2791        }
2792        av7110_exit_v4l(av7110);
2793
2794        av7110_arm_sync(av7110);
2795
2796        tasklet_kill(&av7110->debi_tasklet);
2797        tasklet_kill(&av7110->gpio_tasklet);
2798
2799        dvb_unregister(av7110);
2800
2801        SAA7146_IER_DISABLE(saa, MASK_19 | MASK_03);
2802        SAA7146_ISR_CLEAR(saa, MASK_19 | MASK_03);
2803
2804        av7110_ca_exit(av7110);
2805        av7110_av_exit(av7110);
2806
2807        vfree(av7110->iobuf);
2808        pci_free_consistent(saa->pci, 8192, av7110->debi_virt,
2809                            av7110->debi_bus);
2810
2811        i2c_del_adapter(&av7110->i2c_adap);
2812
2813        dvb_unregister_adapter (&av7110->dvb_adapter);
2814
2815        av7110_num--;
2816
2817        put_firmware(av7110);
2818
2819        kfree(av7110);
2820
2821        saa->ext_priv = NULL;
2822
2823        return 0;
2824}
2825
2826
2827static void av7110_irq(struct saa7146_dev* dev, u32 *isr)
2828{
2829        struct av7110 *av7110 = dev->ext_priv;
2830
2831        //print_time("av7110_irq");
2832
2833        /* Note: Don't try to handle the DEBI error irq (MASK_18), in
2834         * intel mode the timeout is asserted all the time...
2835         */
2836
2837        if (*isr & MASK_19) {
2838                //printk("av7110_irq: DEBI\n");
2839                /* Note 1: The DEBI irq is level triggered: We must enable it
2840                 * only after we started a DMA xfer, and disable it here
2841                 * immediately, or it will be signalled all the time while
2842                 * DEBI is idle.
2843                 * Note 2: You would think that an irq which is masked is
2844                 * not signalled by the hardware. Not so for the SAA7146:
2845                 * An irq is signalled as long as the corresponding bit
2846                 * in the ISR is set, and disabling irqs just prevents the
2847                 * hardware from setting the ISR bit. This means a) that we
2848                 * must clear the ISR *after* disabling the irq (which is why
2849                 * we must do it here even though saa7146_core did it already),
2850                 * and b) that if we were to disable an edge triggered irq
2851                 * (like the gpio irqs sadly are) temporarily we would likely
2852                 * loose some. This sucks :-(
2853                 */
2854                SAA7146_IER_DISABLE(av7110->dev, MASK_19);
2855                SAA7146_ISR_CLEAR(av7110->dev, MASK_19);
2856                tasklet_schedule(&av7110->debi_tasklet);
2857        }
2858
2859        if (*isr & MASK_03) {
2860                //printk("av7110_irq: GPIO\n");
2861                tasklet_schedule(&av7110->gpio_tasklet);
2862        }
2863
2864        if (*isr & MASK_10)
2865                tasklet_schedule(&av7110->vpe_tasklet);
2866}
2867
2868
2869static struct saa7146_extension av7110_extension_driver;
2870
2871#define MAKE_AV7110_INFO(x_var,x_name) \
2872static struct saa7146_pci_extension_data x_var = { \
2873        .ext_priv = x_name, \
2874        .ext = &av7110_extension_driver }
2875
2876MAKE_AV7110_INFO(tts_1_X_fsc,"Technotrend/Hauppauge WinTV DVB-S rev1.X or Fujitsu Siemens DVB-C");
2877MAKE_AV7110_INFO(ttt_1_X,    "Technotrend/Hauppauge WinTV DVB-T rev1.X");
2878MAKE_AV7110_INFO(ttc_1_X,    "Technotrend/Hauppauge WinTV Nexus-CA rev1.X");
2879MAKE_AV7110_INFO(ttc_2_X,    "Technotrend/Hauppauge WinTV DVB-C rev2.X");
2880MAKE_AV7110_INFO(tts_2_X,    "Technotrend/Hauppauge WinTV Nexus-S rev2.X");
2881MAKE_AV7110_INFO(tts_2_3,    "Technotrend/Hauppauge WinTV Nexus-S rev2.3");
2882MAKE_AV7110_INFO(tts_1_3se,  "Technotrend/Hauppauge WinTV DVB-S rev1.3 SE");
2883MAKE_AV7110_INFO(ttt,        "Technotrend/Hauppauge DVB-T");
2884MAKE_AV7110_INFO(fsc,        "Fujitsu Siemens DVB-C");
2885MAKE_AV7110_INFO(fss,        "Fujitsu Siemens DVB-S rev1.6");
2886MAKE_AV7110_INFO(gxs_1_3,    "Galaxis DVB-S rev1.3");
2887
2888static struct pci_device_id pci_tbl[] = {
2889        MAKE_EXTENSION_PCI(fsc,         0x110a, 0x0000),
2890        MAKE_EXTENSION_PCI(tts_1_X_fsc, 0x13c2, 0x0000),
2891        MAKE_EXTENSION_PCI(ttt_1_X,     0x13c2, 0x0001),
2892        MAKE_EXTENSION_PCI(ttc_2_X,     0x13c2, 0x0002),
2893        MAKE_EXTENSION_PCI(tts_2_X,     0x13c2, 0x0003),
2894        MAKE_EXTENSION_PCI(gxs_1_3,     0x13c2, 0x0004),
2895        MAKE_EXTENSION_PCI(fss,         0x13c2, 0x0006),
2896        MAKE_EXTENSION_PCI(ttt,         0x13c2, 0x0008),
2897        MAKE_EXTENSION_PCI(ttc_1_X,     0x13c2, 0x000a),
2898        MAKE_EXTENSION_PCI(tts_2_3,     0x13c2, 0x000e),
2899        MAKE_EXTENSION_PCI(tts_1_3se,   0x13c2, 0x1002),
2900
2901/*      MAKE_EXTENSION_PCI(???, 0x13c2, 0x0005), UNDEFINED CARD */ // Technisat SkyStar1
2902/*      MAKE_EXTENSION_PCI(???, 0x13c2, 0x0009), UNDEFINED CARD */ // TT/Hauppauge WinTV Nexus-CA v????
2903
2904        {
2905                .vendor    = 0,
2906        }
2907};
2908
2909MODULE_DEVICE_TABLE(pci, pci_tbl);
2910
2911
2912static struct saa7146_extension av7110_extension_driver = {
2913        .name           = "av7110",
2914        .flags          = SAA7146_USE_I2C_IRQ,
2915
2916        .module         = THIS_MODULE,
2917        .pci_tbl        = &pci_tbl[0],
2918        .attach         = av7110_attach,
2919        .detach         = av7110_detach,
2920
2921        .irq_mask       = MASK_19 | MASK_03 | MASK_10,
2922        .irq_func       = av7110_irq,
2923};
2924
2925
2926static int __init av7110_init(void)
2927{
2928        int retval;
2929        retval = saa7146_register_extension(&av7110_extension_driver);
2930        return retval;
2931}
2932
2933
2934static void __exit av7110_exit(void)
2935{
2936        saa7146_unregister_extension(&av7110_extension_driver);
2937}
2938
2939module_init(av7110_init);
2940module_exit(av7110_exit);
2941
2942MODULE_DESCRIPTION("driver for the SAA7146 based AV110 PCI DVB cards by "
2943                   "Siemens, Technotrend, Hauppauge");
2944MODULE_AUTHOR("Ralph Metzler, Marcus Metzler, others");
2945MODULE_LICENSE("GPL");
2946