Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 34fe2784 authored by Ondrej Zary's avatar Ondrej Zary Committed by Mauro Carvalho Chehab
Browse files

[media] saa7134: Add AverMedia A706 AverTV Satellite Hybrid+FM



Add AverMedia AverTV Satellite Hybrid+FM (A706) card to saa7134 driver.
Working: analog inputs, TV, FM radio and IR remote control.
Untested: DVB-S.

Signed-off-by: default avatarOndrej Zary <linux@rainbow-software.org>
Signed-off-by: default avatarMichael Krufky <mkrufky@linuxtv.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent cdcd141c
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -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;
+53 −0
Original line number Diff line number Diff line
@@ -50,6 +50,11 @@ static char name_svideo[] = "S-Video";
/* ------------------------------------------------------------------ */
/* board config info                                                  */

static struct tda18271_std_map aver_a706_std_map = {
	.fm_radio = { .if_freq = 5500, .fm_rfn = 0, .agc_mode = 3, .std = 0,
		      .if_lvl = 0, .rfagc_top = 0x2c, },
};

/* If radio_type !=UNSET, radio_addr should be specified
 */

@@ -5790,6 +5795,37 @@ struct saa7134_board saa7134_boards[] = {
			.gpio = 0x6010000,
		} },
	},
	[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,
		.tda829x_conf   = { .lna_cfg = 0, .no_i2c_gate = 1,
				    .tda18271_std_map = &aver_a706_std_map },
		.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,
		},
	},

};

@@ -7036,6 +7072,12 @@ struct pci_device_id saa7134_pci_tbl[] = {
		.subvendor    = 0x6000,
		.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,
@@ -7585,6 +7627,17 @@ 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:
		/* radio antenna select: tristate both as in Windows driver */
		saa7134_set_gpio(dev, 12, 3);	/* TV antenna */
		saa7134_set_gpio(dev, 13, 3);	/* FM antenna */
		dev->has_remote = SAA7134_REMOTE_I2C;
		/*
		 * 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);
+23 −0
Original line number Diff line number Diff line
@@ -1073,6 +1073,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,
@@ -1822,6 +1826,25 @@ 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);
		msleep(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;
+1 −0
Original line number Diff line number Diff line
@@ -256,6 +256,7 @@ static int saa7134_i2c_xfer(struct i2c_adapter *i2c_adap,
				addr |= 1;
			if (i > 0 && msgs[i].flags &
			    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
+3 −0
Original line number Diff line number Diff line
@@ -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;
Loading