Lines Matching refs:budget

2  * budget-core.c: driver for the SAA7146 based Budget DVB cards
38 #include "budget.h"
57 MODULE_PARM_DESC(debug, "Turn on/off budget debugging (default:off).");
61 * TT budget / WinTV Nova
64 static int stop_ts_capture(struct budget *budget)
66 dprintk(2, "budget: %p\n", budget);
68 saa7146_write(budget->dev, MC1, MASK_20); // DMA3 off
69 SAA7146_IER_DISABLE(budget->dev, MASK_10);
73 static int start_ts_capture(struct budget *budget)
75 struct saa7146_dev *dev = budget->dev;
77 dprintk(2, "budget: %p\n", budget);
79 if (!budget->feeding || !budget->fe_synced)
84 memset(budget->grabbing, 0x00, budget->buffer_size);
88 budget->ttbp = 0;
100 switch(budget->card->type) {
115 if (budget->video_port == BUDGET_VIDEO_PORTA) {
126 if (budget->video_port == BUDGET_VIDEO_PORTA) {
141 if (budget->buffer_size > budget->buffer_height * budget->buffer_width) {
143 saa7146_write(dev, BASE_EVEN3, budget->buffer_height * budget->buffer_width);
148 saa7146_write(dev, PROT_ADDR3, budget->buffer_size);
149 saa7146_write(dev, BASE_PAGE3, budget->pt.dma | ME1 | 0x90);
151 saa7146_write(dev, PITCH3, budget->buffer_width);
153 (budget->buffer_height << 16) | budget->buffer_width);
157 SAA7146_ISR_CLEAR(budget->dev, MASK_10); /* VPE */
158 SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */
166 struct budget *budget = (struct budget *) fe->dvb->priv;
170 if (budget->read_fe_status)
171 ret = budget->read_fe_status(fe, status);
177 if (synced != budget->fe_synced) {
178 budget->fe_synced = synced;
179 spin_lock(&budget->feedlock);
181 start_ts_capture(budget);
183 stop_ts_capture(budget);
184 spin_unlock(&budget->feedlock);
192 struct budget *budget = (struct budget *) data;
193 u8 *mem = (u8 *) (budget->grabbing);
194 u32 olddma = budget->ttbp;
195 u32 newdma = saa7146_read(budget->dev, PCI_VDP3);
199 pci_dma_sync_sg_for_cpu(budget->dev->pci, budget->pt.slist, budget->pt.nents, PCI_DMA_FROMDEVICE);
204 if (newdma >= budget->buffer_size)
207 budget->ttbp = newdma;
209 if (budget->feeding == 0 || newdma == olddma)
214 dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, count / 188);
216 count = budget->buffer_size - olddma;
217 dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, count / 188);
219 dvb_dmx_swfilter_packets(&budget->demux, mem, newdma / 188);
222 if (count > budget->buffer_warning_threshold)
223 budget->buffer_warnings++;
225 if (budget->buffer_warnings && time_after(jiffies, budget->buffer_warning_time)) {
227 budget->dev->name, __func__, budget->buffer_warnings, count);
228 budget->buffer_warning_time = jiffies + BUFFER_WARNING_WAIT;
229 budget->buffer_warnings = 0;
234 int ttpci_budget_debiread(struct budget *budget, u32 config, int addr, int count,
237 struct saa7146_dev *saa = budget->dev;
245 spin_lock_irqsave(&budget->debilock, flags);
249 spin_unlock_irqrestore(&budget->debilock, flags);
260 spin_unlock_irqrestore(&budget->debilock, flags);
268 spin_unlock_irqrestore(&budget->debilock, flags);
273 int ttpci_budget_debiwrite(struct budget *budget, u32 config, int addr,
276 struct saa7146_dev *saa = budget->dev;
284 spin_lock_irqsave(&budget->debilock, flags);
288 spin_unlock_irqrestore(&budget->debilock, flags);
300 spin_unlock_irqrestore(&budget->debilock, flags);
305 spin_unlock_irqrestore(&budget->debilock, flags);
317 struct budget *budget = (struct budget *) demux->priv;
320 dprintk(2, "budget: %p\n", budget);
325 spin_lock(&budget->feedlock);
327 if (budget->feeding++ == 0)
328 status = start_ts_capture(budget);
329 spin_unlock(&budget->feedlock);
336 struct budget *budget = (struct budget *) demux->priv;
339 dprintk(2, "budget: %p\n", budget);
341 spin_lock(&budget->feedlock);
342 if (--budget->feeding == 0)
343 status = stop_ts_capture(budget);
344 spin_unlock(&budget->feedlock);
348 static int budget_register(struct budget *budget)
350 struct dvb_demux *dvbdemux = &budget->demux;
353 dprintk(2, "budget: %p\n", budget);
355 dvbdemux->priv = (void *) budget;
366 dvb_dmx_init(&budget->demux);
368 budget->dmxdev.filternum = 256;
369 budget->dmxdev.demux = &dvbdemux->dmx;
370 budget->dmxdev.capabilities = 0;
372 dvb_dmxdev_init(&budget->dmxdev, &budget->dvb_adapter);
374 budget->hw_frontend.source = DMX_FRONTEND_0;
376 ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &budget->hw_frontend);
381 budget->mem_frontend.source = DMX_MEMORY_FE;
382 ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &budget->mem_frontend);
386 ret = dvbdemux->dmx.connect_frontend(&dvbdemux->dmx, &budget->hw_frontend);
390 dvb_net_init(&budget->dvb_adapter, &budget->dvb_net, &dvbdemux->dmx);
395 static void budget_unregister(struct budget *budget)
397 struct dvb_demux *dvbdemux = &budget->demux;
399 dprintk(2, "budget: %p\n", budget);
401 dvb_net_release(&budget->dvb_net);
404 dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &budget->hw_frontend);
405 dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &budget->mem_frontend);
407 dvb_dmxdev_release(&budget->dmxdev);
408 dvb_dmx_release(&budget->demux);
411 int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev,
420 memset(budget, 0, sizeof(struct budget));
422 dprintk(2, "dev: %p, budget: %p\n", dev, budget);
424 budget->card = bi;
425 budget->dev = (struct saa7146_dev *) dev;
427 switch(budget->card->type) {
429 budget->buffer_width = TS_WIDTH_ACTIVY;
441 budget->buffer_width = TS_WIDTH_DVBC;
447 budget->buffer_width = TS_WIDTH;
457 budget->buffer_height = dma_buffer_size * 1024 / budget->buffer_width;
458 if (budget->buffer_height > 0xfff) {
459 budget->buffer_height /= 2;
460 budget->buffer_height &= height_mask;
461 budget->buffer_size = 2 * budget->buffer_height * budget->buffer_width;
463 budget->buffer_height &= height_mask;
464 budget->buffer_size = budget->buffer_height * budget->buffer_width;
466 budget->buffer_warning_threshold = budget->buffer_size * 80/100;
467 budget->buffer_warnings = 0;
468 budget->buffer_warning_time = jiffies;
471 budget->dev->name,
472 budget->buffer_size > budget->buffer_width * budget->buffer_height ? "odd/even" : "single",
473 budget->buffer_width, budget->buffer_height);
474 printk("%s: dma buffer size %u\n", budget->dev->name, budget->buffer_size);
476 ret = dvb_register_adapter(&budget->dvb_adapter, budget->card->name,
477 owner, &budget->dev->pci->dev, adapter_nums);
489 budget->video_port = BUDGET_VIDEO_PORTB;
491 budget->video_port = BUDGET_VIDEO_PORTA;
492 spin_lock_init(&budget->feedlock);
493 spin_lock_init(&budget->debilock);
500 strlcpy(budget->i2c_adap.name, budget->card->name, sizeof(budget->i2c_adap.name));
502 saa7146_i2c_adapter_prepare(dev, &budget->i2c_adap, SAA7146_I2C_BUS_BIT_RATE_120);
503 strcpy(budget->i2c_adap.name, budget->card->name);
505 if (i2c_add_adapter(&budget->i2c_adap) < 0) {
510 ttpci_eeprom_parse_mac(&budget->i2c_adap, budget->dvb_adapter.proposed_mac);
512 budget->grabbing = saa7146_vmalloc_build_pgtable(dev->pci, budget->buffer_size, &budget->pt);
513 if (NULL == budget->grabbing) {
522 tasklet_init(&budget->vpe_tasklet, vpeirq, (unsigned long) budget);
528 if ((ret = budget_register(budget)) == 0)
532 saa7146_vfree_destroy_pgtable(dev->pci, budget->grabbing, &budget->pt);
535 i2c_del_adapter(&budget->i2c_adap);
538 dvb_unregister_adapter(&budget->dvb_adapter);
543 void ttpci_budget_init_hooks(struct budget *budget)
545 if (budget->dvb_frontend && !budget->read_fe_status) {
546 budget->read_fe_status = budget->dvb_frontend->ops.read_status;
547 budget->dvb_frontend->ops.read_status = budget_read_fe_status;
551 int ttpci_budget_deinit(struct budget *budget)
553 struct saa7146_dev *dev = budget->dev;
555 dprintk(2, "budget: %p\n", budget);
557 budget_unregister(budget);
559 tasklet_kill(&budget->vpe_tasklet);
561 saa7146_vfree_destroy_pgtable(dev->pci, budget->grabbing, &budget->pt);
563 i2c_del_adapter(&budget->i2c_adap);
565 dvb_unregister_adapter(&budget->dvb_adapter);
572 struct budget *budget = (struct budget *) dev->ext_priv;
574 dprintk(8, "dev: %p, budget: %p\n", dev, budget);
577 tasklet_schedule(&budget->vpe_tasklet);
582 struct budget *budget = (struct budget *) dev->ext_priv;
584 spin_lock(&budget->feedlock);
585 budget->video_port = video_port;
586 if (budget->feeding) {
587 stop_ts_capture(budget);
588 start_ts_capture(budget);
590 spin_unlock(&budget->feedlock);