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; }