Exemplo n.º 1
0
int SysDVBUnRegisterAdapter(dvb_t dev)
{
	DVBDev *p = (DVBDev *)dev;
	
	DBG_fCDVB("\n");
	
	p->demux_sw.dmx.remove_frontend(
					&p->demux_sw.dmx,
					&p->mem_frontend);
	p->demux_sw.dmx.remove_frontend(
					&p->demux_sw.dmx,
					&p->hw_frontend);
	dvb_dmxdev_release(&p->dmxdev_sw);
	dvb_dmx_release(&p->demux_sw);
	#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
	dvb_unregister_i2c_bus(master_xfer, p->i2c_bus->adapter,
				p->i2c_bus->id);
	#endif
	dvb_unregister_adapter(p->adapter);
	#if DVB_REG_NEWSTYLE
	#if 0 
	kfree(p->adapter);
	#else
	SysKFree(p->adapter);
	#endif 
	#endif

	DBG_fCDVB("done\n");
	return 0;
}
int ttpci_budget_deinit (struct budget *budget)
{
	struct saa7146_dev *dev = budget->dev;

	DEB_EE(("budget: %p\n", budget));

	budget_unregister (budget);

	dvb_unregister_i2c_bus (master_xfer, budget->i2c_bus->adapter,
				budget->i2c_bus->id);

	dvb_unregister_adapter (budget->dvb_adapter);

	tasklet_kill (&budget->vpe_tasklet);

	saa7146_pgtable_free (dev->pci, &budget->pt);

	vfree (budget->grabbing);

	return 0;
}
Exemplo n.º 3
0
int SysDVBRegisterAdapter(dvb_t dev, const char *name, int max_filters, void *device)
#endif

{
	int ret = 0;
	DVBDev *p = (DVBDev *)dev;

	DBG_fCDVB("\n");
	if( !p ) return -ENODEV;

	
	#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17)
	if( !device ) return -EINVAL;
	#endif
	

#if 0 
	strncpy(p->name, name, sizeof(p->name));
#else
	SysStrNCpy(p->name, name, sizeof(p->name));
#endif 

	
	#if DVB_REG_NEWSTYLE
	#if 0 
	p->adapter = kmalloc(sizeof(struct dvb_adapter), GFP_KERNEL);
	#else
	p->adapter = SysKMalloc(sizeof(struct dvb_adapter)+512, eKMALLOC_KERNEL); 
	#endif
	DBG_fCDVB("p->adapter=%p\n", p->adapter);
	if(NULL == p->adapter) {
		DBG_fCDVB("cannot kmalloc DVB adapter\n");
		ret = -ENOMEM;
		goto fail0;
	}

	#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25) 
	p->adapter->device = device;
	ret = dvb_register_adapter(p->adapter, p->name, THIS_MODULE, (struct device *)device, dvb_adapter_nr);
	
	#elif LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17)
	p->adapter->device = device;
	ret = dvb_register_adapter(p->adapter, p->name, THIS_MODULE, (struct device *)device);
	#else
	ret = dvb_register_adapter(p->adapter, p->name, THIS_MODULE);
	#endif
	
	
	#else 
	ret = dvb_register_adapter(&p->adapter, p->name, THIS_MODULE);
	#endif 

	if(ret<0) {
#if 0 
		printk(KERN_WARNING "%s: failed to register adapter(%d)",
			p->name, ret);
#else
		SysPrintk(KERN_WARNING "%s: failed to register adapter(%d)",
                        p->name, ret);
#endif 
		goto fail1;
	}
#if 0 
	printk(KERN_INFO "%s registered DVB adapter %d\n", 
		name, p->adapter->num);
#else
	SysPrintk(KERN_INFO "%s registered DVB adapter %d\n", 
	                name, p->adapter->num);
#endif 

	
	#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
	p->i2c_bus = dvb_register_i2c_bus(master_xfer, dev,
						  p->adapter, 111);
	if(!p->i2c_bus) {
		dvb_unregister_adapter(p->adapter);
#if 0 
		printk(KERN_WARNING "%s: failed to register dvb-i2c\n",
			p->name);
#else
		SysPrintk(KERN_WARNING "%s: failed to register dvb-i2c\n",
			p->name);
#endif 
		return -ENOMEM;
	}
	DBG_fCDVB("registered dvb-i2c %p\n", p->i2c_bus);
	#endif

	
	DBG_fCDVB("init software demux, demux_sw=%p\n", &p->demux_sw);
#if 0 
	memset(&p->demux_sw, 0, sizeof(struct dvb_demux)); 
#else
	SysMemSet(&p->demux_sw, 0, sizeof(struct dvb_demux)); 
#endif 
	p->demux_sw.priv = (void *)p;
	p->demux_sw.filternum = max_filters;
	p->demux_sw.feednum = max_filters;
	p->demux_sw.start_feed = demux_sw_start_feed;
	p->demux_sw.stop_feed = demux_sw_stop_feed;
	p->demux_sw.write_to_decoder = NULL;
	p->demux_sw.dmx.capabilities = 
			(DMX_TS_FILTERING |
			 DMX_SECTION_FILTERING |
			 DMX_MEMORY_BASED_FILTERING
			);

	ret = dvb_dmx_init(&p->demux_sw);
	if(ret) {
		printk(KERN_WARNING "%s: failed to init demux(%d)\n",
			p->name, ret);
		goto fail2;
	}

	
	DBG_fCDVB("init demux devices, dmxdev_sw=%p\n", &p->dmxdev_sw);
	p->dmxdev_sw.filternum = max_filters;
	p->dmxdev_sw.demux = &p->demux_sw.dmx;
	p->dmxdev_sw.capabilities = 0;

	ret = dvb_dmxdev_init(&p->dmxdev_sw, p->adapter);
	if(ret) {
#if 0 
		printk(KERN_WARNING "%s: failed to init dmxdev\n",
			p->name);
#else
		SysPrintk(KERN_WARNING "%s: failed to init dmxdev\n",
			p->name);
#endif 
		goto fail3;
	}

	
	DBG_fCDVB("add h/w frontend\n");
	p->hw_frontend.source = DMX_FRONTEND_0;
	ret = p->demux_sw.dmx.add_frontend(&p->demux_sw.dmx,
						   &p->hw_frontend);
	if(ret < 0) {
#if 0 
		printk(KERN_WARNING "%s: cannot add hw frontend\n",
			p->name);
#else
		SysPrintk(KERN_WARNING "%s: cannot add hw frontend, ret=%d\n",
			p->name, ret);
#endif 
		goto fail4;
	}

	
	DBG_fCDVB("add memory frontend\n");
	p->mem_frontend.source = DMX_MEMORY_FE;
	ret = p->demux_sw.dmx.add_frontend(&p->demux_sw.dmx,
					 &p->mem_frontend);
	if(ret < 0) {
#if 0 
		printk(KERN_WARNING "%s: cannot add mem frontend\n",
			p->name);
#else
		SysPrintk(KERN_WARNING "%s: cannot add mem frontend\n",
			p->name);
#endif 
		goto fail5;
	}

	ret = p->demux_sw.dmx.connect_frontend(
					&p->demux_sw.dmx,
					&p->mem_frontend);
	if(ret < 0) {
#if 0 
		printk(KERN_WARNING "%s: cannot connect frontend\n",
			p->name);
#else
		SysPrintk(KERN_WARNING "%s: cannot connect frontend, ret=%d\n",
			p->name, ret);
#endif 
		goto fail6;
	}

	DBG_fCDVB("done\n");
	goto done;

fail6:
	p->demux_sw.dmx.remove_frontend(&p->demux_sw.dmx,
						&p->mem_frontend);
fail5:
	p->demux_sw.dmx.remove_frontend(&p->demux_sw.dmx,
						&p->hw_frontend);
fail4:
	dvb_dmxdev_release(&p->dmxdev_sw);
fail3:
	dvb_dmx_release(&p->demux_sw);
fail2:
	#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
	dvb_unregister_i2c_bus(master_xfer, p->i2c_bus->adapter,
				p->i2c_bus->id);
	#endif
	dvb_unregister_adapter(p->adapter);
fail1:
	#if DVB_REG_NEWSTYLE
	#if 0 
	kfree(p->adapter);
	#else
	SysKFree(p->adapter);
	#endif 
fail0:
	#endif
done:
	return ret;

}
int ttpci_budget_init (struct budget *budget,
		       struct saa7146_dev* dev,
		       struct saa7146_pci_extension_data *info)
{
	int length = TS_WIDTH*TS_HEIGHT;
	int ret = 0;
	struct budget_info *bi = info->ext_priv;

