Mailing List archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[linux-dvb] Re: [PATCH] dvb-ttpci+budgetpatch integrated latest patch
HI
This is a late-time patch, fixing some
oops with large number of rmmod/insmod
Emard
diff -pur dvb-kernel.orig/linux/drivers/media/dvb/ttpci/av7110.c dvb-kernel/linux/drivers/media/dvb/ttpci/av7110.c
--- dvb-kernel.orig/linux/drivers/media/dvb/ttpci/av7110.c 2005-01-08 20:41:51.000000000 +0100
+++ dvb-kernel/linux/drivers/media/dvb/ttpci/av7110.c 2005-01-08 22:42:55.000000000 +0100
@@ -1150,15 +1150,14 @@ static int stop_ts_capture(struct av7110
if (--budget->feeding1)
return budget->feeding1;
- saa7146_write(budget->dev, MC1, MASK_20); // DMA3 off
+ saa7146_write(budget->dev, MC1, MASK_20); /* DMA3 off */
SAA7146_IER_DISABLE(budget->dev, MASK_10);
+ SAA7146_ISR_CLEAR(budget->dev, MASK_10);
return 0;
}
static int start_ts_capture(struct av7110 *budget)
{
- struct saa7146_dev *dev = budget->dev;
-
dprintk(2, "budget: %p\n", budget);
if (budget->feeding1)
@@ -1166,8 +1165,8 @@ static int start_ts_capture(struct av711
memset(budget->grabbing, 0x00, TS_HEIGHT * TS_WIDTH);
budget->tsf = 0xff;
budget->ttbp = 0;
- saa7146_write(dev, MC1, (MASK_04 | MASK_20)); // DMA3 on
- SAA7146_IER_ENABLE(budget->dev, MASK_10); // VPE
+ SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */
+ saa7146_write(budget->dev, MC1, (MASK_04 | MASK_20)); /* DMA3 on */
return ++budget->feeding1;
}
@@ -2290,7 +2289,7 @@ static int av7110_attach(struct saa7146_
(av7110->grabbing =
saa7146_vmalloc_build_pgtable(dev->pci, length, &av7110->pt)))
return -ENOMEM;
- saa7146_write(dev, PCI_BT_V1, 0x1c1c101f);
+ saa7146_write(dev, PCI_BT_V1, 0x1c1f101f);
saa7146_write(dev, BCS_CTRL, 0x80400040);
/* set dd1 stream a & b */
saa7146_write(dev, DD1_STREAM_B, 0x00000000);
@@ -2362,6 +2361,8 @@ static int av7110_attach(struct saa7146_
saa7146_write(dev, MC1, (MASK_13 | MASK_29));
/* end of budgetpatch register initialization */
+ spin_lock_init(&av7110->feedlock1);
+ tasklet_init (&av7110->vpe_tasklet, vpeirq, (unsigned long) av7110);
} else {
saa7146_write(dev, PCI_BT_V1, 0x1c00101f);
saa7146_write(dev, BCS_CTRL, 0x80400040);
@@ -2376,10 +2377,6 @@ static int av7110_attach(struct saa7146_
saa7146_write(dev, GPIO_CTRL, 0x000000);
}
- if(budgetpatch)
- spin_lock_init(&av7110->feedlock1);
-
- tasklet_init (&av7110->vpe_tasklet, vpeirq, (unsigned long) av7110);
tasklet_init (&av7110->debi_tasklet, debiirq, (unsigned long) av7110);
tasklet_init (&av7110->gpio_tasklet, gpioirq, (unsigned long) av7110);
@@ -2494,10 +2491,15 @@ static int av7110_detach (struct saa7146
return 0;
}
- tasklet_kill(&av7110->vpe_tasklet);
if(budgetpatch)
+ {
+ saa7146_write(saa, MC1, MASK_20); /* DMA3 off */
+ SAA7146_IER_DISABLE(saa, MASK_10);
+ SAA7146_ISR_CLEAR(saa, MASK_10);
+ msleep(50);
+ tasklet_kill(&av7110->vpe_tasklet);
saa7146_pgtable_free(saa->pci, &av7110->pt);
-
+ }
av7110_exit_v4l(av7110);
av7110->arm_rmmod = 1;
@@ -2572,7 +2574,8 @@ static void av7110_irq(struct saa7146_de
}
if (*isr & MASK_10)
- tasklet_schedule(&av7110->vpe_tasklet);
+ if (budgetpatch)
+ tasklet_schedule(&av7110->vpe_tasklet);
}
Only in dvb-kernel/linux/drivers/media/dvb/ttpci: av7110.c~
Home |
Main Index |
Thread Index