From: Michael Hunold (LinuxTV.org CVS maintainer) <hunold@convergence.de>
To: torvalds@osdl.org, linux-kernel@vger.kernel.org
Subject: [PATCH 9/17] More saa7146 driver core updates
Date: Tue, 15 Jul 2003 14:20:56 +0200 [thread overview]
Message-ID: <10582716562915@convergence.de> (raw)
In-Reply-To: <1058271656760@convergence.de>
[V4L] - separate all EXPORT_SYMBOL stuff to saa7146_ksyms.c
[V4L] - properly stop capturing when no more buffers are available (missing register upload)
[V4L] - make extension data a per-device member, not a per-extension member, so that every device
can have it's own private data (necessary for DVB drivers which handle more than one device)
[V4L] - implement field based capturing, ie. capturing fields to different capture buffers
[V4L] - change default old of capture fields for ALTERNATE mode (comply with bttv)
[V4L] - follow these changes in various analog saa7146 based cards drivers (mxb.c and dpc7146.c)
[DVB] - follow these changes in various saa7146 based budget card drivers
diff -uNrwB --new-file linux-2.6.0-test1.work/drivers/media/common/Makefile linux-2.6.0-test1.patch/drivers/media/common/Makefile
--- linux-2.6.0-test1.work/drivers/media/common/Makefile 2003-07-15 09:42:37.000000000 +0200
+++ linux-2.6.0-test1.patch/drivers/media/common/Makefile 2003-07-01 13:34:48.000000000 +0200
@@ -1,5 +1,5 @@
saa7146-objs := saa7146_i2c.o saa7146_core.o
-saa7146_vv-objs := saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o
+saa7146_vv-objs := saa7146_vv_ksyms.o saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o
obj-$(CONFIG_VIDEO_SAA7146) += saa7146.o saa7146_vv.o
diff -uNrwB --new-file linux-2.6.0-test1.work/drivers/media/common/saa7146_core.c linux-2.6.0-test1.patch/drivers/media/common/saa7146_core.c
--- linux-2.6.0-test1.work/drivers/media/common/saa7146_core.c 2003-07-15 09:42:37.000000000 +0200
+++ linux-2.6.0-test1.patch/drivers/media/common/saa7146_core.c 2003-07-07 13:28:54.000000000 +0200
@@ -373,6 +372,9 @@
dev->module = THIS_MODULE;
init_waitqueue_head(&dev->i2c_wq);
+ /* set some default values */
+ saa7146_write(dev, BCS_CTRL, 0x80400040);
+
if( 0 != ext->probe) {
if( 0 != ext->probe(dev) ) {
DEB_D(("ext->probe() failed for %p. skipping device.\n",dev));
@@ -391,9 +393,6 @@
list_add_tail(&dev->item,&saa7146_devices);
saa7146_num++;
- /* set some default values */
- saa7146_write(dev, BCS_CTRL, 0x80400040);
-
err = 0;
goto out;
attach_error:
diff -uNrwB --new-file linux-2.6.0-test1.work/drivers/media/common/saa7146_fops.c linux-2.6.0-test1.patch/drivers/media/common/saa7146_fops.c
--- linux-2.6.0-test1.work/drivers/media/common/saa7146_fops.c 2003-07-15 09:42:37.000000000 +0200
+++ linux-2.6.0-test1.patch/drivers/media/common/saa7146_fops.c 2003-07-07 13:28:54.000000000 +0200
@@ -106,10 +106,21 @@
// fixme: fix this for vflip != 0
saa7146_write(dev, PROT_ADDR1, 0);
+ saa7146_write(dev, MC2, (MASK_02|MASK_18));
+
/* write the address of the rps-program */
saa7146_write(dev, RPS_ADDR0, dev->d_rps0.dma_handle);
/* turn on rps */
saa7146_write(dev, MC1, (MASK_12 | MASK_28));
+
+/*
+ printk("vdma%d.base_even: 0x%08x\n", 1,saa7146_read(dev,BASE_EVEN1));
+ printk("vdma%d.base_odd: 0x%08x\n", 1,saa7146_read(dev,BASE_ODD1));
+ printk("vdma%d.prot_addr: 0x%08x\n", 1,saa7146_read(dev,PROT_ADDR1));
+ printk("vdma%d.base_page: 0x%08x\n", 1,saa7146_read(dev,BASE_PAGE1));
+ printk("vdma%d.pitch: 0x%08x\n", 1,saa7146_read(dev,PITCH1));
+ printk("vdma%d.num_line_byte: 0x%08x\n", 1,saa7146_read(dev,NUM_LINE_BYTE1));
+*/
}
del_timer(&q->timeout);
}
@@ -374,7 +385,7 @@
.minor = -1,
};
-int saa7146_vv_init(struct saa7146_dev* dev)
+int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv)
{
struct saa7146_vv *vv = kmalloc (sizeof(struct saa7146_vv),GFP_KERNEL);
if( NULL == vv ) {
@@ -385,6 +396,11 @@
DEB_EE(("dev:%p\n",dev));
+ /* save per-device extension data (one extension can
+ handle different devices that might need different
+ configuration data) */
+ dev->ext_vv_data = ext_vv;
+
vv->video_minor = -1;
vv->vbi_minor = -1;
@@ -475,13 +491,6 @@
module_init(saa7146_vv_init_module);
module_exit(saa7146_vv_cleanup_module);
-EXPORT_SYMBOL_GPL(saa7146_set_hps_source_and_sync);
-EXPORT_SYMBOL_GPL(saa7146_register_device);
-EXPORT_SYMBOL_GPL(saa7146_unregister_device);
-
-EXPORT_SYMBOL_GPL(saa7146_vv_init);
-EXPORT_SYMBOL_GPL(saa7146_vv_release);
-
MODULE_AUTHOR("Michael Hunold <michael@mihu.de>");
MODULE_DESCRIPTION("video4linux driver for saa7146-based hardware");
MODULE_LICENSE("GPL");
diff -uNrwB --new-file linux-2.6.0-test1.work/drivers/media/common/saa7146_hlp.c linux-2.6.0-test1.patch/drivers/media/common/saa7146_hlp.c
--- linux-2.6.0-test1.work/drivers/media/common/saa7146_hlp.c 2003-07-15 10:59:26.000000000 +0200
+++ linux-2.6.0-test1.patch/drivers/media/common/saa7146_hlp.c 2003-07-14 11:56:37.000000000 +0200
@@ -242,7 +242,9 @@
if( 2*out_y >= in_y) {
lpi = 1;
}
- } else if (field == V4L2_FIELD_TOP || field == V4L2_FIELD_BOTTOM) {
+ } else if (field == V4L2_FIELD_TOP
+ || field == V4L2_FIELD_ALTERNATE
+ || field == V4L2_FIELD_BOTTOM) {
if( 4*out_y >= in_y ) {
lpi = 1;
}
@@ -468,9 +470,7 @@
*clip_format &= 0xfffffff7;
if (V4L2_FIELD_HAS_BOTH(field)) {
*clip_format |= 0x00000008;
- } else if (field == V4L2_FIELD_TOP) {
- *clip_format |= 0x00000000;
- } else if (field == V4L2_FIELD_BOTTOM) {
+ } else {
*clip_format |= 0x00000000;
}
}
@@ -593,6 +593,10 @@
}
if (V4L2_FIELD_HAS_BOTH(field)) {
+ } else if (field == V4L2_FIELD_ALTERNATE) {
+ /* fixme */
+ vdma1.base_odd = vdma1.prot_addr;
+ vdma1.pitch /= 2;
} else if (field == V4L2_FIELD_TOP) {
vdma1.base_odd = vdma1.prot_addr;
vdma1.pitch /= 2;
@@ -706,7 +710,7 @@
/* calculate starting address */
where = (which-1)*0x18;
- if( 0 != (dev->ext->ext_vv_data->flags & SAA7146_EXT_SWAP_ODD_EVEN)) {
+ if( 0 != (dev->ext_vv_data->flags & SAA7146_EXT_SWAP_ODD_EVEN)) {
saa7146_write(dev, where, vdma->base_even);
saa7146_write(dev, where+0x04, vdma->base_odd);
} else {
@@ -760,6 +764,16 @@
}
if (V4L2_FIELD_HAS_BOTH(field)) {
+ } else if (field == V4L2_FIELD_ALTERNATE) {
+ /* fixme */
+ if ( vv->last_field == V4L2_FIELD_TOP ) {
+ vdma1.base_odd = vdma1.prot_addr;
+ vdma1.pitch /= 2;
+ } else if ( vv->last_field == V4L2_FIELD_BOTTOM ) {
+ vdma1.base_odd = vdma1.base_even;
+ vdma1.base_even = vdma1.prot_addr;
+ vdma1.pitch /= 2;
+ }
} else if (field == V4L2_FIELD_TOP) {
vdma1.base_odd = vdma1.prot_addr;
vdma1.pitch /= 2;
@@ -896,6 +910,14 @@
}
if (V4L2_FIELD_HAS_BOTH(field)) {
+ } else if (field == V4L2_FIELD_ALTERNATE) {
+ /* fixme */
+ vdma1.base_odd = vdma1.prot_addr;
+ vdma1.pitch /= 2;
+ vdma2.base_odd = vdma2.prot_addr;
+ vdma2.pitch /= 2;
+ vdma3.base_odd = vdma3.prot_addr;
+ vdma3.pitch /= 2;
} else if (field == V4L2_FIELD_TOP) {
vdma1.base_odd = vdma1.prot_addr;
vdma1.pitch /= 2;
@@ -940,17 +962,17 @@
unsigned long e_wait = vv->current_hps_sync == SAA7146_HPS_SYNC_PORT_A ? CMD_E_FID_A : CMD_E_FID_B;
unsigned long o_wait = vv->current_hps_sync == SAA7146_HPS_SYNC_PORT_A ? CMD_O_FID_A : CMD_O_FID_B;
- if( 0 != (dev->ext->ext_vv_data->flags & SAA7146_EXT_SWAP_ODD_EVEN)) {
+ if( 0 != (dev->ext_vv_data->flags & SAA7146_EXT_SWAP_ODD_EVEN)) {
unsigned long tmp = e_wait;
e_wait = o_wait;
o_wait = tmp;
}
- /* wait for o_fid_a/b / e_fid_a/b toggle only if bit 0 is not set*/
- WRITE_RPS0(CMD_PAUSE | CMD_OAN | CMD_SIG0 | e_wait);
+ /* wait for o_fid_a/b / e_fid_a/b toggle only if rps register 0 is not set*/
WRITE_RPS0(CMD_PAUSE | CMD_OAN | CMD_SIG0 | o_wait);
+ WRITE_RPS0(CMD_PAUSE | CMD_OAN | CMD_SIG0 | e_wait);
- /* set bit 0 */
+ /* set rps register 0 */
WRITE_RPS0(CMD_WR_REG | (1 << 8) | (MC2/4));
WRITE_RPS0(MASK_27 | MASK_11);
@@ -971,8 +993,14 @@
}
/* wait for o_fid_a/b / e_fid_a/b toggle */
+ if ( vv->last_field == V4L2_FIELD_INTERLACED ) {
+ WRITE_RPS0(CMD_PAUSE | o_wait);
WRITE_RPS0(CMD_PAUSE | e_wait);
+ } else if ( vv->last_field == V4L2_FIELD_TOP ) {
WRITE_RPS0(CMD_PAUSE | o_wait);
+ } else if ( vv->last_field == V4L2_FIELD_BOTTOM ) {
+ WRITE_RPS0(CMD_PAUSE | e_wait);
+ }
/* turn off video-dma1 */
WRITE_RPS0(CMD_WR_REG_MASK | (MC1/4));
@@ -1000,13 +1028,39 @@
void saa7146_set_capture(struct saa7146_dev *dev, struct saa7146_buf *buf, struct saa7146_buf *next)
{
struct saa7146_format *sfmt = format_by_fourcc(dev,buf->fmt->pixelformat);
+ struct saa7146_vv *vv = dev->vv_data;
+ u32 vdma1_prot_addr;
DEB_CAP(("buf:%p, next:%p\n",buf,next));
+/*
+ printk("vdma%d.base_even: 0x%08x\n", 1,saa7146_read(dev,BASE_EVEN1));
+ printk("vdma%d.base_odd: 0x%08x\n", 1,saa7146_read(dev,BASE_ODD1));
+ printk("vdma%d.prot_addr: 0x%08x\n", 1,saa7146_read(dev,PROT_ADDR1));
+ printk("vdma%d.base_page: 0x%08x\n", 1,saa7146_read(dev,BASE_PAGE1));
+ printk("vdma%d.pitch: 0x%08x\n", 1,saa7146_read(dev,PITCH1));
+ printk("vdma%d.num_line_byte: 0x%08x\n", 1,saa7146_read(dev,NUM_LINE_BYTE1));
+ printk("vdma%d => vptr : 0x%08x\n", 1,saa7146_read(dev,PCI_VDP1));
+*/
+
+ vdma1_prot_addr = saa7146_read(dev, PROT_ADDR1);
+ if( 0 == vdma1_prot_addr ) {
+ /* clear out beginning of streaming bit (rps register 0)*/
+ DEB_CAP(("forcing sync to new frame\n"));
+ saa7146_write(dev, MC2, MASK_27 );
+ }
+
saa7146_set_window(dev, buf->fmt->width, buf->fmt->height, buf->fmt->field);
saa7146_set_output_format(dev, sfmt->trans);
saa7146_disable_clipping(dev);
+ if ( vv->last_field == V4L2_FIELD_INTERLACED ) {
+ } else if ( vv->last_field == V4L2_FIELD_TOP ) {
+ vv->last_field = V4L2_FIELD_BOTTOM;
+ } else if ( vv->last_field == V4L2_FIELD_BOTTOM ) {
+ vv->last_field = V4L2_FIELD_TOP;
+ }
+
if( 0 != IS_PLANAR(sfmt->trans)) {
calculate_video_dma_grab_planar(dev, buf);
program_capture_engine(dev,1);
diff -uNrwB --new-file linux-2.6.0-test1.work/drivers/media/common/saa7146_i2c.c linux-2.6.0-test1.patch/drivers/media/common/saa7146_i2c.c
--- linux-2.6.0-test1.work/drivers/media/common/saa7146_i2c.c 2003-07-15 10:59:26.000000000 +0200
+++ linux-2.6.0-test1.patch/drivers/media/common/saa7146_i2c.c 2003-06-18 14:20:44.000000000 +0200
@@ -407,8 +407,13 @@
if( NULL != i2c_adapter ) {
memset(i2c_adapter,0,sizeof(struct i2c_adapter));
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+ strcpy(i2c_adapter->name, dev->name);
+ i2c_adapter->data = dev;
+#else
strcpy(i2c_adapter->dev.name, dev->name);
i2c_set_adapdata(i2c_adapter,dev);
+#endif
i2c_adapter->algo = &saa7146_algo;
i2c_adapter->algo_data = NULL;
i2c_adapter->id = I2C_ALGO_SAA7146;
diff -uNrwB --new-file linux-2.6.0-test1.work/drivers/media/common/saa7146_vbi.c linux-2.6.0-test1.patch/drivers/media/common/saa7146_vbi.c
--- linux-2.6.0-test1.work/drivers/media/common/saa7146_vbi.c 2003-07-15 10:59:26.000000000 +0200
+++ linux-2.6.0-test1.patch/drivers/media/common/saa7146_vbi.c 2003-07-01 13:34:48.000000000 +0200
@@ -444,5 +444,3 @@
.irq_done = vbi_irq_done,
.read = vbi_read,
};
-
-EXPORT_SYMBOL_GPL(saa7146_vbi_uops);
diff -uNrwB --new-file linux-2.6.0-test1.work/drivers/media/common/saa7146_video.c linux-2.6.0-test1.patch/drivers/media/common/saa7146_video.c
--- linux-2.6.0-test1.work/drivers/media/common/saa7146_video.c 2003-07-15 10:59:26.000000000 +0200
+++ linux-2.6.0-test1.patch/drivers/media/common/saa7146_video.c 2003-07-10 11:19:39.000000000 +0200
@@ -137,6 +137,7 @@
switch (field) {
case V4L2_FIELD_TOP:
case V4L2_FIELD_BOTTOM:
+ case V4L2_FIELD_ALTERNATE:
maxh = maxh / 2;
break;
case V4L2_FIELD_INTERLACED:
@@ -186,11 +187,18 @@
: V4L2_FIELD_BOTTOM;
}
switch (field) {
+ case V4L2_FIELD_ALTERNATE: {
+ vv->last_field = V4L2_FIELD_TOP;
+ maxh = maxh / 2;
+ break;
+ }
case V4L2_FIELD_TOP:
case V4L2_FIELD_BOTTOM:
+ vv->last_field = V4L2_FIELD_INTERLACED;
maxh = maxh / 2;
break;
case V4L2_FIELD_INTERLACED:
+ vv->last_field = V4L2_FIELD_INTERLACED;
break;
default: {
DEB_D(("no known field mode '%d'.\n",field));
@@ -561,7 +569,7 @@
m3 = ((size+(size/2)+PAGE_SIZE)/PAGE_SIZE)-1;
o1 = size%PAGE_SIZE;
o2 = (size+(size/4))%PAGE_SIZE;
- printk("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n",size,m1,m2,m3,o1,o2);
+ DEB_CAP(("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n",size,m1,m2,m3,o1,o2));
break;
}
case 16: {
@@ -571,7 +579,7 @@
m3 = ((2*size+PAGE_SIZE)/PAGE_SIZE)-1;
o1 = size%PAGE_SIZE;
o2 = (size+(size/2))%PAGE_SIZE;
- printk("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n",size,m1,m2,m3,o1,o2);
+ DEB_CAP(("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n",size,m1,m2,m3,o1,o2));
break;
}
default: {
@@ -674,7 +682,7 @@
spin_lock_irqsave(&dev->slock,flags);
- /* clear out beginning of streaming bit */
+ /* clear out beginning of streaming bit (rps register 0)*/
saa7146_write(dev, MC2, MASK_27 );
/* enable rps0 irqs */
@@ -740,19 +748,19 @@
struct videobuf_queue *q;
/* check if extension handles the command */
- for(ee = 0; dev->ext->ext_vv_data->ioctls[ee].flags != 0; ee++) {
- if( cmd == dev->ext->ext_vv_data->ioctls[ee].cmd )
+ for(ee = 0; dev->ext_vv_data->ioctls[ee].flags != 0; ee++) {
+ if( cmd == dev->ext_vv_data->ioctls[ee].cmd )
break;
}
- if( 0 != (dev->ext->ext_vv_data->ioctls[ee].flags & SAA7146_EXCLUSIVE) ) {
+ if( 0 != (dev->ext_vv_data->ioctls[ee].flags & SAA7146_EXCLUSIVE) ) {
DEB_D(("extension handles ioctl exclusive.\n"));
- result = dev->ext->ext_vv_data->ioctl(fh, cmd, arg);
+ result = dev->ext_vv_data->ioctl(fh, cmd, arg);
return result;
}
- if( 0 != (dev->ext->ext_vv_data->ioctls[ee].flags & SAA7146_BEFORE) ) {
+ if( 0 != (dev->ext_vv_data->ioctls[ee].flags & SAA7146_BEFORE) ) {
DEB_D(("extension handles ioctl before.\n"));
- result = dev->ext->ext_vv_data->ioctl(fh, cmd, arg);
+ result = dev->ext_vv_data->ioctl(fh, cmd, arg);
if( -EAGAIN != result ) {
return result;
}
@@ -793,7 +801,7 @@
V4L2_CAP_VIDEO_OVERLAY |
V4L2_CAP_READWRITE |
V4L2_CAP_STREAMING;
- cap->capabilities |= dev->ext->ext_vv_data->capabilities;
+ cap->capabilities |= dev->ext_vv_data->capabilities;
return 0;
}
case VIDIOC_G_FBUF:
@@ -942,9 +950,10 @@
struct v4l2_standard *e = arg;
if (e->index < 0 )
return -EINVAL;
- if( e->index < dev->ext->ext_vv_data->num_stds ) {
+ if( e->index < dev->ext_vv_data->num_stds ) {
DEB_EE(("VIDIOC_ENUMSTD: index:%d\n",e->index));
- return v4l2_video_std_construct(e, dev->ext->ext_vv_data->stds[e->index].id, dev->ext->ext_vv_data->stds[e->index].name);
+ v4l2_video_std_construct(e, dev->ext_vv_data->stds[e->index].id, dev->ext_vv_data->stds[e->index].name);
+ return 0;
}
return -EINVAL;
}
@@ -972,13 +981,13 @@
restart_overlay = 1;
}
- for(i = 0; i < dev->ext->ext_vv_data->num_stds; i++)
- if (*id & dev->ext->ext_vv_data->stds[i].id)
+ for(i = 0; i < dev->ext_vv_data->num_stds; i++)
+ if (*id & dev->ext_vv_data->stds[i].id)
break;
- if (i != dev->ext->ext_vv_data->num_stds) {
- vv->standard = &dev->ext->ext_vv_data->stds[i];
- if( NULL != dev->ext->ext_vv_data->std_callback )
- dev->ext->ext_vv_data->std_callback(dev, vv->standard);
+ if (i != dev->ext_vv_data->num_stds) {
+ vv->standard = &dev->ext_vv_data->stds[i];
+ if( NULL != dev->ext_vv_data->std_callback )
+ dev->ext_vv_data->std_callback(dev, vv->standard);
found = 1;
}
@@ -1000,7 +1009,7 @@
int on = *(int *)arg;
int err = 0;
- if( NULL == vv->ov_fmt ) {
+ if( NULL == vv->ov_fmt && on != 0 ) {
DEB_D(("VIDIOC_OVERLAY: no framebuffer informations. call S_FBUF first!\n"));
return -EAGAIN;
}
@@ -1036,12 +1045,18 @@
return videobuf_querybuf(q,arg);
}
case VIDIOC_QBUF: {
- DEB_D(("VIDIOC_QBUF \n"));
- return videobuf_qbuf(file,q,arg);
+ struct v4l2_buffer *b = arg;
+ int ret = 0;
+ ret = videobuf_qbuf(file,q,b);
+ DEB_D(("VIDIOC_QBUF: ret:%d, index:%d\n",ret,b->index));
+ return ret;
}
case VIDIOC_DQBUF: {
- DEB_D(("VIDIOC_DQBUF \n"));
- return videobuf_dqbuf(file,q,arg);
+ struct v4l2_buffer *b = arg;
+ int ret = 0;
+ ret = videobuf_dqbuf(file,q,b);
+ DEB_D(("VIDIOC_DQBUF: ret:%d, index:%d\n",ret,b->index));
+ return ret;
}
case VIDIOC_STREAMON: {
DEB_D(("VIDIOC_STREAMON \n"));
@@ -1075,7 +1090,7 @@
q = &fh->video_q;
down(&q->lock);
- err = videobuf_mmap_setup(file,q,gbuffers,gbufsize);
+ err = videobuf_mmap_setup(file,q,gbuffers,gbufsize); // ,V4L2_MEMORY_MMAP);
if (err < 0) {
up(&q->lock);
return err;
@@ -1250,7 +1265,7 @@
vv->video_q.dev = dev;
/* set some default values */
- vv->standard = &dev->ext->ext_vv_data->stds[0];
+ vv->standard = &dev->ext_vv_data->stds[0];
/* FIXME: what's this? */
vv->current_hps_source = SAA7146_HPS_SOURCE_PORT_A;
@@ -1358,8 +1373,3 @@
.capture_begin = video_begin,
.capture_end = video_end,
};
-
-EXPORT_SYMBOL_GPL(saa7146_video_uops);
-
-EXPORT_SYMBOL_GPL(saa7146_start_preview);
-EXPORT_SYMBOL_GPL(saa7146_stop_preview);
diff -uNrwB --new-file linux-2.6.0-test1.work/drivers/media/common/saa7146_vv_ksyms.c linux-2.6.0-test1.patch/drivers/media/common/saa7146_vv_ksyms.c
--- linux-2.6.0-test1.work/drivers/media/common/saa7146_vv_ksyms.c 1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.0-test1.patch/drivers/media/common/saa7146_vv_ksyms.c 2003-07-01 13:34:48.000000000 +0200
@@ -0,0 +1,15 @@
+#include <linux/module.h>
+#include <media/saa7146_vv.h>
+
+EXPORT_SYMBOL_GPL(saa7146_vbi_uops);
+EXPORT_SYMBOL_GPL(saa7146_video_uops);
+
+EXPORT_SYMBOL_GPL(saa7146_start_preview);
+EXPORT_SYMBOL_GPL(saa7146_stop_preview);
+
+EXPORT_SYMBOL_GPL(saa7146_set_hps_source_and_sync);
+EXPORT_SYMBOL_GPL(saa7146_register_device);
+EXPORT_SYMBOL_GPL(saa7146_unregister_device);
+
+EXPORT_SYMBOL_GPL(saa7146_vv_init);
+EXPORT_SYMBOL_GPL(saa7146_vv_release);
diff -uNrwB --new-file linux-2.6.0-test1.work/drivers/media/dvb/ttpci/budget-av.c linux-2.6.0-test1.patch/drivers/media/dvb/ttpci/budget-av.c
--- linux-2.6.0-test1.work/drivers/media/dvb/ttpci/budget-av.c 2003-07-15 10:59:26.000000000 +0200
+++ linux-2.6.0-test1.patch/drivers/media/dvb/ttpci/budget-av.c 2003-07-07 13:28:54.000000000 +0200
@@ -170,6 +170,7 @@
return err;
}
+static struct saa7146_ext_vv vv_data;
static int budget_av_attach (struct saa7146_dev* dev,
struct saa7146_pci_extension_data *info)
@@ -207,16 +208,22 @@
dvb_delay(500);
if ((err = saa7113_init (budget_av))) {
- budget_av_detach(dev);
+ /* fixme: proper cleanup here */
+ ERR(("cannot init saa7113.\n"));
+ return err;
+ }
+
+ if ( 0 != saa7146_vv_init(dev,&vv_data)) {
+ /* fixme: proper cleanup here */
+ ERR(("cannot init vv subsystem.\n"));
return err;
}
- saa7146_vv_init(dev);
if ((err = saa7146_register_device(&budget_av->vd, dev, "knc1",
VFL_TYPE_GRABBER)))
{
+ /* fixme: proper cleanup here */
ERR(("cannot register capture v4l2 device.\n"));
- budget_av_detach(dev);
return err;
}
@@ -300,11 +307,19 @@
}
static struct saa7146_standard standard[] = {
- { "PAL", V4L2_STD_PAL, SAA7146_PAL_VALUES },
- { "NTSC", V4L2_STD_NTSC, SAA7146_NTSC_VALUES },
+ {
+ .name = "PAL", .id = V4L2_STD_PAL,
+ .v_offset = 0x17, .v_field = 288, .v_calc = 576,
+ .h_offset = 0x14, .h_pixels = 680, .h_calc = 680+1,
+ .v_max_out = 576, .h_max_out = 768,
+ }, {
+ .name = "NTSC", .id = V4L2_STD_NTSC,
+ .v_offset = 0x16, .v_field = 240, .v_calc = 480,
+ .h_offset = 0x06, .h_pixels = 708, .h_calc = 708+1,
+ .v_max_out = 480, .h_max_out = 640,
+ }
};
-
static struct saa7146_ext_vv vv_data = {
.inputs = 2,
.capabilities = 0, // perhaps later: V4L2_CAP_VBI_CAPTURE, but that need tweaking with the saa7113
@@ -339,8 +354,6 @@
.attach = budget_av_attach,
.detach = budget_av_detach,
- .ext_vv_data = &vv_data,
-
.irq_mask = MASK_10,
.irq_func = ttpci_budget_irq10_handler,
};
diff -uNrwB --new-file linux-2.6.0-test1.work/drivers/media/dvb/ttpci/budget-ci.c linux-2.6.0-test1.patch/drivers/media/dvb/ttpci/budget-ci.c
--- linux-2.6.0-test1.work/drivers/media/dvb/ttpci/budget-ci.c 2003-07-15 09:42:37.000000000 +0200
+++ linux-2.6.0-test1.patch/drivers/media/dvb/ttpci/budget-ci.c 2003-07-07 13:28:54.000000000 +0200
@@ -371,7 +377,6 @@
static struct saa7146_extension budget_extension = {
.name = "budget_ci dvb\0",
.flags = 0,
- .ext_vv_data = NULL,
.module = THIS_MODULE,
.pci_tbl = &pci_tbl[0],
diff -uNrwB --new-file linux-2.6.0-test1.work/drivers/media/dvb/ttpci/budget-patch.c linux-2.6.0-test1.patch/drivers/media/dvb/ttpci/budget-patch.c
--- linux-2.6.0-test1.work/drivers/media/dvb/ttpci/budget-patch.c 2003-07-15 10:59:26.000000000 +0200
+++ linux-2.6.0-test1.patch/drivers/media/dvb/ttpci/budget-patch.c 2003-07-07 13:28:54.000000000 +0200
@@ -264,7 +264,6 @@
static struct saa7146_extension budget_extension = {
.name = "budget_patch dvb\0",
.flags = 0,
- .ext_vv_data = NULL,
.module = THIS_MODULE,
.pci_tbl = pci_tbl,
diff -uNrwB --new-file linux-2.6.0-test1.work/drivers/media/dvb/ttpci/budget.c linux-2.6.0-test1.patch/drivers/media/dvb/ttpci/budget.c
--- linux-2.6.0-test1.work/drivers/media/dvb/ttpci/budget.c 2003-07-15 10:59:50.000000000 +0200
+++ linux-2.6.0-test1.patch/drivers/media/dvb/ttpci/budget.c 2003-07-07 13:28:54.000000000 +0200
@@ -215,7 +215,6 @@
static struct saa7146_extension budget_extension = {
.name = "budget dvb\0",
.flags = 0,
- .ext_vv_data = NULL,
.module = THIS_MODULE,
.pci_tbl = pci_tbl,
diff -uNrwB --new-file linux-2.6.0-test1.work/drivers/media/video/dpc7146.c linux-2.6.0-test1.patch/drivers/media/video/dpc7146.c
--- linux-2.6.0-test1.work/drivers/media/video/dpc7146.c 2003-07-15 10:59:26.000000000 +0200
+++ linux-2.6.0-test1.patch/drivers/media/video/dpc7146.c 2003-07-15 09:57:59.000000000 +0200
@@ -173,6 +173,8 @@
return 0;
}
+static struct saa7146_ext_vv vv_data;
+
/* this function only gets called when the probing was successful */
static int dpc_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_data *info)
{
@@ -183,7 +185,7 @@
/* checking for i2c-devices can be omitted here, because we
already did this in "dpc_vl42_probe" */
- saa7146_vv_init(dev);
+ saa7146_vv_init(dev,&vv_data);
if( 0 != saa7146_register_device(&dpc->video_dev, dev, "dpc", VFL_TYPE_GRABBER)) {
ERR(("cannot register capture v4l2 device. skipping.\n"));
return -1;
@@ -308,23 +310,32 @@
}
static struct saa7146_standard standard[] = {
- { "PAL-BG", V4L2_STD_PAL_BG, SAA7146_PAL_VALUES },
- { "PAL-I", V4L2_STD_PAL_I, SAA7146_PAL_VALUES },
- { "NTSC", V4L2_STD_NTSC, SAA7146_NTSC_VALUES },
- { "SECAM", V4L2_STD_SECAM, SAA7146_SECAM_VALUES },
+ {
+ .name = "PAL", .id = V4L2_STD_PAL,
+ .v_offset = 0x17, .v_field = 288, .v_calc = 576,
+ .h_offset = 0x14, .h_pixels = 680, .h_calc = 680+1,
+ .v_max_out = 576, .h_max_out = 768,
+ }, {
+ .name = "NTSC", .id = V4L2_STD_NTSC,
+ .v_offset = 0x16, .v_field = 240, .v_calc = 480,
+ .h_offset = 0x06, .h_pixels = 708, .h_calc = 708+1,
+ .v_max_out = 480, .h_max_out = 640,
+ }, {
+ .name = "SECAM", .id = V4L2_STD_SECAM,
+ .v_offset = 0x14, .v_field = 288, .v_calc = 576,
+ .h_offset = 0x14, .h_pixels = 720, .h_calc = 720+1,
+ .v_max_out = 576, .h_max_out = 768,
+ }
};
-static
-struct saa7146_extension extension;
+static struct saa7146_extension extension;
-static
-struct saa7146_pci_extension_data dpc = {
+static struct saa7146_pci_extension_data dpc = {
.ext_priv = "Multimedia eXtension Board",
.ext = &extension,
};
-static
-struct pci_device_id pci_tbl[] = {
+static struct pci_device_id pci_tbl[] = {
{
.vendor = PCI_VENDOR_ID_PHILIPS,
.device = PCI_DEVICE_ID_PHILIPS_SAA7146,
@@ -338,8 +349,7 @@
MODULE_DEVICE_TABLE(pci, pci_tbl);
-static
-struct saa7146_ext_vv vv_data = {
+static struct saa7146_ext_vv vv_data = {
.inputs = DPC_INPUTS,
.capabilities = V4L2_CAP_VBI_CAPTURE,
.stds = &standard[0],
@@ -349,14 +359,12 @@
.ioctl = dpc_ioctl,
};
-static
-struct saa7146_extension extension = {
+static struct saa7146_extension extension = {
.name = "dpc7146 demonstration board",
.flags = SAA7146_USE_I2C_IRQ,
.pci_tbl = &pci_tbl[0],
.module = THIS_MODULE,
- .ext_vv_data = &vv_data,
.probe = dpc_probe,
.attach = dpc_attach,
diff -uNrwB --new-file linux-2.6.0-test1.work/drivers/media/video/mxb.c linux-2.6.0-test1.patch/drivers/media/video/mxb.c
--- linux-2.6.0-test1.work/drivers/media/video/mxb.c 2003-07-15 10:59:26.000000000 +0200
+++ linux-2.6.0-test1.patch/drivers/media/video/mxb.c 2003-07-15 09:57:50.000000000 +0200
@@ -81,7 +81,7 @@
enum { TUNER, AUX1, AUX3, AUX3_YC };
static struct v4l2_input mxb_inputs[MXB_INPUTS] = {
- { TUNER, "Tuner", V4L2_INPUT_TYPE_TUNER, 1, 1, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
+ { TUNER, "Tuner", V4L2_INPUT_TYPE_TUNER, 1, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
{ AUX1, "AUX1", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
{ AUX3, "AUX3 Composite", V4L2_INPUT_TYPE_CAMERA, 4, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
{ AUX3_YC, "AUX3 S-Video", V4L2_INPUT_TYPE_CAMERA, 4, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
@@ -101,8 +101,8 @@
/* this array holds the information of the audio source (mxb_audios),
which has to be switched corresponding to the video source (mxb_channels) */
-static int video_audio_connect[MXB_AUDIOS] =
- { 0, 1, 2, 3, 3 };
+static int video_audio_connect[MXB_INPUTS] =
+ { 0, 1, 3, 3 };
/* these are the necessary input-output-pins for bringing one audio source
(see above) to the CD-output */
@@ -173,8 +173,7 @@
int cur_mute; /* current mute status */
};
-static
-struct saa7146_extension extension;
+static struct saa7146_extension extension;
static int mxb_vbi_bypass(struct saa7146_dev* dev)
{
@@ -431,10 +430,11 @@
polling method ... */
extension.flags &= ~SAA7146_USE_I2C_IRQ;
for(i = 1;;i++) {
- msg.len = mxb_saa7740_init[i].length;
- if (msg.len == -1U) {
+ if( -1 == mxb_saa7740_init[i].length ) {
break;
}
+
+ msg.len = mxb_saa7740_init[i].length;
msg.buf = &mxb_saa7740_init[i].data[0];
if( 1 != (err = i2c_transfer(&mxb->i2c_adapter, &msg, 1))) {
DEB_D(("failed to initialize 'sound arena module'.\n"));
@@ -472,6 +472,8 @@
}
*/
+static struct saa7146_ext_vv vv_data;
+
/* this function only gets called when the probing was successful */
static int mxb_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_data *info)
{
@@ -482,7 +484,7 @@
/* checking for i2c-devices can be omitted here, because we
already did this in "mxb_vl42_probe" */
- saa7146_vv_init(dev);
+ saa7146_vv_init(dev,&vv_data);
if( 0 != saa7146_register_device(&mxb->video_dev, dev, "mxb", VFL_TYPE_GRABBER)) {
ERR(("cannot register capture v4l2 device. skipping.\n"));
return -1;
@@ -1003,20 +1005,35 @@
}
static struct saa7146_standard standard[] = {
- { "PAL-BG", V4L2_STD_PAL_BG, SAA7146_PAL_VALUES },
- { "PAL-I", V4L2_STD_PAL_I, SAA7146_PAL_VALUES },
- { "NTSC", V4L2_STD_NTSC, SAA7146_NTSC_VALUES },
- { "SECAM", V4L2_STD_SECAM, SAA7146_SECAM_VALUES },
+ {
+ .name = "PAL-BG", .id = V4L2_STD_PAL_BG,
+ .v_offset = 0x17, .v_field = 288, .v_calc = 576,
+ .h_offset = 0x14, .h_pixels = 680, .h_calc = 680+1,
+ .v_max_out = 576, .h_max_out = 768,
+ }, {
+ .name = "PAL-I", .id = V4L2_STD_PAL_I,
+ .v_offset = 0x17, .v_field = 288, .v_calc = 576,
+ .h_offset = 0x14, .h_pixels = 680, .h_calc = 680+1,
+ .v_max_out = 576, .h_max_out = 768,
+ }, {
+ .name = "NTSC", .id = V4L2_STD_NTSC,
+ .v_offset = 0x16, .v_field = 240, .v_calc = 480,
+ .h_offset = 0x06, .h_pixels = 708, .h_calc = 708+1,
+ .v_max_out = 480, .h_max_out = 640,
+ }, {
+ .name = "SECAM", .id = V4L2_STD_SECAM,
+ .v_offset = 0x14, .v_field = 288, .v_calc = 576,
+ .h_offset = 0x14, .h_pixels = 720, .h_calc = 720+1,
+ .v_max_out = 576, .h_max_out = 768,
+ }
};
-static
-struct saa7146_pci_extension_data mxb = {
+static struct saa7146_pci_extension_data mxb = {
.ext_priv = "Multimedia eXtension Board",
.ext = &extension,
};
-static
-struct pci_device_id pci_tbl[] = {
+static struct pci_device_id pci_tbl[] = {
{
.vendor = PCI_VENDOR_ID_PHILIPS,
.device = PCI_DEVICE_ID_PHILIPS_SAA7146,
@@ -1030,8 +1047,7 @@
MODULE_DEVICE_TABLE(pci, pci_tbl);
-static
-struct saa7146_ext_vv vv_data = {
+static struct saa7146_ext_vv vv_data = {
.inputs = MXB_INPUTS,
.capabilities = V4L2_CAP_TUNER | V4L2_CAP_VBI_CAPTURE,
.stds = &standard[0],
@@ -1041,14 +1057,12 @@
.ioctl = mxb_ioctl,
};
-static
-struct saa7146_extension extension = {
+static struct saa7146_extension extension = {
.name = MXB_IDENTIFIER,
.flags = SAA7146_USE_I2C_IRQ,
.pci_tbl = &pci_tbl[0],
.module = THIS_MODULE,
- .ext_vv_data = &vv_data,
.probe = mxb_probe,
.attach = mxb_attach,
diff -uNrwB --new-file linux-2.6.0-test1.work/include/media/saa7146.h linux-2.6.0-test1.patch/include/media/saa7146.h
--- linux-2.6.0-test1.work/include/media/saa7146.h 2003-07-15 09:43:07.000000000 +0200
+++ linux-2.6.0-test1.patch/include/media/saa7146.h 2003-07-07 13:28:54.000000000 +0200
@@ -89,8 +89,6 @@
#define SAA7146_USE_I2C_IRQ 0x1
int flags;
- struct saa7146_ext_vv *ext_vv_data;
-
/* pairs of subvendor and subdevice ids for
supported devices, last entry 0xffff, 0xfff */
struct module *module;
@@ -134,6 +132,7 @@
/* extension handling */
struct saa7146_extension *ext; /* indicates if handled by extension */
void *ext_priv; /* pointer for extension private use (most likely some private data) */
+ struct saa7146_ext_vv *ext_vv_data;
/* per device video/vbi informations (if available) */
struct saa7146_vv *vv_data;
diff -uNrwB --new-file linux-2.6.0-test1.work/include/media/saa7146_vv.h linux-2.6.0-test1.patch/include/media/saa7146_vv.h
--- linux-2.6.0-test1.work/include/media/saa7146_vv.h 2003-07-15 10:59:26.000000000 +0200
+++ linux-2.6.0-test1.patch/include/media/saa7146_vv.h 2003-07-07 13:28:55.000000000 +0200
@@ -39,13 +39,13 @@
char *name;
v4l2_std_id id;
- int v_offset;
- int v_field;
- int v_calc;
-
- int h_offset;
- int h_pixels;
- int h_calc;
+ int v_offset; /* number of lines of vertical offset before processing */
+ int v_field; /* number of lines in a field for HPS to process */
+ int v_calc; /* number of vertical active lines */
+
+ int h_offset; /* horizontal offset of processing window */
+ int h_pixels; /* number of horizontal pixels to process */
+ int h_calc; /* number of horizontal active pixels */
int v_max_out;
int h_max_out;
@@ -120,6 +120,7 @@
/* video capture */
struct saa7146_dmaqueue video_q;
struct saa7146_fh *streaming;
+ enum v4l2_field last_field;
/* common: fixme? shouldn't this be in saa7146_fh?
(this leads to a more complicated question: shall the driver
@@ -186,7 +187,7 @@
void saa7146_buffer_timeout(unsigned long data);
void saa7146_dma_free(struct saa7146_dev *dev,struct saa7146_buf *buf);
-int saa7146_vv_init(struct saa7146_dev* dev);
+int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv);
int saa7146_vv_release(struct saa7146_dev* dev);
@@ -215,35 +216,6 @@
#define SAA7146_HPS_SYNC_PORT_A 0x00
#define SAA7146_HPS_SYNC_PORT_B 0x01
-/* number of vertical active lines */
-#define V_ACTIVE_LINES_PAL 576
-#define V_ACTIVE_LINES_NTSC 480
-#define V_ACTIVE_LINES_SECAM 576
-
-/* number of lines in a field for HPS to process */
-#define V_FIELD_PAL 288
-#define V_FIELD_NTSC 240
-#define V_FIELD_SECAM 288
-
-/* number of lines of vertical offset before processing */
-#define V_OFFSET_PAL 0x17
-#define V_OFFSET_NTSC 0x16
-#define V_OFFSET_SECAM 0x14
-
-/* number of horizontal pixels to process */
-#define H_PIXELS_PAL 680
-#define H_PIXELS_NTSC 708
-#define H_PIXELS_SECAM 720
-
-/* horizontal offset of processing window */
-#define H_OFFSET_PAL 0x14
-#define H_OFFSET_NTSC 0x06
-#define H_OFFSET_SECAM 0x14
-
-#define SAA7146_PAL_VALUES V_OFFSET_PAL, V_FIELD_PAL, V_ACTIVE_LINES_PAL, H_OFFSET_PAL, H_PIXELS_PAL, H_PIXELS_PAL+1, V_ACTIVE_LINES_PAL, 768
-#define SAA7146_NTSC_VALUES V_OFFSET_NTSC, V_FIELD_NTSC, V_ACTIVE_LINES_NTSC, H_OFFSET_NTSC, H_PIXELS_NTSC, H_PIXELS_NTSC+1, V_ACTIVE_LINES_NTSC, 640
-#define SAA7146_SECAM_VALUES V_OFFSET_SECAM, V_FIELD_SECAM, V_ACTIVE_LINES_SECAM, H_OFFSET_SECAM, H_PIXELS_SECAM, H_PIXELS_SECAM+1, V_ACTIVE_LINES_SECAM, 768
-
/* some memory sizes */
#define SAA7146_CLIPPING_MEM (14*PAGE_SIZE)
next prev parent reply other threads:[~2003-07-15 12:17 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-07-15 12:20 [PATCH 1/17] Update the saa7146 driver core Michael Hunold
2003-07-15 12:20 ` [PATCH 2/17] Various small fixes in dvb-core Michael Hunold
2003-07-15 12:20 ` [PATCH 3/17] Major dvb net code cleanup, many fixes Michael Hunold
2003-07-15 12:20 ` [PATCH 4/17] Update dvb frontend drivers Michael Hunold
2003-07-15 12:20 ` [PATCH 5/17] Add Zarlink MT312 DVB-T frontend driver Michael Hunold
2003-07-15 12:20 ` [PATCH 6/17] Update the DVB budget drivers Michael Hunold
2003-07-15 12:20 ` [PATCH 7/17] Update the DVB av7110 driver Michael Hunold
2003-07-15 12:20 ` [PATCH 8/17] Update firmware of " Michael Hunold
2003-07-15 12:20 ` Michael Hunold [this message]
2003-07-15 12:20 ` [PATCH 10/17] Various kconfig and Makefile updates Michael Hunold
2003-07-15 12:20 ` [PATCH 11/17] Add a driver for the Technisat Skystar2 DVB card Michael Hunold
2003-07-15 12:20 ` [PATCH 12/17] Add two drivers for Hexium frame grabber cards Michael Hunold
2003-07-15 12:20 ` [PATCH 13/17] More updates for the dvb core Michael Hunold
2003-07-15 12:20 ` [PATCH 14/17] Add TDA14500x DVB-T frontend driver Michael Hunold
2003-07-15 12:21 ` [PATCH 15/17] Update various other frontend drivers Michael Hunold
2003-07-15 12:21 ` [PATCH 16/17] Update the av7110 DVB driver Michael Hunold
2003-07-16 1:28 ` [PATCH 11/17] Add a driver for the Technisat Skystar2 DVB card Greg KH
2003-07-16 7:41 ` Michael Hunold
2003-07-16 16:37 ` Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=10582716562915@convergence.de \
--to=hunold@convergence.de \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@osdl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.