[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <4BAA582E.3060801@redhat.com>
Date: Wed, 24 Mar 2010 15:21:34 -0300
From: Mauro Carvalho Chehab <mchehab@...hat.com>
To: Randy Dunlap <randy.dunlap@...cle.com>
CC: akpm@...ux-foundation.org, devel@...verdev.osuosl.org,
linux-kernel@...r.kernel.org, shu.lin@...exant.com,
hiep.huynh@...exant.com,
Linux Media Mailing List <linux-media@...r.kernel.org>,
Palash Bandyopadhyay <palash.bandyopadhyay@...exant.com>
Subject: Re: mmotm 2010-03-23-15-34 uploaded (staging vs. media)
Hi Randy,
Randy Dunlap wrote:
> On 03/23/10 15:34, akpm@...ux-foundation.org wrote:
>> The mm-of-the-moment snapshot 2010-03-23-15-34 has been uploaded to
>>
>> http://userweb.kernel.org/~akpm/mmotm/
>>
>> and will soon be available at
>>
>> git://zen-kernel.org/kernel/mmotm.git
>
>
> drivers/staging/cx25821/cx25821-video.c:89:struct cx25821_fmt *format_by_fourcc(unsigned int fourcc)
> (not static)
>
> conflicts with (has the same non-static name as)
>
> drivers/media/common/saa7146_video.c:87:struct saa7146_format* format_by_fourcc(struct saa7146_dev *dev, int fourcc)
>
>
> so when both of these drivers are built into the kernel image:
>
> (.text+0x6360): multiple definition of `format_by_fourcc'
The cx25821 driver is capable of simultaneously handling 8 video inputs at the same time,
and 4 video outputs. However, the way it does is by duplicating exactly the same code
8 times, for input, and 4 times, for the output.
Due to that, several symbols that should normally be internal to the driver's code are
exported (see the huge exports list at drivers/staging/cx25821/cx25821-video.h).
The proper fix is to remove all those duplicated code, adding one parameter into the
board struct, with the number of the video input or output.
While this won't happen, I'll add a patch at the tree, renaming its symbols to contain
cx28521 with this small script:
cat drivers/staging/cx25821/cx25821-video.h|perl -ne 'if (m/extern.* ([^\s\*]+)\(/) { $n=$1; print "s/([^\d\w_\.])$1/\\1cx25821_$1/g;\n" if (!($n =~ m/cx25821/)); }' >changes; for i in drivers/staging/cx25821/*.[ch]; do sed -r -f changes $i >a && mv a $i; done
Cheers,
Mauro
---
As reference, those are the only differences between each cx25821-video[0-7].c:
--- drivers/staging/cx25821/cx25821-video1.c 2010-01-28 19:23:33.000000000 -0200
+++ drivers/staging/cx25821/cx25821-video2.c 2010-01-28 19:23:33.000000000 -0200
@@ -30,7 +30,7 @@ static void buffer_queue(struct videobuf
struct cx25821_buffer *prev;
struct cx25821_fh *fh = vq->priv_data;
struct cx25821_dev *dev = fh->dev;
- struct cx25821_dmaqueue *q = &dev->vidq[SRAM_CH01];
+ struct cx25821_dmaqueue *q = &dev->vidq[SRAM_CH02];
/* add jump to stopper */
buf->risc.jmp[0] = cpu_to_le32(RISC_JUMP | RISC_IRQ1 | RISC_CNT_INC);
@@ -48,7 +48,7 @@ static void buffer_queue(struct videobuf
} else if (list_empty(&q->active)) {
list_add_tail(&buf->vb.queue, &q->active);
cx25821_start_video_dma(dev, q, buf,
- &dev->sram_channels[SRAM_CH01]);
+ &dev->sram_channels[SRAM_CH02]);
buf->vb.state = VIDEOBUF_ACTIVE;
buf->count = q->count++;
mod_timer(&q->timeout, jiffies + BUFFER_TIMEOUT);
@@ -120,7 +120,7 @@ static int video_open(struct file *file)
else
fh->height = 480;
- dev->channel_opened = SRAM_CH01;
+ dev->channel_opened = SRAM_CH02;
pix_format =
(dev->pixel_formats[dev->channel_opened] ==
PIXEL_FRMT_411) ? V4L2_PIX_FMT_Y41P : V4L2_PIX_FMT_YUYV;
@@ -147,7 +147,7 @@ static ssize_t video_read(struct file *f
switch (fh->type) {
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
- if (res_locked(fh->dev, RESOURCE_VIDEO1))
+ if (res_locked(fh->dev, RESOURCE_VIDEO2))
return -EBUSY;
return videobuf_read_one(&fh->vidq, data, count, ppos,
@@ -165,7 +165,7 @@ static unsigned int video_poll(struct fi
struct cx25821_fh *fh = file->private_data;
struct cx25821_buffer *buf;
- if (res_check(fh, RESOURCE_VIDEO1)) {
+ if (res_check(fh, RESOURCE_VIDEO2)) {
/* streaming capture */
if (list_empty(&fh->vidq.stream))
return POLLERR;
@@ -183,7 +183,7 @@ static unsigned int video_poll(struct fi
if (buf->vb.state == VIDEOBUF_DONE) {
struct cx25821_dev *dev = fh->dev;
- if (dev && dev->use_cif_resolution[SRAM_CH01]) {
+ if (dev && dev->use_cif_resolution[SRAM_CH02]) {
u8 cam_id = *((char *)buf->vb.baddr + 3);
memcpy((char *)buf->vb.baddr,
(char *)buf->vb.baddr + (fh->width * 2),
@@ -204,12 +204,12 @@ static int video_release(struct file *fi
struct cx25821_dev *dev = fh->dev;
//stop the risc engine and fifo
- cx_write(channel1->dma_ctl, 0); /* FIFO and RISC disable */
+ cx_write(channel2->dma_ctl, 0); /* FIFO and RISC disable */
/* stop video capture */
- if (res_check(fh, RESOURCE_VIDEO1)) {
+ if (res_check(fh, RESOURCE_VIDEO2)) {
videobuf_queue_cancel(&fh->vidq);
- res_free(dev, fh, RESOURCE_VIDEO1);
+ res_free(dev, fh, RESOURCE_VIDEO2);
}
if (fh->vidq.read_buf) {
@@ -239,7 +239,7 @@ static int vidioc_streamon(struct file *
return -EINVAL;
}
- if (unlikely(!res_get(dev, fh, get_resource(fh, RESOURCE_VIDEO1)))) {
+ if (unlikely(!res_get(dev, fh, get_resource(fh, RESOURCE_VIDEO2)))) {
return -EBUSY;
}
@@ -257,7 +257,7 @@ static int vidioc_streamoff(struct file
if (i != fh->type)
return -EINVAL;
- res = get_resource(fh, RESOURCE_VIDEO1);
+ res = get_resource(fh, RESOURCE_VIDEO2);
err = videobuf_streamoff(get_queue(fh));
if (err < 0)
return err;
@@ -304,16 +304,16 @@ static int vidioc_s_fmt_vid_cap(struct f
else
return -EINVAL;
- cx25821_set_pixel_format(dev, SRAM_CH01, pix_format);
+ cx25821_set_pixel_format(dev, SRAM_CH02, pix_format);
// check if cif resolution
if (fh->width == 320 || fh->width == 352) {
- dev->use_cif_resolution[SRAM_CH01] = 1;
+ dev->use_cif_resolution[SRAM_CH02] = 1;
} else {
- dev->use_cif_resolution[SRAM_CH01] = 0;
+ dev->use_cif_resolution[SRAM_CH02] = 0;
}
- dev->cif_width[SRAM_CH01] = fh->width;
- medusa_set_resolution(dev, fh->width, SRAM_CH01);
+ dev->cif_width[SRAM_CH02] = fh->width;
+ medusa_set_resolution(dev, fh->width, SRAM_CH02);
dprintk(2, "%s() width=%d height=%d field=%d\n", __func__, fh->width,
fh->height, fh->vidq.field);
@@ -330,7 +330,7 @@ static int vidioc_dqbuf(struct file *fil
ret_val = videobuf_dqbuf(get_queue(fh), p, file->f_flags & O_NONBLOCK);
- p->sequence = dev->vidq[SRAM_CH01].count;
+ p->sequence = dev->vidq[SRAM_CH02].count;
return ret_val;
}
@@ -340,15 +340,17 @@ static int vidioc_log_status(struct file
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
char name[32 + 2];
- struct sram_channel *sram_ch = &dev->sram_channels[SRAM_CH01];
+ struct sram_channel *sram_ch = &dev->sram_channels[SRAM_CH02];
u32 tmp = 0;
snprintf(name, sizeof(name), "%s/2", dev->name);
printk(KERN_INFO "%s/2: ============ START LOG STATUS ============\n",
dev->name);
+
cx25821_call_all(dev, core, log_status);
+
tmp = cx_read(sram_ch->dma_ctl);
- printk(KERN_INFO "Video input 1 is %s\n",
+ printk(KERN_INFO "Video input 2 is %s\n",
(tmp & 0x11) ? "streaming" : "stopped");
printk(KERN_INFO "%s/2: ============= END LOG STATUS =============\n",
dev->name);
@@ -368,10 +370,10 @@ static int vidioc_s_ctrl(struct file *fi
return err;
}
- return cx25821_set_control(dev, ctl, SRAM_CH01);
+ return cx25821_set_control(dev, ctl, SRAM_CH02);
}
-//exported stuff
+// exported stuff
static const struct v4l2_file_operations video_fops = {
.owner = THIS_MODULE,
.open = video_open,
@@ -425,7 +427,7 @@ static const struct v4l2_ioctl_ops video
#endif
};
-struct video_device cx25821_video_template1 = {
+struct video_device cx25821_video_template2 = {
.name = "cx25821-video",
.fops = &video_fops,
.ioctl_ops = &video_ioctl_ops,
--
Cheers,
Mauro
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists