The patch number 8891 was added via Mauro Carvalho Chehab <[EMAIL PROTECTED]>
to http://linuxtv.org/hg/v4l-dvb master development tree.

Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel

If anyone has any objections, please let us know by sending a message to:
        [EMAIL PROTECTED]

------

From: Mauro Carvalho Chehab  <[EMAIL PROTECTED]>
merge: http://linuxtv.org/hg/~endriss/v4l-dvb


Priority: normal

Signed-off-by: Mauro Carvalho Chehab <[EMAIL PROTECTED]>


---

 linux/drivers/media/dvb/frontends/tdhd1.h |   73 +++++++++++++
 linux/drivers/media/dvb/ttpci/Kconfig     |    1 
 linux/drivers/media/dvb/ttpci/av7110.c    |  115 +++++++++++++++++-----
 linux/drivers/media/dvb/ttpci/av7110.h    |    1 
 linux/drivers/media/dvb/ttpci/av7110_av.c |    3 
 linux/drivers/media/dvb/ttpci/budget.c    |   18 +++
 6 files changed, 185 insertions(+), 26 deletions(-)

diff -r ce254eb5215c -r 7c0633d429df linux/drivers/media/dvb/frontends/tdhd1.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/linux/drivers/media/dvb/frontends/tdhd1.h Fri Sep 05 09:52:29 2008 -0300
@@ -0,0 +1,73 @@
+/*
+ * tdhd1.h - ALPS TDHD1-204A tuner support
+ *
+ * Copyright (C) 2008 Oliver Endriss <[EMAIL PROTECTED]>
+ *
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
+ *
+ *
+ * The project's page is at http://www.linuxtv.org
+ */
+
+#ifndef TDHD1_H
+#define TDHD1_H
+
+#include "tda1004x.h"
+
+static int alps_tdhd1_204_request_firmware(struct dvb_frontend *fe, const 
struct firmware **fw, char *name);
+
+static struct tda1004x_config alps_tdhd1_204a_config = {
+       .demod_address = 0x8,
+       .invert = 1,
+       .invert_oclk = 0,
+       .xtal_freq = TDA10046_XTAL_4M,
+       .agc_config = TDA10046_AGC_DEFAULT,
+       .if_freq = TDA10046_FREQ_3617,
+       .request_firmware = alps_tdhd1_204_request_firmware
+};
+
+static int alps_tdhd1_204a_tuner_set_params(struct dvb_frontend *fe, struct 
dvb_frontend_parameters *params)
+{
+       struct i2c_adapter *i2c = fe->tuner_priv;
+       u8 data[4];
+       struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = 
sizeof(data) };
+       u32 div;
+
+       div = (params->frequency + 36166666) / 166666;
+
+       data[0] = (div >> 8) & 0x7f;
+       data[1] = div & 0xff;
+       data[2] = 0x85;
+
+       if (params->frequency >= 174000000 && params->frequency <= 230000000)
+               data[3] = 0x02;
+       else if (params->frequency >= 470000000 && params->frequency <= 
823000000)
+               data[3] = 0x0C;
+       else if (params->frequency > 823000000 && params->frequency <= 
862000000)
+               data[3] = 0x8C;
+       else
+               return -EINVAL;
+
+       if (fe->ops.i2c_gate_ctrl)
+               fe->ops.i2c_gate_ctrl(fe, 1);
+       if (i2c_transfer(i2c, &msg, 1) != 1)
+               return -EIO;
+
+       return 0;
+}
+
+#endif /* TDHD1_H */
diff -r ce254eb5215c -r 7c0633d429df linux/drivers/media/dvb/ttpci/Kconfig
--- a/linux/drivers/media/dvb/ttpci/Kconfig     Thu Sep 04 10:23:06 2008 -0400
+++ b/linux/drivers/media/dvb/ttpci/Kconfig     Fri Sep 05 09:52:29 2008 -0300
@@ -86,6 +86,7 @@ config DVB_BUDGET
        select DVB_TDA10086 if !DVB_FE_CUSTOMISE
        select DVB_TDA826X if !DVB_FE_CUSTOMISE
        select DVB_LNBP21 if !DVB_FE_CUSTOMISE
