⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cx88-dvb.c

📁 trident tm5600的linux驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
				goto frontend_detach;		}		break;	case CX88_BOARD_PCHDTV_HD5500:		dev->ts_gen_cntrl = 0x08;		/* Do a hardware reset of chip before using it. */		cx_clear(MO_GP0_IO, 1);		mdelay(100);		cx_set(MO_GP0_IO, 1);		mdelay(200);		fe0->dvb.frontend = dvb_attach(lgdt330x_attach,					       &pchdtv_hd5500,					       &core->i2c_adap);		if (fe0->dvb.frontend != NULL) {			if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,					&core->i2c_adap, 0x61,					TUNER_LG_TDVS_H06XF))				goto frontend_detach;			if (!dvb_attach(tda9887_attach, fe0->dvb.frontend,				   &core->i2c_adap, 0x43))				goto frontend_detach;		}		break;	case CX88_BOARD_ATI_HDTVWONDER:		fe0->dvb.frontend = dvb_attach(nxt200x_attach,					       &ati_hdtvwonder,					       &core->i2c_adap);		if (fe0->dvb.frontend != NULL) {			if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,					&core->i2c_adap, 0x61,					TUNER_PHILIPS_TUV1236D))				goto frontend_detach;		}		break;	case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:	case CX88_BOARD_HAUPPAUGE_NOVASE2_S1:		fe0->dvb.frontend = dvb_attach(cx24123_attach,					       &hauppauge_novas_config,					       &core->i2c_adap);		if (fe0->dvb.frontend) {			if (!dvb_attach(isl6421_attach, fe0->dvb.frontend,					&core->i2c_adap, 0x08, ISL6421_DCL, 0x00))				goto frontend_detach;		}		break;	case CX88_BOARD_KWORLD_DVBS_100:		fe0->dvb.frontend = dvb_attach(cx24123_attach,					       &kworld_dvbs_100_config,					       &core->i2c_adap);		if (fe0->dvb.frontend) {			core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;			fe0->dvb.frontend->ops.set_voltage = kworld_dvbs_100_set_voltage;		}		break;	case CX88_BOARD_GENIATECH_DVBS:		fe0->dvb.frontend = dvb_attach(cx24123_attach,					       &geniatech_dvbs_config,					       &core->i2c_adap);		if (fe0->dvb.frontend) {			core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;			fe0->dvb.frontend->ops.set_voltage = geniatech_dvbs_set_voltage;		}		break;	case CX88_BOARD_PINNACLE_PCTV_HD_800i:		fe0->dvb.frontend = dvb_attach(s5h1409_attach,					       &pinnacle_pctv_hd_800i_config,					       &core->i2c_adap);		if (fe0->dvb.frontend != NULL) {			if (!dvb_attach(xc5000_attach, fe0->dvb.frontend,					&core->i2c_adap,					&pinnacle_pctv_hd_800i_tuner_config))				goto frontend_detach;		}		break;	case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:		fe0->dvb.frontend = dvb_attach(s5h1409_attach,						&dvico_hdtv5_pci_nano_config,						&core->i2c_adap);		if (fe0->dvb.frontend != NULL) {			struct dvb_frontend *fe;			struct xc2028_config cfg = {				.i2c_adap  = &core->i2c_adap,				.i2c_addr  = 0x61,			};			static struct xc2028_ctrl ctl = {				.fname       = XC2028_DEFAULT_FIRMWARE,				.max_len     = 64,				.scode_table = XC3028_FE_OREN538,			};			fe = dvb_attach(xc2028_attach,					fe0->dvb.frontend, &cfg);			if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)				fe->ops.tuner_ops.set_config(fe, &ctl);		}		break;	 case CX88_BOARD_PINNACLE_HYBRID_PCTV:		fe0->dvb.frontend = dvb_attach(zl10353_attach,					       &cx88_pinnacle_hybrid_pctv,					       &core->i2c_adap);		if (fe0->dvb.frontend) {			fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;			if (attach_xc3028(0x61, dev) < 0)				goto frontend_detach;		}		break;	 case CX88_BOARD_GENIATECH_X8000_MT:		dev->ts_gen_cntrl = 0x00;		fe0->dvb.frontend = dvb_attach(zl10353_attach,					       &cx88_geniatech_x8000_mt,					       &core->i2c_adap);		if (attach_xc3028(0x61, dev) < 0)			goto frontend_detach;		break;	 case CX88_BOARD_KWORLD_ATSC_120:		fe0->dvb.frontend = dvb_attach(s5h1409_attach,					       &kworld_atsc_120_config,					       &core->i2c_adap);		if (attach_xc3028(0x61, dev) < 0)			goto frontend_detach;		break;	case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD:		fe0->dvb.frontend = dvb_attach(s5h1411_attach,					       &dvico_fusionhdtv7_config,					       &core->i2c_adap);		if (fe0->dvb.frontend != NULL) {			if (!dvb_attach(xc5000_attach, fe0->dvb.frontend,					&core->i2c_adap,					&dvico_fusionhdtv7_tuner_config))				goto frontend_detach;		}		break;	case CX88_BOARD_HAUPPAUGE_HVR4000:		/* DVB-S/S2 Init */		fe0->dvb.frontend = dvb_attach(cx24116_attach,			&hauppauge_hvr4000_config,			&dev->core->i2c_adap);		if (fe0->dvb.frontend) {			if(!dvb_attach(isl6421_attach, fe0->dvb.frontend,				&dev->core->i2c_adap, 0x08, ISL6421_DCL, 0x00)) {				dprintk( 1, "%s(): HVR4000 - DVB-S LNB Init: failed\n", __func__);			}		} else {			dprintk( 1, "%s(): HVR4000 - DVB-S Init: failed\n", __func__);		}		/* DVB-T Init */		fe1 = videobuf_dvb_get_frontend(&dev->frontends, 2);		if (fe1) {			dev->frontends.gate = 2;			mfe_shared = 1;			fe1->dvb.frontend = dvb_attach(cx22702_attach,				&hauppauge_hvr_config,				&dev->core->i2c_adap);			if (fe1->dvb.frontend) {				fe1->dvb.frontend->id = 1;				if(!dvb_attach(simple_tuner_attach, fe1->dvb.frontend,					&dev->core->i2c_adap, 0x61,					TUNER_PHILIPS_FMD1216ME_MK3)) {					dprintk( 1, "%s(): HVR4000 - DVB-T misc Init: failed\n", __func__);				}			} else {				dprintk( 1, "%s(): HVR4000 - DVB-T Init: failed\n", __func__);			}		} else {			dprintk( 1, "%s(): HVR4000 - DVB-T Init: can't find frontend 2.\n", __func__);		}		break;	case CX88_BOARD_HAUPPAUGE_HVR4000LITE:		fe0->dvb.frontend = dvb_attach(cx24116_attach,			&hauppauge_hvr4000_config,			&dev->core->i2c_adap);		if (fe0->dvb.frontend) {			dvb_attach(isl6421_attach, fe0->dvb.frontend,				&dev->core->i2c_adap,				0x08, ISL6421_DCL, 0x00);		}		break;	case CX88_BOARD_TEVII_S420:		fe0->dvb.frontend = dvb_attach(stv0299_attach,						&tevii_tuner_sharp_config,						&core->i2c_adap);		if (fe0->dvb.frontend != NULL) {			if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend, 0x60,					&core->i2c_adap, DVB_PLL_OPERA1))				goto frontend_detach;			core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;			fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;		} else {			fe0->dvb.frontend = dvb_attach(stv0288_attach,							    &tevii_tuner_earda_config,							    &core->i2c_adap);				if (fe0->dvb.frontend != NULL) {					if (!dvb_attach(stb6000_attach, fe0->dvb.frontend, 0x61,						&core->i2c_adap))					goto frontend_detach;				core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;				fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;			}		}		break;	case CX88_BOARD_TEVII_S460:		fe0->dvb.frontend = dvb_attach(cx24116_attach,					       &tevii_s460_config,					       &core->i2c_adap);		if (fe0->dvb.frontend != NULL) {			core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;			fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;		}		break;	case CX88_BOARD_OMICOM_SS4_PCI:	case CX88_BOARD_TBS_8920:	case CX88_BOARD_PROF_7300:		fe0->dvb.frontend = dvb_attach(cx24116_attach,					       &hauppauge_hvr4000_config,					       &core->i2c_adap);		if (fe0->dvb.frontend != NULL) {			core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;			fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;		}		break;	default:		printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card isn't supported yet\n",		       core->name);		break;	}	if ( (NULL == fe0->dvb.frontend) || (fe1 && NULL == fe1->dvb.frontend) ) {		printk(KERN_ERR		       "%s/2: frontend initialization failed\n",		       core->name);		return -EINVAL;	}	/* define general-purpose callback pointer */	fe0->dvb.frontend->callback = cx88_tuner_callback;	/* Ensure all frontends negotiate bus access */	fe0->dvb.frontend->ops.ts_bus_ctrl = cx88_dvb_bus_ctrl;	if (fe1)		fe1->dvb.frontend->ops.ts_bus_ctrl = cx88_dvb_bus_ctrl;	/* Put the analog decoder in standby to keep it quiet */	cx88_call_i2c_clients(core, TUNER_SET_STANDBY, NULL);	/* register everything */	return videobuf_dvb_register_bus(&dev->frontends, THIS_MODULE, dev,		&dev->pci->dev, adapter_nr, mfe_shared);frontend_detach:	videobuf_dvb_dealloc_frontends(&dev->frontends);	return -EINVAL;}/* ----------------------------------------------------------- *//* CX8802 MPEG -> mini driver - We have been given the hardware */static int cx8802_dvb_advise_acquire(struct cx8802_driver *drv){	struct cx88_core *core = drv->core;	int err = 0;	dprintk( 1, "%s\n", __func__);	switch (core->boardnr) {	case CX88_BOARD_HAUPPAUGE_HVR1300:		/* We arrive here with either the cx23416 or the cx22702		 * on the bus. Take the bus from the cx23416 and enable the		 * cx22702 demod		 */		cx_set(MO_GP0_IO,   0x00000080); /* cx22702 out of reset and enable */		cx_clear(MO_GP0_IO, 0x00000004);		udelay(1000);		break;	case CX88_BOARD_HAUPPAUGE_HVR3000:	case CX88_BOARD_HAUPPAUGE_HVR4000:		if(core->dvbdev->frontends.active_fe_id == 1) {			/* DVB-S/S2 Enabled */			/* Toggle reset on cx22702 leaving i2c active */			cx_write(MO_GP0_IO, (core->board.input[0].gpio0 & 0x0000ff00) | 0x00000080);			udelay(1000);			cx_clear(MO_GP0_IO, 0x00000080);			udelay(50);			cx_set(MO_GP0_IO, 0x00000080); /* cx22702 out of reset */			cx_set(MO_GP0_IO, 0x00000004); /* tri-state the cx22702 pins */			udelay(1000);			cx_write(MO_SRST_IO, 1); /* Take the cx24116/cx24123 out of reset */			core->dvbdev->ts_gen_cntrl = 0x02; /* Parallel IO */		} else		if (core->dvbdev->frontends.active_fe_id == 2) {			/* DVB-T Enabled */			/* Put the cx24116/cx24123 into reset */			cx_write(MO_SRST_IO, 0);			/* cx22702 out of reset and enable it */			cx_set(MO_GP0_IO,   0x00000080);			cx_clear(MO_GP0_IO, 0x00000004);			core->dvbdev->ts_gen_cntrl = 0x0c; /* Serial IO */			udelay(1000);		}		break;	default:		err = -ENODEV;	}	return err;}/* CX8802 MPEG -> mini driver - We no longer have the hardware */static int cx8802_dvb_advise_release(struct cx8802_driver *drv){	struct cx88_core *core = drv->core;	int err = 0;	dprintk( 1, "%s\n", __func__);	switch (core->boardnr) {	case CX88_BOARD_HAUPPAUGE_HVR1300:		/* Do Nothing, leave the cx22702 on the bus. */#if 0		 cx_set(MO_GP0_IO, 0x00000004);#endif		break;	case CX88_BOARD_HAUPPAUGE_HVR3000:	case CX88_BOARD_HAUPPAUGE_HVR4000:		break;	default:		err = -ENODEV;	}	return err;}static int cx8802_dvb_probe(struct cx8802_driver *drv){	struct cx88_core *core = drv->core;	struct cx8802_dev *dev = drv->core->dvbdev;	int err, i;	struct videobuf_dvb_frontend *fe;	dprintk( 1, "%s\n", __func__);	dprintk( 1, " ->being probed by Card=%d Name=%s, PCI %02x:%02x\n",		core->boardnr,		core->name,		core->pci_bus,		core->pci_slot);	err = -ENODEV;	if (!(core->board.mpeg & CX88_MPEG_DVB))		goto fail_core;	/* If vp3054 isn't enabled, a stub will just return 0 */	err = vp3054_i2c_probe(dev);	if (0 != err)		goto fail_core;	/* dvb stuff */	printk(KERN_INFO "%s/2: cx2388x based DVB/ATSC card\n", core->name);	dev->ts_gen_cntrl = 0x0c;	for (i = 1; i <= core->board.num_frontends; i++) {		fe = videobuf_dvb_get_frontend(&core->dvbdev->frontends, i);		if (!fe) {			printk(KERN_ERR "%s() failed to get frontend(%d)\n", __func__, i);			continue;		}		videobuf_queue_sg_init(&fe->dvb.dvbq, &dvb_qops,			    &dev->pci->dev, &dev->slock,			    V4L2_BUF_TYPE_VIDEO_CAPTURE,			    V4L2_FIELD_TOP,			    sizeof(struct cx88_buffer),			    dev);		/* init struct videobuf_dvb */		fe->dvb.name = dev->core->name;	}	err = dvb_register(dev);	if (err != 0)		printk(KERN_ERR "%s/2: dvb_register failed (err = %d)\n",		       core->name, err);fail_core:	return err;}static int cx8802_dvb_remove(struct cx8802_driver *drv){	struct cx88_core *core = drv->core;	struct cx8802_dev *dev = drv->core->dvbdev;	dprintk( 1, "%s\n", __func__);	videobuf_dvb_unregister_bus(&dev->frontends);	vp3054_i2c_remove(dev);	return 0;}static struct cx8802_driver cx8802_dvb_driver = {	.type_id        = CX88_MPEG_DVB,	.hw_access      = CX8802_DRVCTL_SHARED,	.probe          = cx8802_dvb_probe,	.remove         = cx8802_dvb_remove,	.advise_acquire = cx8802_dvb_advise_acquire,	.advise_release = cx8802_dvb_advise_release,};static int dvb_init(void){	printk(KERN_INFO "cx88/2: cx2388x dvb driver version %d.%d.%d loaded\n",	       (CX88_VERSION_CODE >> 16) & 0xff,	       (CX88_VERSION_CODE >>  8) & 0xff,	       CX88_VERSION_CODE & 0xff);#ifdef SNAPSHOT	printk(KERN_INFO "cx2388x: snapshot date %04d-%02d-%02d\n",	       SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100);#endif	return cx8802_register_driver(&cx8802_dvb_driver);}static void dvb_fini(void){	cx8802_unregister_driver(&cx8802_dvb_driver);}module_init(dvb_init);module_exit(dvb_fini);/* * Local variables: * c-basic-offset: 8 * compile-command: "make DVB=1" * End: */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -