Lines Matching full:budget

3  * budget-core.ko: base-driver for the SAA7146 based Budget DVB cards
21 #include "budget.h"
41 MODULE_PARM_DESC(debug, "Turn on/off budget debugging (default:off).");
45 * TT budget / WinTV Nova
48 static int stop_ts_capture(struct budget *budget) in stop_ts_capture() argument
50 dprintk(2, "budget: %p\n", budget); in stop_ts_capture()
52 saa7146_write(budget->dev, MC1, MASK_20); // DMA3 off in stop_ts_capture()
53 SAA7146_IER_DISABLE(budget->dev, MASK_10); in stop_ts_capture()
57 static int start_ts_capture(struct budget *budget) in start_ts_capture() argument
59 struct saa7146_dev *dev = budget->dev; in start_ts_capture()
61 dprintk(2, "budget: %p\n", budget); in start_ts_capture()
63 if (!budget->feeding || !budget->fe_synced) in start_ts_capture()
68 memset(budget->grabbing, 0x00, budget->buffer_size); in start_ts_capture()
72 budget->ttbp = 0; in start_ts_capture()
84 switch (budget->card->type) { in start_ts_capture()
99 if (budget->video_port == BUDGET_VIDEO_PORTA) { in start_ts_capture()
110 if (budget->video_port == BUDGET_VIDEO_PORTA) { in start_ts_capture()
125 if (budget->buffer_size > budget->buffer_height * budget->buffer_width) { in start_ts_capture()
127 saa7146_write(dev, BASE_EVEN3, budget->buffer_height * budget->buffer_width); in start_ts_capture()
132 saa7146_write(dev, PROT_ADDR3, budget->buffer_size); in start_ts_capture()
133 saa7146_write(dev, BASE_PAGE3, budget->pt.dma | ME1 | 0x90); in start_ts_capture()
135 saa7146_write(dev, PITCH3, budget->buffer_width); in start_ts_capture()
137 (budget->buffer_height << 16) | budget->buffer_width); in start_ts_capture()
141 SAA7146_ISR_CLEAR(budget->dev, MASK_10); /* VPE */ in start_ts_capture()
142 SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */ in start_ts_capture()
151 struct budget *budget = fe->dvb->priv; in budget_read_fe_status() local
155 if (budget->read_fe_status) in budget_read_fe_status()
156 ret = budget->read_fe_status(fe, status); in budget_read_fe_status()
162 if (synced != budget->fe_synced) { in budget_read_fe_status()
163 budget->fe_synced = synced; in budget_read_fe_status()
164 spin_lock(&budget->feedlock); in budget_read_fe_status()
166 start_ts_capture(budget); in budget_read_fe_status()
168 stop_ts_capture(budget); in budget_read_fe_status()
169 spin_unlock(&budget->feedlock); in budget_read_fe_status()
177 struct budget *budget = from_work(budget, t, vpe_bh_work); in vpeirq() local
178 u8 *mem = (u8 *) (budget->grabbing); in vpeirq()
179 u32 olddma = budget->ttbp; in vpeirq()
180 u32 newdma = saa7146_read(budget->dev, PCI_VDP3); in vpeirq()
184 dma_sync_sg_for_cpu(&budget->dev->pci->dev, budget->pt.slist, in vpeirq()
185 budget->pt.nents, DMA_FROM_DEVICE); in vpeirq()
190 if (newdma >= budget->buffer_size) in vpeirq()
193 budget->ttbp = newdma; in vpeirq()
195 if (budget->feeding == 0 || newdma == olddma) in vpeirq()
200 dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, count / 188); in vpeirq()
202 count = budget->buffer_size - olddma; in vpeirq()
203 dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, count / 188); in vpeirq()
205 dvb_dmx_swfilter_packets(&budget->demux, mem, newdma / 188); in vpeirq()
208 if (count > budget->buffer_warning_threshold) in vpeirq()
209 budget->buffer_warnings++; in vpeirq()
211 if (budget->buffer_warnings && time_after(jiffies, budget->buffer_warning_time)) { in vpeirq()
213 budget->dev->name, __func__, budget->buffer_warnings, count); in vpeirq()
214 budget->buffer_warning_time = jiffies + BUFFER_WARNING_WAIT; in vpeirq()
215 budget->buffer_warnings = 0; in vpeirq()
220 static int ttpci_budget_debiread_nolock(struct budget *budget, u32 config, in ttpci_budget_debiread_nolock() argument
223 struct saa7146_dev *saa = budget->dev; in ttpci_budget_debiread_nolock()
244 int ttpci_budget_debiread(struct budget *budget, u32 config, int addr, int count, in ttpci_budget_debiread() argument
254 spin_lock_irqsave(&budget->debilock, flags); in ttpci_budget_debiread()
255 result = ttpci_budget_debiread_nolock(budget, config, addr, in ttpci_budget_debiread()
257 spin_unlock_irqrestore(&budget->debilock, flags); in ttpci_budget_debiread()
260 return ttpci_budget_debiread_nolock(budget, config, addr, in ttpci_budget_debiread()
265 static int ttpci_budget_debiwrite_nolock(struct budget *budget, u32 config, in ttpci_budget_debiwrite_nolock() argument
268 struct saa7146_dev *saa = budget->dev; in ttpci_budget_debiwrite_nolock()
285 int ttpci_budget_debiwrite(struct budget *budget, u32 config, int addr, in ttpci_budget_debiwrite() argument
295 spin_lock_irqsave(&budget->debilock, flags); in ttpci_budget_debiwrite()
296 result = ttpci_budget_debiwrite_nolock(budget, config, addr, in ttpci_budget_debiwrite()
298 spin_unlock_irqrestore(&budget->debilock, flags); in ttpci_budget_debiwrite()
301 return ttpci_budget_debiwrite_nolock(budget, config, addr, in ttpci_budget_debiwrite()
314 struct budget *budget = demux->priv; in budget_start_feed() local
317 dprintk(2, "budget: %p\n", budget); in budget_start_feed()
322 spin_lock(&budget->feedlock); in budget_start_feed()
324 if (budget->feeding++ == 0) in budget_start_feed()
325 status = start_ts_capture(budget); in budget_start_feed()
326 spin_unlock(&budget->feedlock); in budget_start_feed()
333 struct budget *budget = demux->priv; in budget_stop_feed() local
336 dprintk(2, "budget: %p\n", budget); in budget_stop_feed()
338 spin_lock(&budget->feedlock); in budget_stop_feed()
339 if (--budget->feeding == 0) in budget_stop_feed()
340 status = stop_ts_capture(budget); in budget_stop_feed()
341 spin_unlock(&budget->feedlock); in budget_stop_feed()
345 static int budget_register(struct budget *budget) in budget_register() argument
347 struct dvb_demux *dvbdemux = &budget->demux; in budget_register()
350 dprintk(2, "budget: %p\n", budget); in budget_register()
352 dvbdemux->priv = (void *) budget; in budget_register()
363 dvb_dmx_init(&budget->demux); in budget_register()
365 budget->dmxdev.filternum = 256; in budget_register()
366 budget->dmxdev.demux = &dvbdemux->dmx; in budget_register()
367 budget->dmxdev.capabilities = 0; in budget_register()
369 dvb_dmxdev_init(&budget->dmxdev, &budget->dvb_adapter); in budget_register()
371 budget->hw_frontend.source = DMX_FRONTEND_0; in budget_register()
373 ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &budget->hw_frontend); in budget_register()
378 budget->mem_frontend.source = DMX_MEMORY_FE; in budget_register()
379 ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &budget->mem_frontend); in budget_register()
383 ret = dvbdemux->dmx.connect_frontend(&dvbdemux->dmx, &budget->hw_frontend); in budget_register()
387 dvb_net_init(&budget->dvb_adapter, &budget->dvb_net, &dvbdemux->dmx); in budget_register()
392 dvb_dmxdev_release(&budget->dmxdev); in budget_register()
393 dvb_dmx_release(&budget->demux); in budget_register()
397 static void budget_unregister(struct budget *budget) in budget_unregister() argument
399 struct dvb_demux *dvbdemux = &budget->demux; in budget_unregister()
401 dprintk(2, "budget: %p\n", budget); in budget_unregister()
403 dvb_net_release(&budget->dvb_net); in budget_unregister()
406 dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &budget->hw_frontend); in budget_unregister()
407 dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &budget->mem_frontend); in budget_unregister()
409 dvb_dmxdev_release(&budget->dmxdev); in budget_unregister()
410 dvb_dmx_release(&budget->demux); in budget_unregister()
413 int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev, in ttpci_budget_init() argument
422 memset(budget, 0, sizeof(struct budget)); in ttpci_budget_init()
424 dprintk(2, "dev: %p, budget: %p\n", dev, budget); in ttpci_budget_init()
426 budget->card = bi; in ttpci_budget_init()
427 budget->dev = (struct saa7146_dev *) dev; in ttpci_budget_init()
429 switch (budget->card->type) { in ttpci_budget_init()
431 budget->buffer_width = TS_WIDTH_ACTIVY; in ttpci_budget_init()
443 budget->buffer_width = TS_WIDTH_DVBC; in ttpci_budget_init()
449 budget->buffer_width = TS_WIDTH; in ttpci_budget_init()
459 budget->buffer_height = dma_buffer_size * 1024 / budget->buffer_width; in ttpci_budget_init()
460 if (budget->buffer_height > 0xfff) { in ttpci_budget_init()
461 budget->buffer_height /= 2; in ttpci_budget_init()
462 budget->buffer_height &= height_mask; in ttpci_budget_init()
463 budget->buffer_size = 2 * budget->buffer_height * budget->buffer_width; in ttpci_budget_init()
465 budget->buffer_height &= height_mask; in ttpci_budget_init()
466 budget->buffer_size = budget->buffer_height * budget->buffer_width; in ttpci_budget_init()
468 budget->buffer_warning_threshold = budget->buffer_size * 80/100; in ttpci_budget_init()
469 budget->buffer_warnings = 0; in ttpci_budget_init()
470 budget->buffer_warning_time = jiffies; in ttpci_budget_init()
473 budget->dev->name, in ttpci_budget_init()
474 budget->buffer_size > budget->buffer_width * budget->buffer_height ? "odd/even" : "single", in ttpci_budget_init()
475 budget->buffer_width, budget->buffer_height); in ttpci_budget_init()
476 pr_info("%s: dma buffer size %u\n", budget->dev->name, budget->buffer_size); in ttpci_budget_init()
478 ret = dvb_register_adapter(&budget->dvb_adapter, budget->card->name, in ttpci_budget_init()
479 owner, &budget->dev->pci->dev, adapter_nums); in ttpci_budget_init()
491 budget->video_port = BUDGET_VIDEO_PORTB; in ttpci_budget_init()
493 budget->video_port = BUDGET_VIDEO_PORTA; in ttpci_budget_init()
494 spin_lock_init(&budget->feedlock); in ttpci_budget_init()
495 spin_lock_init(&budget->debilock); in ttpci_budget_init()
504 strscpy(budget->i2c_adap.name, budget->card->name, in ttpci_budget_init()
505 sizeof(budget->i2c_adap.name)); in ttpci_budget_init()
507 saa7146_i2c_adapter_prepare(dev, &budget->i2c_adap, SAA7146_I2C_BUS_BIT_RATE_120); in ttpci_budget_init()
508 strscpy(budget->i2c_adap.name, budget->card->name, in ttpci_budget_init()
509 sizeof(budget->i2c_adap.name)); in ttpci_budget_init()
511 if (i2c_add_adapter(&budget->i2c_adap) < 0) { in ttpci_budget_init()
516 ttpci_eeprom_parse_mac(&budget->i2c_adap, budget->dvb_adapter.proposed_mac); in ttpci_budget_init()
518 budget->grabbing = saa7146_vmalloc_build_pgtable(dev->pci, budget->buffer_size, &budget->pt); in ttpci_budget_init()
519 if (budget->grabbing == NULL) { in ttpci_budget_init()
528 INIT_WORK(&budget->vpe_bh_work, vpeirq); in ttpci_budget_init()
534 ret = budget_register(budget); in ttpci_budget_init()
539 saa7146_vfree_destroy_pgtable(dev->pci, budget->grabbing, &budget->pt); in ttpci_budget_init()
542 i2c_del_adapter(&budget->i2c_adap); in ttpci_budget_init()
545 dvb_unregister_adapter(&budget->dvb_adapter); in ttpci_budget_init()
551 void ttpci_budget_init_hooks(struct budget *budget) in ttpci_budget_init_hooks() argument
553 if (budget->dvb_frontend && !budget->read_fe_status) { in ttpci_budget_init_hooks()
554 budget->read_fe_status = budget->dvb_frontend->ops.read_status; in ttpci_budget_init_hooks()
555 budget->dvb_frontend->ops.read_status = budget_read_fe_status; in ttpci_budget_init_hooks()
560 int ttpci_budget_deinit(struct budget *budget) in ttpci_budget_deinit() argument
562 struct saa7146_dev *dev = budget->dev; in ttpci_budget_deinit()
564 dprintk(2, "budget: %p\n", budget); in ttpci_budget_deinit()
566 budget_unregister(budget); in ttpci_budget_deinit()
568 cancel_work_sync(&budget->vpe_bh_work); in ttpci_budget_deinit()
570 saa7146_vfree_destroy_pgtable(dev->pci, budget->grabbing, &budget->pt); in ttpci_budget_deinit()
572 i2c_del_adapter(&budget->i2c_adap); in ttpci_budget_deinit()
574 dvb_unregister_adapter(&budget->dvb_adapter); in ttpci_budget_deinit()
582 struct budget *budget = dev->ext_priv; in ttpci_budget_irq10_handler() local
584 dprintk(8, "dev: %p, budget: %p\n", dev, budget); in ttpci_budget_irq10_handler()
587 queue_work(system_bh_wq, &budget->vpe_bh_work); in ttpci_budget_irq10_handler()
593 struct budget *budget = dev->ext_priv; in ttpci_budget_set_video_port() local
595 spin_lock(&budget->feedlock); in ttpci_budget_set_video_port()
596 budget->video_port = video_port; in ttpci_budget_set_video_port()
597 if (budget->feeding) { in ttpci_budget_set_video_port()
598 stop_ts_capture(budget); in ttpci_budget_set_video_port()
599 start_ts_capture(budget); in ttpci_budget_set_video_port()
601 spin_unlock(&budget->feedlock); in ttpci_budget_set_video_port()
605 MODULE_DESCRIPTION("base driver for the SAA7146 based Budget DVB cards");