+       select DVB_TDA1004X if !DVB_FE_CUSTOMISE
        help
          Support for simple SAA7146 based DVB cards (so called Budget-
          or Nova-PCI cards) without onboard MPEG2 decoder, and without
diff -r ce254eb5215c -r 7c0633d429df linux/drivers/media/dvb/ttpci/av7110.c
--- a/linux/drivers/media/dvb/ttpci/av7110.c    Thu Sep 04 10:23:06 2008 -0400
+++ b/linux/drivers/media/dvb/ttpci/av7110.c    Fri Sep 05 09:52:29 2008 -0300
@@ -88,6 +88,7 @@ static int wss_cfg_4_3 = 0x4008;
 static int wss_cfg_4_3 = 0x4008;
 static int wss_cfg_16_9 = 0x0007;
 static int tv_standard;
+static int full_ts;
 
 module_param_named(debug, av7110_debug, int, 0644);
 MODULE_PARM_DESC(debug, "debug level (bitmask, default 0)");
@@ -106,6 +107,8 @@ MODULE_PARM_DESC(volume, "initial volume
 MODULE_PARM_DESC(volume, "initial volume: default 255 (range 0-255)");
 module_param(budgetpatch, int, 0444);
 MODULE_PARM_DESC(budgetpatch, "use budget-patch hardware modification: default 
0 (0 no, 1 autodetect, 2 always)");
+module_param(full_ts, int, 0444);
+MODULE_PARM_DESC(full_ts, "enable code for full-ts hardware modification: 0 
disable (default), 1 enable");
 module_param(wss_cfg_4_3, int, 0444);
 MODULE_PARM_DESC(wss_cfg_4_3, "WSS 4:3 - default 0x4008 - bit 15: disable, 14: 
burst mode, 13..0: wss data");
 module_param(wss_cfg_16_9, int, 0444);
@@ -116,6 +119,8 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr
 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
 
 static void restart_feeds(struct av7110 *av7110);
+static int budget_start_feed(struct dvb_demux_feed *feed);
+static int budget_stop_feed(struct dvb_demux_feed *feed);
 
 static int av7110_num;
 
@@ -806,6 +811,9 @@ static int StartHWFilter(struct dvb_demu
 
        dprintk(4, "%p\n", av7110);
 
+       if (av7110->full_ts)
+               return 0;
+
        if (dvbdmxfilter->type == DMX_TYPE_SEC) {
                if (hw_sections) {
                        buf[4] = (dvbdmxfilter->filter.filter_value[0] << 8) |
@@ -854,6 +862,9 @@ static int StopHWFilter(struct dvb_demux
 
        dprintk(4, "%p\n", av7110);
 
+       if (av7110->full_ts)
+               return 0;
+
        handle = dvbdmxfilter->hw_handle;
        if (handle >= 32) {
                printk("%s tried to stop invalid filter %04x, filter type = 
%x\n",
@@ -913,7 +924,7 @@ static int dvb_feed_start_pid(struct dvb
                                return ret;
                }
 
-       if ((dvbdmxfeed->ts_type & TS_PACKET)) {
+       if ((dvbdmxfeed->ts_type & TS_PACKET) && !av7110->full_ts) {
                if (dvbdmxfeed->pes_type == 0 && !(dvbdmx->pids[0] & 0x8000))
                        ret = av7110_av_start_record(av7110, RP_AUDIO, 
dvbdmxfeed);
                if (dvbdmxfeed->pes_type == 1 && !(dvbdmx->pids[1] & 0x8000))
@@ -974,7 +985,7 @@ static int av7110_start_feed(struct dvb_
        if (!demux->dmx.frontend)
                return -EINVAL;
 
-       if (feed->pid > 0x1fff)
+       if (!av7110->full_ts && feed->pid > 0x1fff)
                return -EINVAL;
 
        if (feed->type == DMX_TYPE_TS) {
@@ -1003,7 +1014,12 @@ static int av7110_start_feed(struct dvb_
                }
        }
 
-       else if (feed->type == DMX_TYPE_SEC) {
+       if (av7110->full_ts) {
+               budget_start_feed(feed);
+               return ret;
+       }
+
+       if (feed->type == DMX_TYPE_SEC) {
                int i;
 
                for (i = 0; i < demux->filternum; i++) {
@@ -1050,7 +1066,12 @@ static int av7110_stop_feed(struct dvb_d
                                ret = StopHWFilter(feed->filter);
        }
 
-       if (!ret && feed->type == DMX_TYPE_SEC) {
+       if (av7110->full_ts) {
+               budget_stop_feed(feed);
+               return ret;
+       }
+
+       if (feed->type == DMX_TYPE_SEC) {
                for (i = 0; i<demux->filternum; i++) {
                        if (demux->filter[i].state == DMX_STATE_GO &&
                            demux->filter[i].filter.parent == &feed->feed.sec) {
@@ -1074,6 +1095,7 @@ static void restart_feeds(struct av7110 
        struct dvb_demux *dvbdmx = &av7110->demux;
        struct dvb_demux_feed *feed;
        int mode;
+       int feeding;
        int i, j;
 
        dprintk(4, "%p\n", av7110);
@@ -1081,6 +1103,8 @@ static void restart_feeds(struct av7110 
        mode = av7110->playing;
        av7110->playing = 0;
        av7110->rec_mode = 0;
+
+       feeding = av7110->feeding1; /* full_ts mod */
 
        for (i = 0; i < dvbdmx->feednum; i++) {
                feed = &dvbdmx->feed[i];
@@ -1099,6 +1123,8 @@ static void restart_feeds(struct av7110 
                }
        }
 
+       av7110->feeding1 = feeding; /* full_ts mod */
+
        if (mode)
                av7110_av_start_play(av7110, mode);
 }
@@ -1197,8 +1223,9 @@ static int start_ts_capture(struct av711
 
        if (budget->feeding1)
                return ++budget->feeding1;
-       memset(budget->grabbing, 0x00, TS_HEIGHT * TS_WIDTH);
+       memset(budget->grabbing, 0x00, TS_BUFLEN);
        budget->ttbp = 0;
+       SAA7146_ISR_CLEAR(budget->dev, MASK_10);  /* VPE */
        SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */
        saa7146_write(budget->dev, MC1, (MASK_04 | MASK_20)); /* DMA3 on */
        return ++budget->feeding1;
@@ -1239,12 +1266,8 @@ static void vpeirq(unsigned long data)
        u8 *mem = (u8 *) (budget->grabbing);
        u32 olddma = budget->ttbp;
        u32 newdma = saa7146_read(budget->dev, PCI_VDP3);
-
-       if (!budgetpatch) {
-               printk("av7110.c: vpeirq() called while budgetpatch disabled!"
-                      " check saa7146 IER register\n");
-               BUG();
-       }
+       struct dvb_demux *demux = budget->full_ts ? &budget->demux : 
&budget->demux1;
+
        /* nearest lower position divisible by 188 */
        newdma -= newdma % 188;
 
@@ -1268,11 +1291,11 @@ static void vpeirq(unsigned long data)
 
        if (newdma > olddma)
                /* no wraparound, dump olddma..newdma */
-               dvb_dmx_swfilter_packets(&budget->demux1, mem + olddma, (newdma 
- olddma) / 188);
+               dvb_dmx_swfilter_packets(demux, mem + olddma, (newdma - olddma) 
/ 188);
        else {
                /* wraparound, dump olddma..buflen and 0..newdma */
-               dvb_dmx_swfilter_packets(&budget->demux1, mem + olddma, 
(TS_BUFLEN - olddma) / 188);
-               dvb_dmx_swfilter_packets(&budget->demux1, mem, newdma / 188);
+               dvb_dmx_swfilter_packets(demux, mem + olddma, (TS_BUFLEN - 
olddma) / 188);
+               dvb_dmx_swfilter_packets(demux, mem, newdma / 188);
        }
 }
 
@@ -1294,8 +1317,8 @@ static int av7110_register(struct av7110
        for (i = 0; i < 32; i++)
                av7110->handle2filter[i] = NULL;
 
-       dvbdemux->filternum = 32;
-       dvbdemux->feednum = 32;
+       dvbdemux->filternum = (av7110->full_ts) ? 256 : 32;
+       dvbdemux->feednum = (av7110->full_ts) ? 256 : 32;
        dvbdemux->start_feed = av7110_start_feed;
        dvbdemux->stop_feed = av7110_stop_feed;
        dvbdemux->write_to_decoder = av7110_write_to_decoder;
@@ -1305,7 +1328,7 @@ static int av7110_register(struct av7110
        dvb_dmx_init(&av7110->demux);
        av7110->demux.dmx.get_stc = dvb_get_stc;
 
-       av7110->dmxdev.filternum = 32;
+       av7110->dmxdev.filternum = (av7110->full_ts) ? 256 : 32;
        av7110->dmxdev.demux = &dvbdemux->dmx;
        av7110->dmxdev.capabilities = 0;
 
@@ -1422,7 +1445,6 @@ int i2c_writereg(struct av7110 *av7110, 
        return i2c_transfer(&av7110->i2c_adap, &msgs, 1);
 }
 
-#if 0 /* keep */
 u8 i2c_readreg(struct av7110 *av7110, u8 id, u8 reg)
 {
        u8 mm1[] = {0x00};
@@ -1439,7 +1461,6 @@ u8 i2c_readreg(struct av7110 *av7110, u8
 
        return mm2[0];
 }
-#endif
 
 /****************************************************************************
  * INITIALIZATION
@@ -2484,7 +2505,47 @@ static int __devinit av7110_attach(struc
                               av7110->dvb_adapter.proposed_mac);
        ret = -ENOMEM;
 
-       if (budgetpatch) {
+       /* full-ts mod? */
+       if (full_ts)
+               av7110->full_ts = true;
+
+       /* check for full-ts flag in eeprom */
+       if (i2c_readreg(av7110, 0xaa, 0) == 0x4f && i2c_readreg(av7110, 0xaa, 
1) == 0x45) {
+               u8 flags = i2c_readreg(av7110, 0xaa, 2);
+               if (flags != 0xff && (flags & 0x01))
+                       av7110->full_ts = true;
+       }
+
+       if (av7110->full_ts) {
+               printk(KERN_INFO "dvb-ttpci: full-ts mode enabled for saa7146 
port B\n");
+               spin_lock_init(&av7110->feedlock1);
+               av7110->grabbing = saa7146_vmalloc_build_pgtable(pdev, length,
+                                                                &av7110->pt);
+               if (!av7110->grabbing)
+                       goto err_i2c_del_3;
+
+               saa7146_write(dev, DD1_STREAM_B, 0x00000000);
+               saa7146_write(dev, MC2, (MASK_10 | MASK_26));
+
+               saa7146_write(dev, DD1_INIT, 0x00000600);
+               saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | 
MASK_26));
+
+               saa7146_write(dev, BRS_CTRL, 0x60000000);
+               saa7146_write(dev, MC2, MASK_08 | MASK_24);
+
+               /* dma3 */
+               saa7146_write(dev, PCI_BT_V1, 0x001c0000 | (saa7146_read(dev, 
PCI_BT_V1) & ~0x001f0000));
+               saa7146_write(dev, BASE_ODD3, 0);
+               saa7146_write(dev, BASE_EVEN3, 0);
+               saa7146_write(dev, PROT_ADDR3, TS_WIDTH * TS_HEIGHT);
+               saa7146_write(dev, PITCH3, TS_WIDTH);
+               saa7146_write(dev, BASE_PAGE3, av7110->pt.dma | ME1 | 0x90);
+               saa7146_write(dev, NUM_LINE_BYTE3, (TS_HEIGHT << 16) | 
TS_WIDTH);
+               saa7146_write(dev, MC2, MASK_04 | MASK_20);
+
+               tasklet_init(&av7110->vpe_tasklet, vpeirq, (unsigned long) 
av7110);
+
+       } else if (budgetpatch) {
                spin_lock_init(&av7110->feedlock1);
                av7110->grabbing = saa7146_vmalloc_build_pgtable(pdev, length,
                                                                 &av7110->pt);
@@ -2710,11 +2771,13 @@ static int __devexit av7110_detach(struc
 #if defined(CONFIG_INPUT_EVDEV) || defined(CONFIG_INPUT_EVDEV_MODULE)
        av7110_ir_exit(av7110);
 #endif
-       if (budgetpatch) {
-               /* Disable RPS1 */
-               saa7146_write(saa, MC1, MASK_29);
-               /* VSYNC LOW (inactive) */
-               saa7146_setgpio(saa, 3, SAA7146_GPIO_OUTLO);
+       if (budgetpatch || av7110->full_ts) {
+               if (budgetpatch) {
+                       /* Disable RPS1 */
+                       saa7146_write(saa, MC1, MASK_29);
+                       /* VSYNC LOW (inactive) */
+                       saa7146_setgpio(saa, 3, SAA7146_GPIO_OUTLO);
+               }
                saa7146_write(saa, MC1, MASK_20);       /* DMA3 off */
                SAA7146_IER_DISABLE(saa, MASK_10);
                SAA7146_ISR_CLEAR(saa, MASK_10);
@@ -2794,7 +2857,7 @@ static void av7110_irq(struct saa7146_de
                tasklet_schedule(&av7110->gpio_tasklet);
        }
 
-       if ((*isr & MASK_10) && budgetpatch)
+       if (*isr & MASK_10)
                tasklet_schedule(&av7110->vpe_tasklet);
 }
 
diff -r ce254eb5215c -r 7c0633d429df linux/drivers/media/dvb/ttpci/av7110.h
--- a/linux/drivers/media/dvb/ttpci/av7110.h    Thu Sep 04 10:23:06 2008 -0400
+++ b/linux/drivers/media/dvb/ttpci/av7110.h    Fri Sep 05 09:52:29 2008 -0300
@@ -194,6 +194,7 @@ struct av7110 {
        unsigned char           *grabbing;
        struct saa7146_pgtable  pt;
        struct tasklet_struct   vpe_tasklet;
+       bool                    full_ts;
 
        int                     fe_synced;
        struct mutex            pid_mutex;
diff -r ce254eb5215c -r 7c0633d429df linux/drivers/media/dvb/ttpci/av7110_av.c
--- a/linux/drivers/media/dvb/ttpci/av7110_av.c Thu Sep 04 10:23:06 2008 -0400
+++ b/linux/drivers/media/dvb/ttpci/av7110_av.c Fri Sep 05 09:52:29 2008 -0300
@@ -788,6 +788,9 @@ int av7110_write_to_decoder(struct dvb_d
 
        dprintk(2, "av7110:%p, \n", av7110);
 
+       if (av7110->full_ts && demux->dmx.frontend->source != DMX_MEMORY_FE)
+               return 0;
+
        switch (feed->pes_type) {
        case 0:
                if (av7110->audiostate.stream_source == AUDIO_SOURCE_MEMORY)
diff -r ce254eb5215c -r 7c0633d429df linux/drivers/media/dvb/ttpci/budget.c
--- a/linux/drivers/media/dvb/ttpci/budget.c    Thu Sep 04 10:23:06 2008 -0400
+++ b/linux/drivers/media/dvb/ttpci/budget.c    Fri Sep 05 09:52:29 2008 -0300
@@ -46,6 +46,7 @@
 #include "lnbp21.h"
 #include "bsru6.h"
 #include "bsbe1.h"
+#include "tdhd1.h"
 
 static int diseqc_method;
 module_param(diseqc_method, int, 0444);
@@ -389,6 +390,13 @@ static struct stv0299_config alps_bsbe1_
        .min_delay_ms = 100,
        .set_symbol_rate = alps_bsbe1_set_symbol_rate,
 };
+
+static int alps_tdhd1_204_request_firmware(struct dvb_frontend *fe, const 
struct firmware **fw, char *name)
+{
+       struct budget *budget = (struct budget *)fe->dvb->priv;
+
+       return request_firmware(fw, name, &budget->dev->pci->dev);
+}
 
 
 static int i2c_readreg(struct i2c_adapter *i2c, u8 adr, u8 reg)
@@ -511,6 +519,14 @@ static void frontend_init(struct budget 
                }
                break;
 
+       case 0x5f60: /* Fujitsu Siemens Activy Budget-T PCI rev AL 
(tda10046/ALPS TDHD1-204A) */
+               budget->dvb_frontend = dvb_attach(tda10046_attach, 
&alps_tdhd1_204a_config, &budget->i2c_adap);
+               if (budget->dvb_frontend) {
+                       budget->dvb_frontend->ops.tuner_ops.set_params = 
alps_tdhd1_204a_tuner_set_params;
+                       budget->dvb_frontend->tuner_priv = &budget->i2c_adap;
+               }
+               break;
+
        case 0x5f61: /* Fujitsu Siemens Activy Budget-T PCI rev GR 
(L64781/Grundig 29504-401(tsa5060)) */
                budget->dvb_frontend = dvb_attach(l64781_attach, 
&grundig_29504_401_config_activy, &budget->i2c_adap);
                if (budget->dvb_frontend) {
@@ -624,6 +640,7 @@ MAKE_BUDGET_INFO(fsacs0, "Fujitsu Siemen
 MAKE_BUDGET_INFO(fsacs0, "Fujitsu Siemens Activy Budget-S PCI (rev GR/grundig 
frontend)", BUDGET_FS_ACTIVY);
 MAKE_BUDGET_INFO(fsacs1, "Fujitsu Siemens Activy Budget-S PCI (rev AL/alps 
frontend)", BUDGET_FS_ACTIVY);
 MAKE_BUDGET_INFO(fsact,         "Fujitsu Siemens Activy Budget-T PCI (rev 
GR/Grundig frontend)", BUDGET_FS_ACTIVY);
+MAKE_BUDGET_INFO(fsact1, "Fujitsu Siemens Activy Budget-T PCI (rev AL/ALPS 
TDHD1-204A)", BUDGET_FS_ACTIVY);
 
 static struct pci_device_id pci_tbl[] = {
        MAKE_EXTENSION_PCI(ttbs,  0x13c2, 0x1003),
@@ -634,6 +651,7 @@ static struct pci_device_id pci_tbl[] = 
        MAKE_EXTENSION_PCI(ttbs1401, 0x13c2, 0x1018),
        MAKE_EXTENSION_PCI(fsacs1,0x1131, 0x4f60),
        MAKE_EXTENSION_PCI(fsacs0,0x1131, 0x4f61),
+       MAKE_EXTENSION_PCI(fsact1, 0x1131, 0x5f60),
        MAKE_EXTENSION_PCI(fsact, 0x1131, 0x5f61),
        {
                .vendor    = 0,


---

Patch is available at: 
http://linuxtv.org/hg/v4l-dvb/rev/7c0633d429df9131c52b2cf705efe9a66c2e4683

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to