X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fmedia%2Fdvb%2Fttpci%2Fbudget-core.c;h=669105a9b1182dc8ccec855d3d0d902bf62381fe;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=15cf7442217be3addeac3e01ceb281094f6dfdf4;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/drivers/media/dvb/ttpci/budget-core.c b/drivers/media/dvb/ttpci/budget-core.c index 15cf74422..669105a9b 100644 --- a/drivers/media/dvb/ttpci/budget-core.c +++ b/drivers/media/dvb/ttpci/budget-core.c @@ -34,10 +34,15 @@ * the project's page is at http://www.linuxtv.org/dvb/ */ +#include + #include "budget.h" #include "ttpci-eeprom.h" -int budget_debug = 0; +int budget_debug; + +module_param_named(debug, budget_debug, int, 0644); +MODULE_PARM_DESC(budget_debug, "Turn on/off budget debugging (default:off)."); /**************************************************************************** * TT budget / WinTV Nova @@ -45,13 +50,13 @@ int budget_debug = 0; static int stop_ts_capture(struct budget *budget) { - DEB_EE(("budget: %p\n",budget)); + dprintk(2, "budget: %p\n", budget); if (--budget->feeding) return budget->feeding; saa7146_write(budget->dev, MC1, MASK_20); // DMA3 off - IER_DISABLE(budget->dev, MASK_10); + SAA7146_IER_DISABLE(budget->dev, MASK_10); return 0; } @@ -60,7 +65,7 @@ static int start_ts_capture (struct budget *budget) { struct saa7146_dev *dev=budget->dev; - DEB_EE(("budget: %p\n",budget)); + dprintk(2, "budget: %p\n", budget); if (budget->feeding) return ++budget->feeding; @@ -69,8 +74,7 @@ static int start_ts_capture (struct budget *budget) memset(budget->grabbing, 0x00, TS_HEIGHT*TS_WIDTH); - saa7146_write(dev, PCI_BT_V1, 0x001c0000 | - (saa7146_read(dev, PCI_BT_V1) & ~0x001f0000)); + saa7146_write(dev, PCI_BT_V1, 0x001c0000 | (saa7146_read(dev, PCI_BT_V1) & ~0x001f0000)); budget->tsf=0xff; budget->ttbp=0; @@ -85,11 +89,18 @@ static int start_ts_capture (struct budget *budget) * Pitch: 188, NumBytes3: 188, NumLines3: 1024 */ - if (budget->card->type == BUDGET_FS_ACTIVY) { + switch(budget->card->type) { + case BUDGET_FS_ACTIVY: saa7146_write(dev, DD1_INIT, 0x04000000); saa7146_write(dev, MC2, (MASK_09 | MASK_25)); saa7146_write(dev, BRS_CTRL, 0x00000000); - } else { + break; + case BUDGET_PATCH: + saa7146_write(dev, DD1_INIT, 0x00000200); + saa7146_write(dev, MC2, (MASK_10 | MASK_26)); + saa7146_write(dev, BRS_CTRL, 0x60000000); + break; + default: if (budget->video_port == BUDGET_VIDEO_PORTA) { saa7146_write(dev, DD1_INIT, 0x06000200); saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26)); @@ -118,9 +129,10 @@ static int start_ts_capture (struct budget *budget) } saa7146_write(dev, MC2, (MASK_04 | MASK_20)); - saa7146_write(dev, MC1, (MASK_04 | MASK_20)); // DMA3 on - IER_ENABLE(budget->dev, MASK_10); // VPE + SAA7146_ISR_CLEAR(budget->dev, MASK_10); /* VPE */ + SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */ + saa7146_write(dev, MC1, (MASK_04 | MASK_20)); /* DMA3 on */ return ++budget->feeding; } @@ -145,14 +157,87 @@ static void vpeirq (unsigned long data) return; if (newdma > olddma) { /* no wraparound, dump olddma..newdma */ - dvb_dmx_swfilter_packets(&budget->demux, - mem+olddma, (newdma-olddma) / 188); + dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, (newdma - olddma) / 188); } else { /* wraparound, dump olddma..buflen and 0..newdma */ - dvb_dmx_swfilter_packets(&budget->demux, - mem+olddma, (TS_BUFLEN-olddma) / 188); - dvb_dmx_swfilter_packets(&budget->demux, - mem, newdma / 188); + dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, (TS_BUFLEN - olddma) / 188); + dvb_dmx_swfilter_packets(&budget->demux, mem, newdma / 188); + } } + + +int ttpci_budget_debiread(struct budget *budget, u32 config, int addr, int count, + int uselocks, int nobusyloop) +{ + struct saa7146_dev *saa = budget->dev; + int result = 0; + unsigned long flags = 0; + + if (count > 4 || count <= 0) + return 0; + + if (uselocks) + spin_lock_irqsave(&budget->debilock, flags); + + if ((result = saa7146_wait_for_debi_done(saa, nobusyloop)) < 0) { + if (uselocks) + spin_unlock_irqrestore(&budget->debilock, flags); + return result; + } + + saa7146_write(saa, DEBI_COMMAND, (count << 17) | 0x10000 | (addr & 0xffff)); + saa7146_write(saa, DEBI_CONFIG, config); + saa7146_write(saa, DEBI_PAGE, 0); + saa7146_write(saa, MC2, (2 << 16) | 2); + + if ((result = saa7146_wait_for_debi_done(saa, nobusyloop)) < 0) { + if (uselocks) + spin_unlock_irqrestore(&budget->debilock, flags); + return result; + } + + result = saa7146_read(saa, DEBI_AD); + result &= (0xffffffffUL >> ((4 - count) * 8)); + + if (uselocks) + spin_unlock_irqrestore(&budget->debilock, flags); + + return result; +} + +int ttpci_budget_debiwrite(struct budget *budget, u32 config, int addr, + int count, u32 value, int uselocks, int nobusyloop) +{ + struct saa7146_dev *saa = budget->dev; + unsigned long flags = 0; + int result; + + if (count > 4 || count <= 0) + return 0; + + if (uselocks) + spin_lock_irqsave(&budget->debilock, flags); + + if ((result = saa7146_wait_for_debi_done(saa, nobusyloop)) < 0) { + if (uselocks) + spin_unlock_irqrestore(&budget->debilock, flags); + return result; + } + + saa7146_write(saa, DEBI_COMMAND, (count << 17) | 0x00000 | (addr & 0xffff)); + saa7146_write(saa, DEBI_CONFIG, config); + saa7146_write(saa, DEBI_PAGE, 0); + saa7146_write(saa, DEBI_AD, value); + saa7146_write(saa, MC2, (2 << 16) | 2); + + if ((result = saa7146_wait_for_debi_done(saa, nobusyloop)) < 0) { + if (uselocks) + spin_unlock_irqrestore(&budget->debilock, flags); + return result; + } + + if (uselocks) + spin_unlock_irqrestore(&budget->debilock, flags); + return 0; } @@ -166,12 +251,13 @@ static int budget_start_feed(struct dvb_demux_feed *feed) struct budget *budget = (struct budget*) demux->priv; int status; - DEB_EE(("budget: %p\n",budget)); + dprintk(2, "budget: %p\n", budget); if (!demux->dmx.frontend) return -EINVAL; spin_lock(&budget->feedlock); + feed->pusi_seen = 0; /* have a clean section start */ status = start_ts_capture (budget); spin_unlock(&budget->feedlock); return status; @@ -183,7 +269,7 @@ static int budget_stop_feed(struct dvb_demux_feed *feed) struct budget *budget = (struct budget *) demux->priv; int status; - DEB_EE(("budget: %p\n",budget)); + dprintk(2, "budget: %p\n", budget); spin_lock(&budget->feedlock); status = stop_ts_capture (budget); @@ -197,7 +283,7 @@ static int budget_register(struct budget *budget) struct dvb_demux *dvbdemux=&budget->demux; int ret; - DEB_EE(("budget: %p\n",budget)); + dprintk(2, "budget: %p\n", budget); dvbdemux->priv = (void *) budget; @@ -226,13 +312,11 @@ static int budget_register(struct budget *budget) return ret; budget->mem_frontend.source = DMX_MEMORY_FE; - ret=dvbdemux->dmx.add_frontend (&dvbdemux->dmx, - &budget->mem_frontend); + ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &budget->mem_frontend); if (ret<0) return ret; - ret=dvbdemux->dmx.connect_frontend (&dvbdemux->dmx, - &budget->hw_frontend); + ret = dvbdemux->dmx.connect_frontend(&dvbdemux->dmx, &budget->hw_frontend); if (ret < 0) return ret; @@ -246,7 +330,7 @@ static void budget_unregister(struct budget *budget) { struct dvb_demux *dvbdemux=&budget->demux; - DEB_EE(("budget: %p\n",budget)); + dprintk(2, "budget: %p\n", budget); dvb_net_release(&budget->dvb_net); @@ -258,17 +342,9 @@ static void budget_unregister(struct budget *budget) dvb_dmx_release(&budget->demux); } - -static int master_xfer (struct dvb_i2c_bus *i2c, const struct i2c_msg msgs[], int num) -{ - struct saa7146_dev *dev = i2c->data; - return saa7146_i2c_transfer(dev, msgs, num, 6); -} - - -int ttpci_budget_init (struct budget *budget, - struct saa7146_dev* dev, - struct saa7146_pci_extension_data *info) +int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev, + struct saa7146_pci_extension_data *info, + struct module *owner) { int length = TS_WIDTH*TS_HEIGHT; int ret = 0; @@ -276,12 +352,12 @@ int ttpci_budget_init (struct budget *budget, memset(budget, 0, sizeof(struct budget)); - DEB_EE(("dev: %p, budget: %p\n", dev, budget)); + dprintk(2, "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); + dvb_register_adapter(&budget->dvb_adapter, budget->card->name, owner); /* set dd1 stream a & b */ saa7146_write(dev, DD1_STREAM_B, 0x00000000); @@ -295,25 +371,33 @@ int ttpci_budget_init (struct budget *budget, else budget->video_port = BUDGET_VIDEO_PORTA; spin_lock_init(&budget->feedlock); + spin_lock_init(&budget->debilock); /* 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); +#ifdef I2C_ADAP_CLASS_TV_DIGITAL + budget->i2c_adap.class = I2C_ADAP_CLASS_TV_DIGITAL; +#else + budget->i2c_adap.class = I2C_CLASS_TV_DIGITAL; +#endif + + strlcpy(budget->i2c_adap.name, budget->card->name, sizeof(budget->i2c_adap.name)); - budget->i2c_bus = dvb_register_i2c_bus (master_xfer, dev, - budget->dvb_adapter, 0); + saa7146_i2c_adapter_prepare(dev, &budget->i2c_adap, SAA7146_I2C_BUS_BIT_RATE_120); + strcpy(budget->i2c_adap.name, budget->card->name); - if (!budget->i2c_bus) { + if (i2c_add_adapter(&budget->i2c_adap) < 0) { dvb_unregister_adapter (budget->dvb_adapter); return -ENOMEM; } - ttpci_eeprom_parse_mac(budget->i2c_bus); + ttpci_eeprom_parse_mac(&budget->i2c_adap, budget->dvb_adapter->proposed_mac); - if( NULL == (budget->grabbing = saa7146_vmalloc_build_pgtable(dev->pci,length,&budget->pt))) { + if (NULL == + (budget->grabbing = saa7146_vmalloc_build_pgtable(dev->pci, length, &budget->pt))) { ret = -ENOMEM; goto err; } @@ -334,12 +418,11 @@ int ttpci_budget_init (struct budget *budget, return 0; } err: + i2c_del_adapter(&budget->i2c_adap); + 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; @@ -350,12 +433,11 @@ int ttpci_budget_deinit (struct budget *budget) { struct saa7146_dev *dev = budget->dev; - DEB_EE(("budget: %p\n", budget)); + dprintk(2, "budget: %p\n", budget); budget_unregister (budget); - dvb_unregister_i2c_bus (master_xfer, budget->i2c_bus->adapter, - budget->i2c_bus->id); + i2c_del_adapter(&budget->i2c_adap); dvb_unregister_adapter (budget->dvb_adapter); @@ -372,7 +454,7 @@ void ttpci_budget_irq10_handler (struct saa7146_dev* dev, u32 *isr) { struct budget *budget = (struct budget*)dev->ext_priv; - DEB_EE(("dev: %p, budget: %p\n",dev,budget)); + dprintk(8, "dev: %p, budget: %p\n",dev,budget); if (*isr & MASK_10) tasklet_schedule (&budget->vpe_tasklet); @@ -394,15 +476,13 @@ void ttpci_budget_set_video_port(struct saa7146_dev* dev, int video_port) spin_unlock(&budget->feedlock); } - - +EXPORT_SYMBOL_GPL(ttpci_budget_debiread); +EXPORT_SYMBOL_GPL(ttpci_budget_debiwrite); EXPORT_SYMBOL_GPL(ttpci_budget_init); EXPORT_SYMBOL_GPL(ttpci_budget_deinit); EXPORT_SYMBOL_GPL(ttpci_budget_irq10_handler); EXPORT_SYMBOL_GPL(ttpci_budget_set_video_port); EXPORT_SYMBOL_GPL(budget_debug); -MODULE_PARM(budget_debug,"i"); MODULE_LICENSE("GPL"); -