void bttv_init_card2()

in pci/bt8xx/bttv-cards.c [3326:3643]


void bttv_init_card2(struct bttv *btv)
{
	btv->tuner_type = UNSET;

	if (BTTV_BOARD_UNKNOWN == btv->c.type) {
		bttv_readee(btv,eeprom_data,0xa0);
		identify_by_eeprom(btv,eeprom_data);
	}

	switch (btv->c.type) {
	case BTTV_BOARD_MIRO:
	case BTTV_BOARD_MIROPRO:
	case BTTV_BOARD_PINNACLE:
	case BTTV_BOARD_PINNACLEPRO:
		/* miro/pinnacle */
		miro_pinnacle_gpio(btv);
		break;
	case BTTV_BOARD_FLYVIDEO_98:
	case BTTV_BOARD_MAXI:
	case BTTV_BOARD_LIFE_FLYKIT:
	case BTTV_BOARD_FLYVIDEO:
	case BTTV_BOARD_TYPHOON_TVIEW:
	case BTTV_BOARD_CHRONOS_VS2:
	case BTTV_BOARD_FLYVIDEO_98FM:
	case BTTV_BOARD_FLYVIDEO2000:
	case BTTV_BOARD_FLYVIDEO98EZ:
	case BTTV_BOARD_CONFERENCETV:
	case BTTV_BOARD_LIFETEC_9415:
		flyvideo_gpio(btv);
		break;
	case BTTV_BOARD_HAUPPAUGE:
	case BTTV_BOARD_HAUPPAUGE878:
	case BTTV_BOARD_HAUPPAUGEPVR:
		/* pick up some config infos from the eeprom */
		bttv_readee(btv,eeprom_data,0xa0);
		hauppauge_eeprom(btv);
		break;
	case BTTV_BOARD_AVERMEDIA98:
	case BTTV_BOARD_AVPHONE98:
		bttv_readee(btv,eeprom_data,0xa0);
		avermedia_eeprom(btv);
		break;
	case BTTV_BOARD_PXC200:
		init_PXC200(btv);
		break;
	case BTTV_BOARD_PICOLO_TETRA_CHIP:
		picolo_tetra_init(btv);
		break;
	case BTTV_BOARD_VHX:
		btv->has_radio    = 1;
		btv->has_tea575x  = 1;
		btv->tea_gpio.wren = 5;
		btv->tea_gpio.most = 6;
		btv->tea_gpio.clk  = 3;
		btv->tea_gpio.data = 4;
		tea575x_init(btv);
		break;
	case BTTV_BOARD_VOBIS_BOOSTAR:
	case BTTV_BOARD_TERRATV:
		terratec_active_radio_upgrade(btv);
		break;
	case BTTV_BOARD_MAGICTVIEW061:
		if (btv->cardid == 0x3002144f) {
			btv->has_radio=1;
			pr_info("%d: radio detected by subsystem id (CPH05x)\n",
				btv->c.nr);
		}
		break;
	case BTTV_BOARD_STB2:
		if (btv->cardid == 0x3060121a) {
			/* Fix up entry for 3DFX VoodooTV 100,
			   which is an OEM STB card variant. */
			btv->has_radio=0;
			btv->tuner_type=TUNER_TEMIC_NTSC;
		}
		break;
	case BTTV_BOARD_OSPREY1x0:
	case BTTV_BOARD_OSPREY1x0_848:
	case BTTV_BOARD_OSPREY101_848:
	case BTTV_BOARD_OSPREY1x1:
	case BTTV_BOARD_OSPREY1x1_SVID:
	case BTTV_BOARD_OSPREY2xx:
	case BTTV_BOARD_OSPREY2x0_SVID:
	case BTTV_BOARD_OSPREY2x0:
	case BTTV_BOARD_OSPREY440:
	case BTTV_BOARD_OSPREY500:
	case BTTV_BOARD_OSPREY540:
	case BTTV_BOARD_OSPREY2000:
		bttv_readee(btv,eeprom_data,0xa0);
		osprey_eeprom(btv, eeprom_data);
		break;
	case BTTV_BOARD_IDS_EAGLE:
		init_ids_eagle(btv);
		break;
	case BTTV_BOARD_MODTEC_205:
		bttv_readee(btv,eeprom_data,0xa0);
		modtec_eeprom(btv);
		break;
	case BTTV_BOARD_LMLBT4:
		init_lmlbt4x(btv);
		break;
	case BTTV_BOARD_TIBET_CS16:
		tibetCS16_init(btv);
		break;
	case BTTV_BOARD_KODICOM_4400R:
		kodicom4400r_init(btv);
		break;
	case BTTV_BOARD_GEOVISION_GV800S:
		gv800s_init(btv);
		break;
	}

	/* pll configuration */
	if (!(btv->id==848 && btv->revision==0x11)) {
		/* defaults from card list */
		if (PLL_28 == bttv_tvcards[btv->c.type].pll) {
			btv->pll.pll_ifreq=28636363;
			btv->pll.pll_crystal=BT848_IFORM_XT0;
		}
		if (PLL_35 == bttv_tvcards[btv->c.type].pll) {
			btv->pll.pll_ifreq=35468950;
			btv->pll.pll_crystal=BT848_IFORM_XT1;
		}
		if (PLL_14 == bttv_tvcards[btv->c.type].pll) {
			btv->pll.pll_ifreq = 14318181;
			btv->pll.pll_crystal = BT848_IFORM_XT0;
		}
		/* insmod options can override */
		switch (pll[btv->c.nr]) {
		case 0: /* none */
			btv->pll.pll_crystal = 0;
			btv->pll.pll_ifreq   = 0;
			btv->pll.pll_ofreq   = 0;
			break;
		case 1: /* 28 MHz */
		case 28:
			btv->pll.pll_ifreq   = 28636363;
			btv->pll.pll_ofreq   = 0;
			btv->pll.pll_crystal = BT848_IFORM_XT0;
			break;
		case 2: /* 35 MHz */
		case 35:
			btv->pll.pll_ifreq   = 35468950;
			btv->pll.pll_ofreq   = 0;
			btv->pll.pll_crystal = BT848_IFORM_XT1;
			break;
		case 3: /* 14 MHz */
		case 14:
			btv->pll.pll_ifreq   = 14318181;
			btv->pll.pll_ofreq   = 0;
			btv->pll.pll_crystal = BT848_IFORM_XT0;
			break;
		}
	}
	btv->pll.pll_current = -1;

	/* tuner configuration (from card list / autodetect / insmod option) */
	if (UNSET != bttv_tvcards[btv->c.type].tuner_type)
		if (UNSET == btv->tuner_type)
			btv->tuner_type = bttv_tvcards[btv->c.type].tuner_type;
	if (UNSET != tuner[btv->c.nr])
		btv->tuner_type = tuner[btv->c.nr];

	if (btv->tuner_type == TUNER_ABSENT)
		pr_info("%d: tuner absent\n", btv->c.nr);
	else if (btv->tuner_type == UNSET)
		pr_warn("%d: tuner type unset\n", btv->c.nr);
	else
		pr_info("%d: tuner type=%d\n", btv->c.nr, btv->tuner_type);

	if (autoload != UNSET) {
		pr_warn("%d: the autoload option is obsolete\n", btv->c.nr);
		pr_warn("%d: use option msp3400, tda7432 or tvaudio to override which audio module should be used\n",
			btv->c.nr);
	}

	if (UNSET == btv->tuner_type)
		btv->tuner_type = TUNER_ABSENT;

	btv->dig = bttv_tvcards[btv->c.type].has_dig_in ?
		   bttv_tvcards[btv->c.type].video_inputs - 1 : UNSET;
	btv->svhs = bttv_tvcards[btv->c.type].svhs == NO_SVHS ?
		    UNSET : bttv_tvcards[btv->c.type].svhs;
	if (svhs[btv->c.nr] != UNSET)
		btv->svhs = svhs[btv->c.nr];
	if (remote[btv->c.nr] != UNSET)
		btv->has_remote = remote[btv->c.nr];

	if (bttv_tvcards[btv->c.type].has_radio)
		btv->has_radio = 1;
	if (bttv_tvcards[btv->c.type].has_remote)
		btv->has_remote = 1;
	if (!bttv_tvcards[btv->c.type].no_gpioirq)
		btv->gpioirq = 1;
	if (bttv_tvcards[btv->c.type].volume_gpio)
		btv->volume_gpio = bttv_tvcards[btv->c.type].volume_gpio;
	if (bttv_tvcards[btv->c.type].audio_mode_gpio)
		btv->audio_mode_gpio = bttv_tvcards[btv->c.type].audio_mode_gpio;

	if (btv->tuner_type == TUNER_ABSENT)
		return;  /* no tuner or related drivers to load */

	if (btv->has_saa6588 || saa6588[btv->c.nr]) {
		/* Probe for RDS receiver chip */
		static const unsigned short addrs[] = {
			0x20 >> 1,
			0x22 >> 1,
			I2C_CLIENT_END
		};
		struct v4l2_subdev *sd;

		sd = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
			&btv->c.i2c_adap, "saa6588", 0, addrs);
		btv->has_saa6588 = (sd != NULL);
	}

	/* try to detect audio/fader chips */

	/* First check if the user specified the audio chip via a module
	   option. */

	switch (audiodev[btv->c.nr]) {
	case -1:
		return;	/* do not load any audio module */

	case 0: /* autodetect */
		break;

	case 1: {
		/* The user specified that we should probe for msp3400 */
		static const unsigned short addrs[] = {
			I2C_ADDR_MSP3400 >> 1,
			I2C_ADDR_MSP3400_ALT >> 1,
			I2C_CLIENT_END
		};

		btv->sd_msp34xx = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
			&btv->c.i2c_adap, "msp3400", 0, addrs);
		if (btv->sd_msp34xx)
			return;
		goto no_audio;
	}

	case 2: {
		/* The user specified that we should probe for tda7432 */
		static const unsigned short addrs[] = {
			I2C_ADDR_TDA7432 >> 1,
			I2C_CLIENT_END
		};

		if (v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
				&btv->c.i2c_adap, "tda7432", 0, addrs))
			return;
		goto no_audio;
	}

	case 3: {
		/* The user specified that we should probe for tvaudio */
		btv->sd_tvaudio = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
			&btv->c.i2c_adap, "tvaudio", 0, tvaudio_addrs());
		if (btv->sd_tvaudio)
			return;
		goto no_audio;
	}

	default:
		pr_warn("%d: unknown audiodev value!\n", btv->c.nr);
		return;
	}

	/* There were no overrides, so now we try to discover this through the
	   card definition */

	/* probe for msp3400 first: this driver can detect whether or not
	   it really is a msp3400, so it will return NULL when the device
	   found is really something else (e.g. a tea6300). */
	if (!bttv_tvcards[btv->c.type].no_msp34xx) {
		btv->sd_msp34xx = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
			&btv->c.i2c_adap, "msp3400",
			0, I2C_ADDRS(I2C_ADDR_MSP3400 >> 1));
	} else if (bttv_tvcards[btv->c.type].msp34xx_alt) {
		btv->sd_msp34xx = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
			&btv->c.i2c_adap, "msp3400",
			0, I2C_ADDRS(I2C_ADDR_MSP3400_ALT >> 1));
	}

	/* If we found a msp34xx, then we're done. */
	if (btv->sd_msp34xx)
		return;

	/* Now see if we can find one of the tvaudio devices. */
	btv->sd_tvaudio = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
		&btv->c.i2c_adap, "tvaudio", 0, tvaudio_addrs());
	if (btv->sd_tvaudio) {
		/* There may be two tvaudio chips on the card, so try to
		   find another. */
		v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
			&btv->c.i2c_adap, "tvaudio", 0, tvaudio_addrs());
	}

	/* it might also be a tda7432. */
	if (!bttv_tvcards[btv->c.type].no_tda7432) {
		static const unsigned short addrs[] = {
			I2C_ADDR_TDA7432 >> 1,
			I2C_CLIENT_END
		};

		btv->sd_tda7432 = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
				&btv->c.i2c_adap, "tda7432", 0, addrs);
		if (btv->sd_tda7432)
			return;
	}
	if (btv->sd_tvaudio)
		return;

no_audio:
	pr_warn("%d: audio absent, no audio device found!\n", btv->c.nr);
}