Hello,
this is a bad test patch that adds support for AverMedia Satelllite Hybrid+FM
A706 cards to saa7134.

Working: analog video inputs (composite, s-vhs, analog TV), analog sound
inputs (cinch, TV), analog TV tuner, remote control

Partially working: FM radio - it tunes but detunes to noise after a moment
(might be a bug in tda18271 driver?)
GPIO11 controls 74HC4052 MUX - it's enabled for radio and disabled for TV
in Windows - I did the same and it did not change anything

Untested: DVB-S

There is a hack (added "return 0" lines) to disable tda8290 i2c gate.
Is there a way to do this properly?

diff --git a/drivers/media/i2c/ir-kbd-i2c.c b/drivers/media/i2c/ir-kbd-i2c.c
index 08ae067..c1f6e7c 100644
--- a/drivers/media/i2c/ir-kbd-i2c.c
+++ b/drivers/media/i2c/ir-kbd-i2c.c
@@ -230,7 +230,7 @@ static int get_key_avermedia_cardbus(struct IR_i2c *ir,
                return 0;
 
        dprintk(1, "read key 0x%02x/0x%02x\n", key, keygroup);
-       if (keygroup < 2 || keygroup > 3) {
+       if (keygroup < 2 || keygroup > 4) {
                /* Only a warning */
                dprintk(1, "warning: invalid key group 0x%02x for key 0x%02x\n",
                                                                keygroup, key);
@@ -239,6 +239,10 @@ static int get_key_avermedia_cardbus(struct IR_i2c *ir,
 
        *ir_key = key;
        *ir_raw = key;
+       if (!strcmp(ir->ir_codes, RC_MAP_AVERMEDIA_M733A_RM_K6)) {
+               *ir_key |= keygroup << 8;
+               *ir_raw |= keygroup << 8;
+       }
        return 1;
 }
 
@@ -332,6 +336,13 @@ static int ir_probe(struct i2c_client *client, const 
struct i2c_device_id *id)
                rc_type     = RC_BIT_OTHER;
                ir_codes    = RC_MAP_AVERMEDIA_CARDBUS;
                break;
+       case 0x41:
+               name        = "AVerMedia EM78P153";
+               ir->get_key = get_key_avermedia_cardbus;
+               rc_type     = RC_BIT_OTHER;
+               /* RM-KV remote, seems to be same as RM-K6 */
+               ir_codes    = RC_MAP_AVERMEDIA_M733A_RM_K6;
+               break;
        case 0x71:
                name        = "Hauppauge/Zilog Z8";
                ir->get_key = get_key_haup_xvr;
diff --git a/drivers/media/pci/saa7134/saa7134-cards.c 
b/drivers/media/pci/saa7134/saa7134-cards.c
index bc08f1d..8b5025d 100644
--- a/drivers/media/pci/saa7134/saa7134-cards.c
+++ b/drivers/media/pci/saa7134/saa7134-cards.c
@@ -5773,6 +5773,36 @@ struct saa7134_board saa7134_boards[] = {
                        .gpio   = 0x0000000,
                },
        },
+       [SAA7134_BOARD_AVERMEDIA_A706] = {
+               .name           = "AverMedia AverTV Satellite Hybrid+FM A706",
+               .audio_clock    = 0x00187de7,
+               .tuner_type     = TUNER_PHILIPS_TDA8290,
+               .radio_type     = UNSET,
+               .tuner_addr     = ADDR_UNSET,
+               .radio_addr     = ADDR_UNSET,
+               .tuner_config   = 0,
+               .gpiomask       = 1 << 11,
+               .mpeg           = SAA7134_MPEG_DVB,
+               .inputs         = {{
+                       .name = name_tv,
+                       .vmux = 1,
+                       .amux = TV,
+                       .tv   = 1,
+               }, {
+                       .name = name_comp,
+                       .vmux = 4,
+                       .amux = LINE1,
+               }, {
+                       .name = name_svideo,
+                       .vmux = 8,
+                       .amux = LINE1,
+               } },
+               .radio = {
+                       .name = name_radio,
+                       .amux = TV,
+                       .gpio = 0x0000800,
+               },
+       },
 
 };
 
@@ -7020,6 +7050,12 @@ struct pci_device_id saa7134_pci_tbl[] = {
                .subdevice    = 0x0911,
                .driver_data  = SAA7134_BOARD_SENSORAY811_911,
        }, {
+               .vendor       = PCI_VENDOR_ID_PHILIPS,
+               .device       = PCI_DEVICE_ID_PHILIPS_SAA7133,
+               .subvendor    = 0x1461, /* Avermedia Technologies Inc */
+               .subdevice    = 0x2055, /* AverTV Satellite Hybrid+FM A706 */
+               .driver_data  = SAA7134_BOARD_AVERMEDIA_A706,
+       }, {
                /* --- boards without eeprom + subsystem ID --- */
                .vendor       = PCI_VENDOR_ID_PHILIPS,
                .device       = PCI_DEVICE_ID_PHILIPS_SAA7134,
@@ -7266,6 +7302,7 @@ static int saa7134_tda8290_callback(struct saa7134_dev 
*dev,
        case SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG:
        case SAA7134_BOARD_KWORLD_PC150U:
        case SAA7134_BOARD_MAGICPRO_PROHDTV_PRO2:
+       case SAA7134_BOARD_AVERMEDIA_A706:
                /* tda8290 + tda18271 */
                ret = saa7134_tda8290_18271_callback(dev, command, arg);
                break;
@@ -7568,6 +7605,41 @@ int saa7134_board_init1(struct saa7134_dev *dev)
                saa_andorl(SAA7134_GPIO_GPMODE0 >> 2,   0x80040100, 0x80040100);
                saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x80040100, 0x00040100);
                break;
+       case SAA7134_BOARD_AVERMEDIA_A706:
+               dev->has_remote = SAA7134_REMOTE_I2C;
+               saa_andorl(SAA7134_GPIO_GPMODE0 >> 2,   0x0fffffff, 0x02a00e00);
+               saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x0fffffff, 0x02203980);
+/*             saa7134_set_gpio(dev, 0, 1);
+               saa7134_set_gpio(dev, 1, 1);
+               saa7134_set_gpio(dev, 2, 1);
+               saa7134_set_gpio(dev, 3, 1);
+               saa7134_set_gpio(dev, 4, 1);
+               saa7134_set_gpio(dev, 5, 1);*/
+/*             saa7134_set_gpio(dev, 6, 1);
+               saa7134_set_gpio(dev, 7, 1);
+               saa7134_set_gpio(dev, 8, 1);*/
+//             saa7134_set_gpio(dev, 10, 1);
+//             saa7134_set_gpio(dev, 11, 1);   /////////////////// HC4052
+//             saa7134_set_gpio(dev, 12, 1);
+/*             saa7134_set_gpio(dev, 13, 1);
+               saa7134_set_gpio(dev, 14, 1);
+               saa7134_set_gpio(dev, 15, 1);
+               saa7134_set_gpio(dev, 16, 1);
+               saa7134_set_gpio(dev, 17, 1);
+               saa7134_set_gpio(dev, 18, 1);
+               saa7134_set_gpio(dev, 19, 1);
+               saa7134_set_gpio(dev, 20, 1);
+               saa7134_set_gpio(dev, 21, 1);
+               saa7134_set_gpio(dev, 22, 1);
+               saa7134_set_gpio(dev, 24, 1);
+               saa7134_set_gpio(dev, 26, 1);*/
+
+               /* 
+                * Disable CE5039 DVB-S tuner now (SLEEP pin high) to prevent
+                * it from interfering with analog tuner detection
+                */
+               saa7134_set_gpio(dev, 23, 1);
+               break;
        case SAA7134_BOARD_VIDEOMATE_S350:
                dev->has_remote = SAA7134_REMOTE_GPIO;
                saa_andorl(SAA7134_GPIO_GPMODE0 >> 2,   0x0000C000, 0x0000C000);
diff --git a/drivers/media/pci/saa7134/saa7134-dvb.c 
b/drivers/media/pci/saa7134/saa7134-dvb.c
index b209de4..eae7348 100644
--- a/drivers/media/pci/saa7134/saa7134-dvb.c
+++ b/drivers/media/pci/saa7134/saa7134-dvb.c
@@ -1070,6 +1070,10 @@ static struct mt312_config zl10313_compro_s350_config = {
        .demod_address = 0x0e,
 };
 
+static struct mt312_config zl10313_avermedia_a706_config = {
+       .demod_address = 0x0e,
+};
+
 static struct lgdt3305_config hcw_lgdt3305_config = {
        .i2c_addr           = 0x0e,
        .mpeg_mode          = LGDT3305_MPEG_SERIAL,
@@ -1817,6 +1821,24 @@ static int dvb_init(struct saa7134_dev *dev)
                                   &prohdtv_pro2_tda18271_config);
                }
                break;