	memset(budget, 0, sizeof(struct budget));

	DEB_EE(("dev: %p, budget: %p\n", dev, budget));

	budget->card = bi;
	budget->dev = (struct saa7146_dev *) dev;

	dvb_register_adapter(&budget->dvb_adapter, budget->card->name, THIS_MODULE);

	/* set dd1 stream a & b */
      	saa7146_write(dev, DD1_STREAM_B, 0x00000000);
	saa7146_write(dev, MC2, (MASK_09 | MASK_25));
	saa7146_write(dev, MC2, (MASK_10 | MASK_26));
	saa7146_write(dev, DD1_INIT, 0x02000000);
	saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));

       	if (bi->type != BUDGET_FS_ACTIVY)
		budget->video_port = BUDGET_VIDEO_PORTB;
	else
		budget->video_port = BUDGET_VIDEO_PORTA;
	spin_lock_init(&budget->feedlock);

	/* the Siemens DVB needs this if you want to have the i2c chips
           get recognized before the main driver is loaded */
	if (bi->type != BUDGET_FS_ACTIVY)
		saa7146_write(dev, GPIO_CTRL, 0x500000); /* GPIO 3 = 1 */
	
	saa7146_i2c_adapter_prepare(dev, NULL, 0, SAA7146_I2C_BUS_BIT_RATE_120);

	budget->i2c_bus = dvb_register_i2c_bus (master_xfer, dev,
						budget->dvb_adapter, 0);

	if (!budget->i2c_bus) {
		dvb_unregister_adapter (budget->dvb_adapter);
		return -ENOMEM;
	}

	ttpci_eeprom_parse_mac(budget->i2c_bus);

	if( NULL == (budget->grabbing = saa7146_vmalloc_build_pgtable(dev->pci,length,&budget->pt))) {
		ret = -ENOMEM;
		goto err;
	}

	saa7146_write(dev, PCI_BT_V1, 0x001c0000);
	/* upload all */
        saa7146_write(dev, GPIO_CTRL, 0x000000);

	tasklet_init (&budget->vpe_tasklet, vpeirq, (unsigned long) budget);

	/* frontend power on */
	if (bi->type == BUDGET_FS_ACTIVY)
		saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI);
	else
		saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTHI);

        if (budget_register(budget) == 0) {
		return 0;
	}
err:
	if (budget->grabbing)
		vfree(budget->grabbing);

	dvb_unregister_i2c_bus (master_xfer,budget->i2c_bus->adapter,
				budget->i2c_bus->id);

	dvb_unregister_adapter (budget->dvb_adapter);

	return ret;
}