|
@@ -41,11 +41,14 @@
|
|
|
|
|
|
#define TS_WIDTH (2 * TS_SIZE)
|
|
|
#define TS_WIDTH_ACTIVY TS_SIZE
|
|
|
+#define TS_WIDTH_DVBC TS_SIZE
|
|
|
#define TS_HEIGHT_MASK 0xf00
|
|
|
#define TS_HEIGHT_MASK_ACTIVY 0xc00
|
|
|
+#define TS_HEIGHT_MASK_DVBC 0xe00
|
|
|
#define TS_MIN_BUFSIZE_K 188
|
|
|
#define TS_MAX_BUFSIZE_K 1410
|
|
|
#define TS_MAX_BUFSIZE_K_ACTIVY 564
|
|
|
+#define TS_MAX_BUFSIZE_K_DVBC 1316
|
|
|
#define BUFFER_WARNING_WAIT (30*HZ)
|
|
|
|
|
|
int budget_debug;
|
|
@@ -122,7 +125,13 @@ static int start_ts_capture(struct budget *budget)
|
|
|
mdelay(10);
|
|
|
|
|
|
saa7146_write(dev, BASE_ODD3, 0);
|
|
|
- saa7146_write(dev, BASE_EVEN3, 0);
|
|
|
+ if (budget->buffer_size > budget->buffer_height * budget->buffer_width) {
|
|
|
+ // using odd/even buffers
|
|
|
+ saa7146_write(dev, BASE_EVEN3, budget->buffer_height * budget->buffer_width);
|
|
|
+ } else {
|
|
|
+ // using a single buffer
|
|
|
+ saa7146_write(dev, BASE_EVEN3, 0);
|
|
|
+ }
|
|
|
saa7146_write(dev, PROT_ADDR3, budget->buffer_size);
|
|
|
saa7146_write(dev, BASE_PAGE3, budget->pt.dma | ME1 | 0x90);
|
|
|
|
|
@@ -399,11 +408,22 @@ int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev,
|
|
|
budget->card = bi;
|
|
|
budget->dev = (struct saa7146_dev *) dev;
|
|
|
|
|
|
- if (budget->card->type == BUDGET_FS_ACTIVY) {
|
|
|
+ switch(budget->card->type) {
|
|
|
+ case BUDGET_FS_ACTIVY:
|
|
|
budget->buffer_width = TS_WIDTH_ACTIVY;
|
|
|
max_bufsize = TS_MAX_BUFSIZE_K_ACTIVY;
|
|
|
height_mask = TS_HEIGHT_MASK_ACTIVY;
|
|
|
- } else {
|
|
|
+ break;
|
|
|
+
|
|
|
+ case BUDGET_KNC1C:
|
|
|
+ case BUDGET_KNC1CP:
|
|
|
+ case BUDGET_CIN1200C:
|
|
|
+ budget->buffer_width = TS_WIDTH_DVBC;
|
|
|
+ max_bufsize = TS_MAX_BUFSIZE_K_DVBC;
|
|
|
+ height_mask = TS_HEIGHT_MASK_DVBC;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
budget->buffer_width = TS_WIDTH;
|
|
|
max_bufsize = TS_MAX_BUFSIZE_K;
|
|
|
height_mask = TS_HEIGHT_MASK;
|
|
@@ -415,14 +435,22 @@ int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev,
|
|
|
dma_buffer_size = max_bufsize;
|
|
|
|
|
|
budget->buffer_height = dma_buffer_size * 1024 / budget->buffer_width;
|
|
|
- budget->buffer_height &= height_mask;
|
|
|
- budget->buffer_size = budget->buffer_height * budget->buffer_width;
|
|
|
+ if (budget->buffer_height > 0xfff) {
|
|
|
+ budget->buffer_height /= 2;
|
|
|
+ budget->buffer_height &= height_mask;
|
|
|
+ budget->buffer_size = 2 * budget->buffer_height * budget->buffer_width;
|
|
|
+ } else {
|
|
|
+ budget->buffer_height &= height_mask;
|
|
|
+ budget->buffer_size = budget->buffer_height * budget->buffer_width;
|
|
|
+ }
|
|
|
budget->buffer_warning_threshold = budget->buffer_size * 80/100;
|
|
|
budget->buffer_warnings = 0;
|
|
|
budget->buffer_warning_time = jiffies;
|
|
|
|
|
|
- dprintk(2, "%s: width = %d, height = %d\n",
|
|
|
- budget->dev->name, budget->buffer_width, budget->buffer_height);
|
|
|
+ dprintk(2, "%s: buffer type = %s, width = %d, height = %d\n",
|
|
|
+ budget->dev->name,
|
|
|
+ budget->buffer_size > budget->buffer_width * budget->buffer_height ? "odd/even" : "single",
|
|
|
+ budget->buffer_width, budget->buffer_height);
|
|
|
printk("%s: dma buffer size %u\n", budget->dev->name, budget->buffer_size);
|
|
|
|
|
|
if ((ret = dvb_register_adapter(&budget->dvb_adapter, budget->card->name, owner, &budget->dev->pci->dev)) < 0) {
|