+       case SAA7134_BOARD_AVERMEDIA_A706:
+               /* Enable all DVB-S devices now */
+               /* CE5039 DVB-S tuner SLEEP pin low */
+               saa7134_set_gpio(dev, 23, 0);
+               /* CE6313 DVB-S demod SLEEP pin low */
+               saa7134_set_gpio(dev, 9, 0);
+               /* CE6313 DVB-S demod RESET# pin high */
+               saa7134_set_gpio(dev, 25, 1);
+               fe0->dvb.frontend = dvb_attach(mt312_attach,
+                               &zl10313_avermedia_a706_config, &dev->i2c_adap);
+               if (fe0->dvb.frontend) {
+                       fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
+                       if (dvb_attach(zl10039_attach, fe0->dvb.frontend,
+                                       0x60, &dev->i2c_adap) == NULL)
+                               wprintk("%s: No zl10039 found!\n",
+                                       __func__);
+               }
+               break;
        default:
                wprintk("Huh? unknown DVB card?\n");
                break;
diff --git a/drivers/media/pci/saa7134/saa7134-i2c.c 
b/drivers/media/pci/saa7134/saa7134-i2c.c
index a176ec3..d2f2924 100644
--- a/drivers/media/pci/saa7134/saa7134-i2c.c
+++ b/drivers/media/pci/saa7134/saa7134-i2c.c
@@ -255,7 +255,7 @@ static int saa7134_i2c_xfer(struct i2c_adapter *i2c_adap,
                        if (msgs[i].flags & I2C_M_RD)
                                addr |= 1;
                        if (i > 0 && msgs[i].flags &
-                           I2C_M_RD && msgs[i].addr != 0x40 &&
+                           I2C_M_RD && msgs[i].addr != 0x40 && msgs[i].addr != 
0x41 &&
                            msgs[i].addr != 0x19) {
                                /* workaround for a saa7134 i2c bug
                                 * needed to talk to the mt352 demux
diff --git a/drivers/media/pci/saa7134/saa7134-input.c 
b/drivers/media/pci/saa7134/saa7134-input.c
index e761262..6f43126 100644
--- a/drivers/media/pci/saa7134/saa7134-input.c
+++ b/drivers/media/pci/saa7134/saa7134-input.c
@@ -997,6 +997,9 @@ void saa7134_probe_i2c_ir(struct saa7134_dev *dev)
        case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
                info.addr = 0x40;
                break;
+       case SAA7134_BOARD_AVERMEDIA_A706:
+               info.addr = 0x41;
+               break;
        case SAA7134_BOARD_FLYDVB_TRIO:
                dev->init_data.name = "FlyDVB Trio";
                dev->init_data.get_key = get_key_flydvb_trio;
diff --git a/drivers/media/pci/saa7134/saa7134.h 
b/drivers/media/pci/saa7134/saa7134.h
index c24b651..6cef84d 100644
--- a/drivers/media/pci/saa7134/saa7134.h
+++ b/drivers/media/pci/saa7134/saa7134.h
@@ -332,6 +332,7 @@ struct saa7134_card_ir {
 #define SAA7134_BOARD_SENSORAY811_911       188
 #define SAA7134_BOARD_KWORLD_PC150U         189
 #define SAA7134_BOARD_ASUSTeK_PS3_100      190
+#define SAA7134_BOARD_AVERMEDIA_A706           191
 
 #define SAA7134_MAXBOARDS 32
 #define SAA7134_INPUT_MAX 8
diff --git a/drivers/media/tuners/tda8290.c b/drivers/media/tuners/tda8290.c
index 8c48521..7234428 100644
--- a/drivers/media/tuners/tda8290.c
+++ b/drivers/media/tuners/tda8290.c
@@ -65,7 +65,7 @@ static int tda8290_i2c_bridge(struct dvb_frontend *fe, int 
close)
        unsigned char  enable[2] = { 0x21, 0xC0 };
        unsigned char disable[2] = { 0x21, 0x00 };
        unsigned char *msg;
-
+return 0;
        if (close) {
                msg = enable;
                tuner_i2c_xfer_send(&priv->i2c_props, msg, 2);
@@ -87,7 +87,7 @@ static int tda8295_i2c_bridge(struct dvb_frontend *fe, int 
close)
        unsigned char disable[2] = { 0x46, 0x00 };
        unsigned char buf[3] = { 0x45, 0x01, 0x00 };
        unsigned char *msg;
-
+return 0;
        if (close) {
                msg = enable;
                tuner_i2c_xfer_send(&priv->i2c_props, msg, 2);
@@ -731,7 +731,7 @@ struct dvb_frontend *tda829x_attach(struct dvb_frontend *fe,
 {
        struct tda8290_priv *priv = NULL;
        char *name;
-
+       printk("%s, fe=%p, i2c_adap=%p, i2c_addr=0x%02x, cfg=%p\n", 
__FUNCTION__, fe, i2c_adap, i2c_addr, cfg);
        priv = kzalloc(sizeof(struct tda8290_priv), GFP_KERNEL);
        if (priv == NULL)
                return NULL;


-- 
Ondrej Zary
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to