Commit 8cad7f06 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6

* 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6:
  [media] gspca - sonixj: Better handling of the bridge registers 0x01 and 0x17
  [media] gspca - sonixj: Add the bit definitions of the bridge reg 0x01 and 0x17
  [media] gspca - sonixj: Set the flag for some devices
  [media] gspca - sonixj: Add a flag in the driver_info table
  [media] gspca - sonixj: Fix a bad probe exchange
  [media] gspca - sonixj: Move bridge init to sd start
  [media] bttv: remove unneeded locking comments
  [media] bttv: fix mutex use before init (BZ#24602)
  [media] Don't export format_by_forcc on two different drivers
parents 92d7c9b2 0e4d413a
...@@ -558,7 +558,7 @@ static void saa7146_set_window(struct saa7146_dev *dev, int width, int height, e ...@@ -558,7 +558,7 @@ static void saa7146_set_window(struct saa7146_dev *dev, int width, int height, e
static void saa7146_set_position(struct saa7146_dev *dev, int w_x, int w_y, int w_height, enum v4l2_field field, u32 pixelformat) static void saa7146_set_position(struct saa7146_dev *dev, int w_x, int w_y, int w_height, enum v4l2_field field, u32 pixelformat)
{ {
struct saa7146_vv *vv = dev->vv_data; struct saa7146_vv *vv = dev->vv_data;
struct saa7146_format *sfmt = format_by_fourcc(dev, pixelformat); struct saa7146_format *sfmt = saa7146_format_by_fourcc(dev, pixelformat);
int b_depth = vv->ov_fmt->depth; int b_depth = vv->ov_fmt->depth;
int b_bpl = vv->ov_fb.fmt.bytesperline; int b_bpl = vv->ov_fb.fmt.bytesperline;
...@@ -702,7 +702,7 @@ static int calculate_video_dma_grab_packed(struct saa7146_dev* dev, struct saa71 ...@@ -702,7 +702,7 @@ static int calculate_video_dma_grab_packed(struct saa7146_dev* dev, struct saa71
struct saa7146_vv *vv = dev->vv_data; struct saa7146_vv *vv = dev->vv_data;
struct saa7146_video_dma vdma1; struct saa7146_video_dma vdma1;
struct saa7146_format *sfmt = format_by_fourcc(dev,buf->fmt->pixelformat); struct saa7146_format *sfmt = saa7146_format_by_fourcc(dev,buf->fmt->pixelformat);
int width = buf->fmt->width; int width = buf->fmt->width;
int height = buf->fmt->height; int height = buf->fmt->height;
...@@ -827,7 +827,7 @@ static int calculate_video_dma_grab_planar(struct saa7146_dev* dev, struct saa71 ...@@ -827,7 +827,7 @@ static int calculate_video_dma_grab_planar(struct saa7146_dev* dev, struct saa71
struct saa7146_video_dma vdma2; struct saa7146_video_dma vdma2;
struct saa7146_video_dma vdma3; struct saa7146_video_dma vdma3;
struct saa7146_format *sfmt = format_by_fourcc(dev,buf->fmt->pixelformat); struct saa7146_format *sfmt = saa7146_format_by_fourcc(dev,buf->fmt->pixelformat);
int width = buf->fmt->width; int width = buf->fmt->width;
int height = buf->fmt->height; int height = buf->fmt->height;
...@@ -994,7 +994,7 @@ static void program_capture_engine(struct saa7146_dev *dev, int planar) ...@@ -994,7 +994,7 @@ static void program_capture_engine(struct saa7146_dev *dev, int planar)
void saa7146_set_capture(struct saa7146_dev *dev, struct saa7146_buf *buf, struct saa7146_buf *next) 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_format *sfmt = saa7146_format_by_fourcc(dev,buf->fmt->pixelformat);
struct saa7146_vv *vv = dev->vv_data; struct saa7146_vv *vv = dev->vv_data;
u32 vdma1_prot_addr; u32 vdma1_prot_addr;
......
...@@ -84,7 +84,7 @@ static struct saa7146_format formats[] = { ...@@ -84,7 +84,7 @@ static struct saa7146_format formats[] = {
static int NUM_FORMATS = sizeof(formats)/sizeof(struct saa7146_format); static int NUM_FORMATS = sizeof(formats)/sizeof(struct saa7146_format);
struct saa7146_format* format_by_fourcc(struct saa7146_dev *dev, int fourcc) struct saa7146_format* saa7146_format_by_fourcc(struct saa7146_dev *dev, int fourcc)
{ {
int i, j = NUM_FORMATS; int i, j = NUM_FORMATS;
...@@ -266,7 +266,7 @@ static int saa7146_pgtable_build(struct saa7146_dev *dev, struct saa7146_buf *bu ...@@ -266,7 +266,7 @@ static int saa7146_pgtable_build(struct saa7146_dev *dev, struct saa7146_buf *bu
struct videobuf_dmabuf *dma=videobuf_to_dma(&buf->vb); struct videobuf_dmabuf *dma=videobuf_to_dma(&buf->vb);
struct scatterlist *list = dma->sglist; struct scatterlist *list = dma->sglist;
int length = dma->sglen; int length = dma->sglen;
struct saa7146_format *sfmt = format_by_fourcc(dev,buf->fmt->pixelformat); struct saa7146_format *sfmt = saa7146_format_by_fourcc(dev,buf->fmt->pixelformat);
DEB_EE(("dev:%p, buf:%p, sg_len:%d\n",dev,buf,length)); DEB_EE(("dev:%p, buf:%p, sg_len:%d\n",dev,buf,length));
...@@ -408,7 +408,7 @@ static int video_begin(struct saa7146_fh *fh) ...@@ -408,7 +408,7 @@ static int video_begin(struct saa7146_fh *fh)
} }
} }
fmt = format_by_fourcc(dev,fh->video_fmt.pixelformat); fmt = saa7146_format_by_fourcc(dev,fh->video_fmt.pixelformat);
/* we need to have a valid format set here */ /* we need to have a valid format set here */
BUG_ON(NULL == fmt); BUG_ON(NULL == fmt);
...@@ -460,7 +460,7 @@ static int video_end(struct saa7146_fh *fh, struct file *file) ...@@ -460,7 +460,7 @@ static int video_end(struct saa7146_fh *fh, struct file *file)
return -EBUSY; return -EBUSY;
} }
fmt = format_by_fourcc(dev,fh->video_fmt.pixelformat); fmt = saa7146_format_by_fourcc(dev,fh->video_fmt.pixelformat);
/* we need to have a valid format set here */ /* we need to have a valid format set here */
BUG_ON(NULL == fmt); BUG_ON(NULL == fmt);
...@@ -536,7 +536,7 @@ static int vidioc_s_fbuf(struct file *file, void *fh, struct v4l2_framebuffer *f ...@@ -536,7 +536,7 @@ static int vidioc_s_fbuf(struct file *file, void *fh, struct v4l2_framebuffer *f
return -EPERM; return -EPERM;
/* check args */ /* check args */
fmt = format_by_fourcc(dev, fb->fmt.pixelformat); fmt = saa7146_format_by_fourcc(dev, fb->fmt.pixelformat);
if (NULL == fmt) if (NULL == fmt)
return -EINVAL; return -EINVAL;
...@@ -760,7 +760,7 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *fh, struct v4l2_forma ...@@ -760,7 +760,7 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *fh, struct v4l2_forma
DEB_EE(("V4L2_BUF_TYPE_VIDEO_CAPTURE: dev:%p, fh:%p\n", dev, fh)); DEB_EE(("V4L2_BUF_TYPE_VIDEO_CAPTURE: dev:%p, fh:%p\n", dev, fh));
fmt = format_by_fourcc(dev, f->fmt.pix.pixelformat); fmt = saa7146_format_by_fourcc(dev, f->fmt.pix.pixelformat);
if (NULL == fmt) if (NULL == fmt)
return -EINVAL; return -EINVAL;
...@@ -1264,7 +1264,7 @@ static int buffer_prepare(struct videobuf_queue *q, ...@@ -1264,7 +1264,7 @@ static int buffer_prepare(struct videobuf_queue *q,
buf->fmt = &fh->video_fmt; buf->fmt = &fh->video_fmt;
buf->vb.field = fh->video_fmt.field; buf->vb.field = fh->video_fmt.field;
sfmt = format_by_fourcc(dev,buf->fmt->pixelformat); sfmt = saa7146_format_by_fourcc(dev,buf->fmt->pixelformat);
release_all_pagetables(dev, buf); release_all_pagetables(dev, buf);
if( 0 != IS_PLANAR(sfmt->trans)) { if( 0 != IS_PLANAR(sfmt->trans)) {
...@@ -1378,7 +1378,7 @@ static int video_open(struct saa7146_dev *dev, struct file *file) ...@@ -1378,7 +1378,7 @@ static int video_open(struct saa7146_dev *dev, struct file *file)
fh->video_fmt.pixelformat = V4L2_PIX_FMT_BGR24; fh->video_fmt.pixelformat = V4L2_PIX_FMT_BGR24;
fh->video_fmt.bytesperline = 0; fh->video_fmt.bytesperline = 0;
fh->video_fmt.field = V4L2_FIELD_ANY; fh->video_fmt.field = V4L2_FIELD_ANY;
sfmt = format_by_fourcc(dev,fh->video_fmt.pixelformat); sfmt = saa7146_format_by_fourcc(dev,fh->video_fmt.pixelformat);
fh->video_fmt.sizeimage = (fh->video_fmt.width * fh->video_fmt.height * sfmt->depth)/8; fh->video_fmt.sizeimage = (fh->video_fmt.width * fh->video_fmt.height * sfmt->depth)/8;
videobuf_queue_sg_init(&fh->video_q, &video_qops, videobuf_queue_sg_init(&fh->video_q, &video_qops,
......
...@@ -854,7 +854,6 @@ int check_alloc_btres_lock(struct bttv *btv, struct bttv_fh *fh, int bit) ...@@ -854,7 +854,6 @@ int check_alloc_btres_lock(struct bttv *btv, struct bttv_fh *fh, int bit)
xbits |= RESOURCE_VIDEO_READ | RESOURCE_VIDEO_STREAM; xbits |= RESOURCE_VIDEO_READ | RESOURCE_VIDEO_STREAM;
/* is it free? */ /* is it free? */
mutex_lock(&btv->lock);
if (btv->resources & xbits) { if (btv->resources & xbits) {
/* no, someone else uses it */ /* no, someone else uses it */
goto fail; goto fail;
...@@ -884,11 +883,9 @@ int check_alloc_btres_lock(struct bttv *btv, struct bttv_fh *fh, int bit) ...@@ -884,11 +883,9 @@ int check_alloc_btres_lock(struct bttv *btv, struct bttv_fh *fh, int bit)
/* it's free, grab it */ /* it's free, grab it */
fh->resources |= bit; fh->resources |= bit;
btv->resources |= bit; btv->resources |= bit;
mutex_unlock(&btv->lock);
return 1; return 1;
fail: fail:
mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -940,7 +937,6 @@ void free_btres_lock(struct bttv *btv, struct bttv_fh *fh, int bits) ...@@ -940,7 +937,6 @@ void free_btres_lock(struct bttv *btv, struct bttv_fh *fh, int bits)
/* trying to free ressources not allocated by us ... */ /* trying to free ressources not allocated by us ... */
printk("bttv: BUG! (btres)\n"); printk("bttv: BUG! (btres)\n");
} }
mutex_lock(&btv->lock);
fh->resources &= ~bits; fh->resources &= ~bits;
btv->resources &= ~bits; btv->resources &= ~bits;
...@@ -951,8 +947,6 @@ void free_btres_lock(struct bttv *btv, struct bttv_fh *fh, int bits) ...@@ -951,8 +947,6 @@ void free_btres_lock(struct bttv *btv, struct bttv_fh *fh, int bits)
if (0 == (bits & VBI_RESOURCES)) if (0 == (bits & VBI_RESOURCES))
disclaim_vbi_lines(btv); disclaim_vbi_lines(btv);
mutex_unlock(&btv->lock);
} }
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
...@@ -1713,28 +1707,20 @@ static int bttv_prepare_buffer(struct videobuf_queue *q,struct bttv *btv, ...@@ -1713,28 +1707,20 @@ static int bttv_prepare_buffer(struct videobuf_queue *q,struct bttv *btv,
/* Make sure tvnorm and vbi_end remain consistent /* Make sure tvnorm and vbi_end remain consistent
until we're done. */ until we're done. */
mutex_lock(&btv->lock);
norm = btv->tvnorm; norm = btv->tvnorm;
/* In this mode capturing always starts at defrect.top /* In this mode capturing always starts at defrect.top
(default VDELAY), ignoring cropping parameters. */ (default VDELAY), ignoring cropping parameters. */
if (btv->vbi_end > bttv_tvnorms[norm].cropcap.defrect.top) { if (btv->vbi_end > bttv_tvnorms[norm].cropcap.defrect.top) {
mutex_unlock(&btv->lock);
return -EINVAL; return -EINVAL;
} }
mutex_unlock(&btv->lock);
c.rect = bttv_tvnorms[norm].cropcap.defrect; c.rect = bttv_tvnorms[norm].cropcap.defrect;
} else { } else {
mutex_lock(&btv->lock);
norm = btv->tvnorm; norm = btv->tvnorm;
c = btv->crop[!!fh->do_crop]; c = btv->crop[!!fh->do_crop];
mutex_unlock(&btv->lock);
if (width < c.min_scaled_width || if (width < c.min_scaled_width ||
width > c.max_scaled_width || width > c.max_scaled_width ||
height < c.min_scaled_height) height < c.min_scaled_height)
...@@ -1858,7 +1844,6 @@ static int bttv_s_std(struct file *file, void *priv, v4l2_std_id *id) ...@@ -1858,7 +1844,6 @@ static int bttv_s_std(struct file *file, void *priv, v4l2_std_id *id)
unsigned int i; unsigned int i;
int err; int err;
mutex_lock(&btv->lock);
err = v4l2_prio_check(&btv->prio, fh->prio); err = v4l2_prio_check(&btv->prio, fh->prio);
if (err) if (err)
goto err; goto err;
...@@ -1874,7 +1859,6 @@ static int bttv_s_std(struct file *file, void *priv, v4l2_std_id *id) ...@@ -1874,7 +1859,6 @@ static int bttv_s_std(struct file *file, void *priv, v4l2_std_id *id)
set_tvnorm(btv, i); set_tvnorm(btv, i);
err: err:
mutex_unlock(&btv->lock);
return err; return err;
} }
...@@ -1898,7 +1882,6 @@ static int bttv_enum_input(struct file *file, void *priv, ...@@ -1898,7 +1882,6 @@ static int bttv_enum_input(struct file *file, void *priv,
struct bttv *btv = fh->btv; struct bttv *btv = fh->btv;
int rc = 0; int rc = 0;
mutex_lock(&btv->lock);
if (i->index >= bttv_tvcards[btv->c.type].video_inputs) { if (i->index >= bttv_tvcards[btv->c.type].video_inputs) {
rc = -EINVAL; rc = -EINVAL;
goto err; goto err;
...@@ -1928,7 +1911,6 @@ static int bttv_enum_input(struct file *file, void *priv, ...@@ -1928,7 +1911,6 @@ static int bttv_enum_input(struct file *file, void *priv,
i->std = BTTV_NORMS; i->std = BTTV_NORMS;
err: err:
mutex_unlock(&btv->lock);
return rc; return rc;
} }
...@@ -1938,9 +1920,7 @@ static int bttv_g_input(struct file *file, void *priv, unsigned int *i) ...@@ -1938,9 +1920,7 @@ static int bttv_g_input(struct file *file, void *priv, unsigned int *i)
struct bttv_fh *fh = priv; struct bttv_fh *fh = priv;
struct bttv *btv = fh->btv; struct bttv *btv = fh->btv;
mutex_lock(&btv->lock);
*i = btv->input; *i = btv->input;
mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -1952,7 +1932,6 @@ static int bttv_s_input(struct file *file, void *priv, unsigned int i) ...@@ -1952,7 +1932,6 @@ static int bttv_s_input(struct file *file, void *priv, unsigned int i)
int err; int err;
mutex_lock(&btv->lock);
err = v4l2_prio_check(&btv->prio, fh->prio); err = v4l2_prio_check(&btv->prio, fh->prio);
if (unlikely(err)) if (unlikely(err))
goto err; goto err;
...@@ -1965,7 +1944,6 @@ static int bttv_s_input(struct file *file, void *priv, unsigned int i) ...@@ -1965,7 +1944,6 @@ static int bttv_s_input(struct file *file, void *priv, unsigned int i)
set_input(btv, i, btv->tvnorm); set_input(btv, i, btv->tvnorm);
err: err:
mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -1979,7 +1957,6 @@ static int bttv_s_tuner(struct file *file, void *priv, ...@@ -1979,7 +1957,6 @@ static int bttv_s_tuner(struct file *file, void *priv,
if (unlikely(0 != t->index)) if (unlikely(0 != t->index))
return -EINVAL; return -EINVAL;
mutex_lock(&btv->lock);
if (unlikely(btv->tuner_type == TUNER_ABSENT)) { if (unlikely(btv->tuner_type == TUNER_ABSENT)) {
err = -EINVAL; err = -EINVAL;
goto err; goto err;
...@@ -1995,7 +1972,6 @@ static int bttv_s_tuner(struct file *file, void *priv, ...@@ -1995,7 +1972,6 @@ static int bttv_s_tuner(struct file *file, void *priv,
btv->audio_mode_gpio(btv, t, 1); btv->audio_mode_gpio(btv, t, 1);
err: err:
mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -2006,10 +1982,8 @@ static int bttv_g_frequency(struct file *file, void *priv, ...@@ -2006,10 +1982,8 @@ static int bttv_g_frequency(struct file *file, void *priv,
struct bttv_fh *fh = priv; struct bttv_fh *fh = priv;
struct bttv *btv = fh->btv; struct bttv *btv = fh->btv;
mutex_lock(&btv->lock);
f->type = btv->radio_user ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV; f->type = btv->radio_user ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
f->frequency = btv->freq; f->frequency = btv->freq;
mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -2024,7 +1998,6 @@ static int bttv_s_frequency(struct file *file, void *priv, ...@@ -2024,7 +1998,6 @@ static int bttv_s_frequency(struct file *file, void *priv,
if (unlikely(f->tuner != 0)) if (unlikely(f->tuner != 0))
return -EINVAL; return -EINVAL;
mutex_lock(&btv->lock);
err = v4l2_prio_check(&btv->prio, fh->prio); err = v4l2_prio_check(&btv->prio, fh->prio);
if (unlikely(err)) if (unlikely(err))
goto err; goto err;
...@@ -2039,7 +2012,6 @@ static int bttv_s_frequency(struct file *file, void *priv, ...@@ -2039,7 +2012,6 @@ static int bttv_s_frequency(struct file *file, void *priv,
if (btv->has_matchbox && btv->radio_user) if (btv->has_matchbox && btv->radio_user)
tea5757_set_freq(btv, btv->freq); tea5757_set_freq(btv, btv->freq);
err: err:
mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -2172,7 +2144,6 @@ limit_scaled_size_lock (struct bttv_fh * fh, ...@@ -2172,7 +2144,6 @@ limit_scaled_size_lock (struct bttv_fh * fh,
/* Make sure tvnorm, vbi_end and the current cropping parameters /* Make sure tvnorm, vbi_end and the current cropping parameters
remain consistent until we're done. */ remain consistent until we're done. */
mutex_lock(&btv->lock);
b = &bttv_tvnorms[btv->tvnorm].cropcap.bounds; b = &bttv_tvnorms[btv->tvnorm].cropcap.bounds;
...@@ -2250,7 +2221,6 @@ limit_scaled_size_lock (struct bttv_fh * fh, ...@@ -2250,7 +2221,6 @@ limit_scaled_size_lock (struct bttv_fh * fh,
rc = 0; /* success */ rc = 0; /* success */
fail: fail:
mutex_unlock(&btv->lock);
return rc; return rc;
} }
...@@ -2282,9 +2252,7 @@ verify_window_lock (struct bttv_fh * fh, ...@@ -2282,9 +2252,7 @@ verify_window_lock (struct bttv_fh * fh,
if (V4L2_FIELD_ANY == field) { if (V4L2_FIELD_ANY == field) {
__s32 height2; __s32 height2;
mutex_lock(&fh->btv->lock);
height2 = fh->btv->crop[!!fh->do_crop].rect.height >> 1; height2 = fh->btv->crop[!!fh->do_crop].rect.height >> 1;
mutex_unlock(&fh->btv->lock);
field = (win->w.height > height2) field = (win->w.height > height2)
? V4L2_FIELD_INTERLACED ? V4L2_FIELD_INTERLACED
: V4L2_FIELD_TOP; : V4L2_FIELD_TOP;
...@@ -2360,7 +2328,6 @@ static int setup_window_lock(struct bttv_fh *fh, struct bttv *btv, ...@@ -2360,7 +2328,6 @@ static int setup_window_lock(struct bttv_fh *fh, struct bttv *btv,
} }
} }
mutex_lock(&fh->cap.vb_lock);
/* clip against screen */ /* clip against screen */
if (NULL != btv->fbuf.base) if (NULL != btv->fbuf.base)
n = btcx_screen_clips(btv->fbuf.fmt.width, btv->fbuf.fmt.height, n = btcx_screen_clips(btv->fbuf.fmt.width, btv->fbuf.fmt.height,
...@@ -2391,13 +2358,6 @@ static int setup_window_lock(struct bttv_fh *fh, struct bttv *btv, ...@@ -2391,13 +2358,6 @@ static int setup_window_lock(struct bttv_fh *fh, struct bttv *btv,
fh->ov.field = win->field; fh->ov.field = win->field;
fh->ov.setup_ok = 1; fh->ov.setup_ok = 1;
/*
* FIXME: btv is protected by btv->lock mutex, while btv->init
* is protected by fh->cap.vb_lock. This seems to open the
* possibility for some race situations. Maybe the better would
* be to unify those locks or to use another way to store the
* init values that will be consumed by videobuf callbacks
*/
btv->init.ov.w.width = win->w.width; btv->init.ov.w.width = win->w.width;
btv->init.ov.w.height = win->w.height; btv->init.ov.w.height = win->w.height;
btv->init.ov.field = win->field; btv->init.ov.field = win->field;
...@@ -2412,7 +2372,6 @@ static int setup_window_lock(struct bttv_fh *fh, struct bttv *btv, ...@@ -2412,7 +2372,6 @@ static int setup_window_lock(struct bttv_fh *fh, struct bttv *btv,
bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new); bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
retval = bttv_switch_overlay(btv,fh,new); retval = bttv_switch_overlay(btv,fh,new);
} }
mutex_unlock(&fh->cap.vb_lock);
return retval; return retval;
} }
...@@ -2526,9 +2485,7 @@ static int bttv_try_fmt_vid_cap(struct file *file, void *priv, ...@@ -2526,9 +2485,7 @@ static int bttv_try_fmt_vid_cap(struct file *file, void *priv,
if (V4L2_FIELD_ANY == field) { if (V4L2_FIELD_ANY == field) {
__s32 height2; __s32 height2;
mutex_lock(&btv->lock);
height2 = btv->crop[!!fh->do_crop].rect.height >> 1; height2 = btv->crop[!!fh->do_crop].rect.height >> 1;
mutex_unlock(&btv->lock);
field = (f->fmt.pix.height > height2) field = (f->fmt.pix.height > height2)
? V4L2_FIELD_INTERLACED ? V4L2_FIELD_INTERLACED
: V4L2_FIELD_BOTTOM; : V4L2_FIELD_BOTTOM;
...@@ -2614,7 +2571,6 @@ static int bttv_s_fmt_vid_cap(struct file *file, void *priv, ...@@ -2614,7 +2571,6 @@ static int bttv_s_fmt_vid_cap(struct file *file, void *priv,
fmt = format_by_fourcc(f->fmt.pix.pixelformat); fmt = format_by_fourcc(f->fmt.pix.pixelformat);
/* update our state informations */ /* update our state informations */
mutex_lock(&fh->cap.vb_lock);
fh->fmt = fmt; fh->fmt = fmt;
fh->cap.field = f->fmt.pix.field; fh->cap.field = f->fmt.pix.field;
fh->cap.last = V4L2_FIELD_NONE; fh->cap.last = V4L2_FIELD_NONE;
...@@ -2623,7 +2579,6 @@ static int bttv_s_fmt_vid_cap(struct file *file, void *priv, ...@@ -2623,7 +2579,6 @@ static int bttv_s_fmt_vid_cap(struct file *file, void *priv,
btv->init.fmt = fmt; btv->init.fmt = fmt;
btv->init.width = f->fmt.pix.width; btv->init.width = f->fmt.pix.width;
btv->init.height = f->fmt.pix.height; btv->init.height = f->fmt.pix.height;
mutex_unlock(&fh->cap.vb_lock);
return 0; return 0;
} }
...@@ -2649,11 +2604,9 @@ static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf) ...@@ -2649,11 +2604,9 @@ static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
unsigned int i; unsigned int i;
struct bttv_fh *fh = priv; struct bttv_fh *fh = priv;
mutex_lock(&fh->cap.vb_lock);
retval = __videobuf_mmap_setup(&fh->cap, gbuffers, gbufsize, retval = __videobuf_mmap_setup(&fh->cap, gbuffers, gbufsize,
V4L2_MEMORY_MMAP); V4L2_MEMORY_MMAP);
if (retval < 0) { if (retval < 0) {
mutex_unlock(&fh->cap.vb_lock);
return retval; return retval;
} }
...@@ -2665,7 +2618,6 @@ static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf) ...@@ -2665,7 +2618,6 @@ static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
for (i = 0; i < gbuffers; i++) for (i = 0; i < gbuffers; i++)
mbuf->offsets[i] = i * gbufsize; mbuf->offsets[i] = i * gbufsize;
mutex_unlock(&fh->cap.vb_lock);
return 0; return 0;
} }
#endif #endif
...@@ -2775,10 +2727,8 @@ static int bttv_overlay(struct file *file, void *f, unsigned int on) ...@@ -2775,10 +2727,8 @@ static int bttv_overlay(struct file *file, void *f, unsigned int on)
int retval = 0; int retval = 0;
if (on) { if (on) {
mutex_lock(&fh->cap.vb_lock);
/* verify args */ /* verify args */
if (unlikely(!btv->fbuf.base)) { if (unlikely(!btv->fbuf.base)) {
mutex_unlock(&fh->cap.vb_lock);
return -EINVAL; return -EINVAL;
} }
if (unlikely(!fh->ov.setup_ok)) { if (unlikely(!fh->ov.setup_ok)) {
...@@ -2787,13 +2737,11 @@ static int bttv_overlay(struct file *file, void *f, unsigned int on) ...@@ -2787,13 +2737,11 @@ static int bttv_overlay(struct file *file, void *f, unsigned int on)
} }
if (retval) if (retval)
return retval; return retval;
mutex_unlock(&fh->cap.vb_lock);
} }
if (!check_alloc_btres_lock(btv, fh, RESOURCE_OVERLAY)) if (!check_alloc_btres_lock(btv, fh, RESOURCE_OVERLAY))
return -EBUSY; return -EBUSY;
mutex_lock(&fh->cap.vb_lock);
if (on) { if (on) {
fh->ov.tvnorm = btv->tvnorm; fh->ov.tvnorm = btv->tvnorm;
new = videobuf_sg_alloc(sizeof(*new)); new = videobuf_sg_alloc(sizeof(*new));
...@@ -2805,7 +2753,6 @@ static int bttv_overlay(struct file *file, void *f, unsigned int on) ...@@ -2805,7 +2753,6 @@ static int bttv_overlay(struct file *file, void *f, unsigned int on)
/* switch over */ /* switch over */
retval = bttv_switch_overlay(btv, fh, new); retval = bttv_switch_overlay(btv, fh, new);
mutex_unlock(&fh->cap.vb_lock);
return retval; return retval;
} }
...@@ -2844,7 +2791,6 @@ static int bttv_s_fbuf(struct file *file, void *f, ...@@ -2844,7 +2791,6 @@ static int bttv_s_fbuf(struct file *file, void *f,
} }
/* ok, accept it */ /* ok, accept it */
mutex_lock(&fh->cap.vb_lock);
btv->fbuf.base = fb->base; btv->fbuf.base = fb->base;
btv->fbuf.fmt.width = fb->fmt.width; btv->fbuf.fmt.width = fb->fmt.width;
btv->fbuf.fmt.height = fb->fmt.height; btv->fbuf.fmt.height = fb->fmt.height;
...@@ -2876,7 +2822,6 @@ static int bttv_s_fbuf(struct file *file, void *f, ...@@ -2876,7 +2822,6 @@ static int bttv_s_fbuf(struct file *file, void *f,
retval = bttv_switch_overlay(btv, fh, new); retval = bttv_switch_overlay(btv, fh, new);
} }
} }
mutex_unlock(&fh->cap.vb_lock);
return retval; return retval;
} }
...@@ -2955,7 +2900,6 @@ static int bttv_queryctrl(struct file *file, void *priv, ...@@ -2955,7 +2900,6 @@ static int bttv_queryctrl(struct file *file, void *priv,
c->id >= V4L2_CID_PRIVATE_LASTP1)) c->id >= V4L2_CID_PRIVATE_LASTP1))
return -EINVAL; return -EINVAL;
mutex_lock(&btv->lock);
if (!btv->volume_gpio && (c->id == V4L2_CID_AUDIO_VOLUME)) if (!btv->volume_gpio && (c->id == V4L2_CID_AUDIO_VOLUME))
*c = no_ctl; *c = no_ctl;
else { else {
...@@ -2963,7 +2907,6 @@ static int bttv_queryctrl(struct file *file, void *priv, ...@@ -2963,7 +2907,6 @@ static int bttv_queryctrl(struct file *file, void *priv,
*c = (NULL != ctrl) ? *ctrl : no_ctl; *c = (NULL != ctrl) ? *ctrl : no_ctl;
} }
mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -2974,10 +2917,8 @@ static int bttv_g_parm(struct file *file, void *f, ...@@ -2974,10 +2917,8 @@ static int bttv_g_parm(struct file *file, void *f,
struct bttv_fh *fh = f; struct bttv_fh *fh = f;
struct bttv *btv = fh->btv; struct bttv *btv = fh->btv;
mutex_lock(&btv->lock);
v4l2_video_std_frame_period(bttv_tvnorms[btv->tvnorm].v4l2_id, v4l2_video_std_frame_period(bttv_tvnorms[btv->tvnorm].v4l2_id,
&parm->parm.capture.timeperframe); &parm->parm.capture.timeperframe);
mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -2993,7 +2934,6 @@ static int bttv_g_tuner(struct file *file, void *priv, ...@@ -2993,7 +2934,6 @@ static int bttv_g_tuner(struct file *file, void *priv,
if (0 != t->index) if (0 != t->index)
return -EINVAL; return -EINVAL;
mutex_lock(&btv->lock);
t->rxsubchans = V4L2_TUNER_SUB_MONO; t->rxsubchans = V4L2_TUNER_SUB_MONO;
bttv_call_all(btv, tuner, g_tuner, t); bttv_call_all(btv, tuner, g_tuner, t);
strcpy(t->name, "Television"); strcpy(t->name, "Television");
...@@ -3005,7 +2945,6 @@ static int bttv_g_tuner(struct file *file, void *priv, ...@@ -3005,7 +2945,6 @@ static int bttv_g_tuner(struct file *file, void *priv,
if (btv->audio_mode_gpio) if (btv->audio_mode_gpio)
btv->audio_mode_gpio(btv, t, 0); btv->audio_mode_gpio(btv, t, 0);
mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -3014,9 +2953,7 @@ static int bttv_g_priority(struct file *file, void *f, enum v4l2_priority *p) ...@@ -3014,9 +2953,7 @@ static int bttv_g_priority(struct file *file, void *f, enum v4l2_priority *p)
struct bttv_fh *fh = f; struct bttv_fh *fh = f;
struct bttv *btv = fh->btv; struct bttv *btv = fh->btv;
mutex_lock(&btv->lock);
*p = v4l2_prio_max(&btv->prio); *p = v4l2_prio_max(&btv->prio);
mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -3028,9 +2965,7 @@ static int bttv_s_priority(struct file *file, void *f, ...@@ -3028,9 +2965,7 @@ static int bttv_s_priority(struct file *file, void *f,
struct bttv *btv = fh->btv; struct bttv *btv = fh->btv;
int rc; int rc;
mutex_lock(&btv->lock);
rc = v4l2_prio_change(&btv->prio, &fh->prio, prio); rc = v4l2_prio_change(&btv->prio, &fh->prio, prio);
mutex_unlock(&btv->lock);
return rc; return rc;
} }
...@@ -3045,9 +2980,7 @@ static int bttv_cropcap(struct file *file, void *priv, ...@@ -3045,9 +2980,7 @@ static int bttv_cropcap(struct file *file, void *priv,
cap->type != V4L2_BUF_TYPE_VIDEO_OVERLAY) cap->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
return -EINVAL; return -EINVAL;
mutex_lock(&btv->lock);
*cap = bttv_tvnorms[btv->tvnorm].cropcap; *cap = bttv_tvnorms[btv->tvnorm].cropcap;
mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -3065,9 +2998,7 @@ static int bttv_g_crop(struct file *file, void *f, struct v4l2_crop *crop) ...@@ -3065,9 +2998,7 @@ static int bttv_g_crop(struct file *file, void *f, struct v4l2_crop *crop)
inconsistent with fh->width or fh->height and apps inconsistent with fh->width or fh->height and apps
do not expect a change here. */ do not expect a change here. */
mutex_lock(&btv->lock);
crop->c = btv->crop[!!fh->do_crop].rect; crop->c = btv->crop[!!fh->do_crop].rect;
mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -3091,17 +3022,14 @@ static int bttv_s_crop(struct file *file, void *f, struct v4l2_crop *crop) ...@@ -3091,17 +3022,14 @@ static int bttv_s_crop(struct file *file, void *f, struct v4l2_crop *crop)
/* Make sure tvnorm, vbi_end and the current cropping /* Make sure tvnorm, vbi_end and the current cropping
parameters remain consistent until we're done. Note parameters remain consistent until we're done. Note
read() may change vbi_end in check_alloc_btres_lock(). */ read() may change vbi_end in check_alloc_btres_lock(). */
mutex_lock(&btv->lock);
retval = v4l2_prio_check(&btv->prio, fh->prio); retval = v4l2_prio_check(&btv->prio, fh->prio);
if (0 != retval) { if (0 != retval) {
mutex_unlock(&btv->lock);
return retval; return retval;
} }
retval = -EBUSY; retval = -EBUSY;
if (locked_btres(fh->btv, VIDEO_RESOURCES)) { if (locked_btres(fh->btv, VIDEO_RESOURCES)) {
mutex_unlock(&btv->lock);
return retval; return retval;
} }
...@@ -3113,7 +3041,6 @@ static int bttv_s_crop(struct file *file, void *f, struct v4l2_crop *crop) ...@@ -3113,7 +3041,6 @@ static int bttv_s_crop(struct file *file, void *f, struct v4l2_crop *crop)
b_top = max(b->top, btv->vbi_end); b_top = max(b->top, btv->vbi_end);
if (b_top + 32 >= b_bottom) { if (b_top + 32 >= b_bottom) {
mutex_unlock(&btv->lock);
return retval; return retval;
} }
...@@ -3136,12 +3063,8 @@ static int bttv_s_crop(struct file *file, void *f, struct v4l2_crop *crop) ...@@ -3136,12 +3063,8 @@ static int bttv_s_crop(struct file *file, void *f, struct v4l2_crop *crop)
btv->crop[1] = c; btv->crop[1] = c;
mutex_unlock(&btv->lock);
fh->do_crop = 1; fh->do_crop = 1;
mutex_lock(&fh->cap.vb_lock);
if (fh->width < c.min_scaled_width) { if (fh->width < c.min_scaled_width) {
fh->width = c.min_scaled_width; fh->width = c.min_scaled_width;
btv->init.width = c.min_scaled_width; btv->init.width = c.min_scaled_width;
...@@ -3158,8 +3081,6 @@ static int bttv_s_crop(struct file *file, void *f, struct v4l2_crop *crop) ...@@ -3158,8 +3081,6 @@ static int bttv_s_crop(struct file *file, void *f, struct v4l2_crop *crop)
btv->init.height = c.max_scaled_height; btv->init.height = c.max_scaled_height;
} }
mutex_unlock(&fh->cap.vb_lock);
return 0; return 0;
} }
...@@ -3227,7 +3148,6 @@ static unsigned int bttv_poll(struct file *file, poll_table *wait) ...@@ -3227,7 +3148,6 @@ static unsigned int bttv_poll(struct file *file, poll_table *wait)
return videobuf_poll_stream(file, &fh->vbi, wait); return videobuf_poll_stream(file, &fh->vbi, wait);
} }
mutex_lock(&fh->cap.vb_lock);
if (check_btres(fh,RESOURCE_VIDEO_STREAM)) { if (check_btres(fh,RESOURCE_VIDEO_STREAM)) {
/* streaming capture */ /* streaming capture */
if (list_empty(&fh->cap.stream)) if (list_empty(&fh->cap.stream))
...@@ -3262,7 +3182,6 @@ static unsigned int bttv_poll(struct file *file, poll_table *wait) ...@@ -3262,7 +3182,6 @@ static unsigned int bttv_poll(struct file *file, poll_table *wait)
else else
rc = 0; rc = 0;
err: err:
mutex_unlock(&fh->cap.vb_lock);
return rc; return rc;
} }
...@@ -3293,23 +3212,11 @@ static int bttv_open(struct file *file) ...@@ -3293,23 +3212,11 @@ static int bttv_open(struct file *file)
return -ENOMEM; return -ENOMEM;
file->private_data = fh; file->private_data = fh;
/*
* btv is protected by btv->lock mutex, while btv->init and other
* streaming vars are protected by fh->cap.vb_lock. We need to take
* care of both locks to avoid troubles. However, vb_lock is used also
* inside videobuf, without calling buf->lock. So, it is a very bad
* idea to hold both locks at the same time.
* Let's first copy btv->init at fh, holding cap.vb_lock, and then work
* with the rest of init, holding btv->lock.
*/
mutex_lock(&fh->cap.vb_lock);
*fh = btv->init; *fh = btv->init;
mutex_unlock(&fh->cap.vb_lock);
fh->type = type; fh->type = type;
fh->ov.setup_ok = 0; fh->ov.setup_ok = 0;
mutex_lock(&btv->lock);
v4l2_prio_open(&btv->prio, &fh->prio); v4l2_prio_open(&btv->prio, &fh->prio);
videobuf_queue_sg_init(&fh->cap, &bttv_video_qops, videobuf_queue_sg_init(&fh->cap, &bttv_video_qops,
...@@ -3317,13 +3224,13 @@ static int bttv_open(struct file *file) ...@@ -3317,13 +3224,13 @@ static int bttv_open(struct file *file)
V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_BUF_TYPE_VIDEO_CAPTURE,
V4L2_FIELD_INTERLACED, V4L2_FIELD_INTERLACED,
sizeof(struct bttv_buffer), sizeof(struct bttv_buffer),
fh, NULL); fh, &btv->lock);
videobuf_queue_sg_init(&fh->vbi, &bttv_vbi_qops, videobuf_queue_sg_init(&fh->vbi, &bttv_vbi_qops,
&btv->c.pci->dev, &btv->s_lock, &btv->c.pci->dev, &btv->s_lock,
V4L2_BUF_TYPE_VBI_CAPTURE, V4L2_BUF_TYPE_VBI_CAPTURE,
V4L2_FIELD_SEQ_TB, V4L2_FIELD_SEQ_TB,
sizeof(struct bttv_buffer), sizeof(struct bttv_buffer),
fh, NULL); fh, &btv->lock);
set_tvnorm(btv,btv->tvnorm); set_tvnorm(btv,btv->tvnorm);
set_input(btv, btv->input, btv->tvnorm); set_input(btv, btv->input, btv->tvnorm);
...@@ -3346,7 +3253,6 @@ static int bttv_open(struct file *file) ...@@ -3346,7 +3253,6 @@ static int bttv_open(struct file *file)
bttv_vbi_fmt_reset(&fh->vbi_fmt, btv->tvnorm); bttv_vbi_fmt_reset(&fh->vbi_fmt, btv->tvnorm);
bttv_field_count(btv); bttv_field_count(btv);
mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -3355,7 +3261,6 @@ static int bttv_release(struct file *file) ...@@ -3355,7 +3261,6 @@ static int bttv_release(struct file *file)
struct bttv_fh *fh = file->private_data; struct bttv_fh *fh = file->private_data;
struct bttv *btv = fh->btv; struct bttv *btv = fh->btv;
mutex_lock(&btv->lock);
/* turn off overlay */ /* turn off overlay */
if (check_btres(fh, RESOURCE_OVERLAY)) if (check_btres(fh, RESOURCE_OVERLAY))
bttv_switch_overlay(btv,fh,NULL); bttv_switch_overlay(btv,fh,NULL);
...@@ -3381,14 +3286,8 @@ static int bttv_release(struct file *file) ...@@ -3381,14 +3286,8 @@ static int bttv_release(struct file *file)
/* free stuff */ /* free stuff */
/*
* videobuf uses cap.vb_lock - we should avoid holding btv->lock,
* otherwise we may have dead lock conditions
*/
mutex_unlock(&btv->lock);
videobuf_mmap_free(&fh->cap); videobuf_mmap_free(&fh->cap);
videobuf_mmap_free(&fh->vbi); videobuf_mmap_free(&fh->vbi);
mutex_lock(&btv->lock);
v4l2_prio_close(&btv->prio, fh->prio); v4l2_prio_close(&btv->prio, fh->prio);
file->private_data = NULL; file->private_data = NULL;
kfree(fh); kfree(fh);
...@@ -3398,7 +3297,6 @@ static int bttv_release(struct file *file) ...@@ -3398,7 +3297,6 @@ static int bttv_release(struct file *file)
if (!btv->users) if (!btv->users)
audio_mute(btv, 1); audio_mute(btv, 1);
mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -3502,11 +3400,8 @@ static int radio_open(struct file *file) ...@@ -3502,11 +3400,8 @@ static int radio_open(struct file *file)
if (unlikely(!fh)) if (unlikely(!fh))
return -ENOMEM; return -ENOMEM;
file->private_data = fh; file->private_data = fh;
mutex_lock(&fh->cap.vb_lock);
*fh = btv->init; *fh = btv->init;
mutex_unlock(&fh->cap.vb_lock);
mutex_lock(&btv->lock);
v4l2_prio_open(&btv->prio, &fh->prio); v4l2_prio_open(&btv->prio, &fh->prio);
btv->radio_user++; btv->radio_user++;
...@@ -3514,7 +3409,6 @@ static int radio_open(struct file *file) ...@@ -3514,7 +3409,6 @@ static int radio_open(struct file *file)
bttv_call_all(btv, tuner, s_radio); bttv_call_all(btv, tuner, s_radio);
audio_input(btv,TVAUDIO_INPUT_RADIO); audio_input(btv,TVAUDIO_INPUT_RADIO);
mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -3524,7 +3418,6 @@ static int radio_release(struct file *file) ...@@ -3524,7 +3418,6 @@ static int radio_release(struct file *file)
struct bttv *btv = fh->btv; struct bttv *btv = fh->btv;
struct rds_command cmd; struct rds_command cmd;
mutex_lock(&btv->lock);
v4l2_prio_close(&btv->prio, fh->prio); v4l2_prio_close(&btv->prio, fh->prio);
file->private_data = NULL; file->private_data = NULL;
kfree(fh); kfree(fh);
...@@ -3532,7 +3425,6 @@ static int radio_release(struct file *file) ...@@ -3532,7 +3425,6 @@ static int radio_release(struct file *file)
btv->radio_user--; btv->radio_user--;
bttv_call_all(btv, core, ioctl, RDS_CMD_CLOSE, &cmd); bttv_call_all(btv, core, ioctl, RDS_CMD_CLOSE, &cmd);
mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -3561,7 +3453,6 @@ static int radio_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t) ...@@ -3561,7 +3453,6 @@ static int radio_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
return -EINVAL; return -EINVAL;
if (0 != t->index) if (0 != t->index)
return -EINVAL; return -EINVAL;
mutex_lock(&btv->lock);
strcpy(t->name, "Radio"); strcpy(t->name, "Radio");
t->type = V4L2_TUNER_RADIO; t->type = V4L2_TUNER_RADIO;
...@@ -3570,8 +3461,6 @@ static int radio_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t) ...@@ -3570,8 +3461,6 @@ static int radio_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
if (btv->audio_mode_gpio) if (btv->audio_mode_gpio)
btv->audio_mode_gpio(btv, t, 0); btv->audio_mode_gpio(btv, t, 0);
mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -3692,7 +3581,7 @@ static const struct v4l2_file_operations radio_fops = ...@@ -3692,7 +3581,7 @@ static const struct v4l2_file_operations radio_fops =
.open = radio_open, .open = radio_open,
.read = radio_read, .read = radio_read,
.release = radio_release, .release = radio_release,
.ioctl = video_ioctl2, .unlocked_ioctl = video_ioctl2,
.poll = radio_poll, .poll = radio_poll,
}; };
......
...@@ -63,7 +63,10 @@ struct sd { ...@@ -63,7 +63,10 @@ struct sd {
#define QUALITY_DEF 80 #define QUALITY_DEF 80
u8 jpegqual; /* webcam quality */ u8 jpegqual; /* webcam quality */
u8 reg01;
u8 reg17;
u8 reg18; u8 reg18;
u8 flags;
s8 ag_cnt; s8 ag_cnt;
#define AG_CNT_START 13 #define AG_CNT_START 13
...@@ -96,6 +99,22 @@ enum sensors { ...@@ -96,6 +99,22 @@ enum sensors {
SENSOR_SP80708, SENSOR_SP80708,
}; };
/* device flags */
#define PDN_INV 1 /* inverse pin S_PWR_DN / sn_xxx tables */
/* sn9c1xx definitions */
/* register 0x01 */
#define S_PWR_DN 0x01 /* sensor power down */
#define S_PDN_INV 0x02 /* inverse pin S_PWR_DN */
#define V_TX_EN 0x04 /* video transfer enable */
#define LED 0x08 /* output to pin LED */
#define SCL_SEL_OD 0x20 /* open-drain mode */
#define SYS_SEL_48M 0x40 /* system clock 0: 24MHz, 1: 48MHz */
/* register 0x17 */
#define MCK_SIZE_MASK 0x1f /* sensor master clock */
#define SEN_CLK_EN 0x20 /* enable sensor clock */
#define DEF_EN 0x80 /* defect pixel by 0: soft, 1: hard */
/* V4L2 controls supported by the driver */ /* V4L2 controls supported by the driver */
static void setbrightness(struct gspca_dev *gspca_dev); static void setbrightness(struct gspca_dev *gspca_dev);
static void setcontrast(struct gspca_dev *gspca_dev); static void setcontrast(struct gspca_dev *gspca_dev);
...@@ -1755,141 +1774,6 @@ static void po2030n_probe(struct gspca_dev *gspca_dev) ...@@ -1755,141 +1774,6 @@ static void po2030n_probe(struct gspca_dev *gspca_dev)
} }
} }
static void bridge_init(struct gspca_dev *gspca_dev,
const u8 *sn9c1xx)
{
struct sd *sd = (struct sd *) gspca_dev;
u8 reg0102[2];
const u8 *reg9a;
static const u8 reg9a_def[] =
{0x00, 0x40, 0x20, 0x00, 0x00, 0x00};
static const u8 reg9a_spec[] =
{0x00, 0x40, 0x38, 0x30, 0x00, 0x20};
static const u8 regd4[] = {0x60, 0x00, 0x00};
/* sensor clock already enabled in sd_init */
/* reg_w1(gspca_dev, 0xf1, 0x00); */
reg_w1(gspca_dev, 0x01, sn9c1xx[1]);
/* configure gpio */
reg0102[0] = sn9c1xx[1];
reg0102[1] = sn9c1xx[2];
if (gspca_dev->audio)
reg0102[1] |= 0x04; /* keep the audio connection */
reg_w(gspca_dev, 0x01, reg0102, 2);
reg_w(gspca_dev, 0x08, &sn9c1xx[8], 2);
reg_w(gspca_dev, 0x17, &sn9c1xx[0x17], 5);
switch (sd->sensor) {
case SENSOR_GC0307:
case SENSOR_OV7660:
case SENSOR_PO1030:
case SENSOR_PO2030N:
case SENSOR_SOI768:
case SENSOR_SP80708:
reg9a = reg9a_spec;
break;
default:
reg9a = reg9a_def;
break;
}
reg_w(gspca_dev, 0x9a, reg9a, 6);
reg_w(gspca_dev, 0xd4, regd4, sizeof regd4);
reg_w(gspca_dev, 0x03, &sn9c1xx[3], 0x0f);
switch (sd->sensor) {
case SENSOR_ADCM1700:
reg_w1(gspca_dev, 0x01, 0x43);
reg_w1(gspca_dev, 0x17, 0x62);
reg_w1(gspca_dev, 0x01, 0x42);
reg_w1(gspca_dev, 0x01, 0x42);
break;
case SENSOR_GC0307:
msleep(50);
reg_w1(gspca_dev, 0x01, 0x61);
reg_w1(gspca_dev, 0x17, 0x22);
reg_w1(gspca_dev, 0x01, 0x60);
reg_w1(gspca_dev, 0x01, 0x40);
msleep(50);
break;
case SENSOR_MI0360B:
reg_w1(gspca_dev, 0x01, 0x61);
reg_w1(gspca_dev, 0x17, 0x60);
reg_w1(gspca_dev, 0x01, 0x60);
reg_w1(gspca_dev, 0x01, 0x40);
break;
case SENSOR_MT9V111:
reg_w1(gspca_dev, 0x01, 0x61);
reg_w1(gspca_dev, 0x17, 0x61);
reg_w1(gspca_dev, 0x01, 0x60);
reg_w1(gspca_dev, 0x01, 0x40);
break;
case SENSOR_OM6802:
msleep(10);
reg_w1(gspca_dev, 0x02, 0x73);
reg_w1(gspca_dev, 0x17, 0x60);
reg_w1(gspca_dev, 0x01, 0x22);
msleep(100);
reg_w1(gspca_dev, 0x01, 0x62);
reg_w1(gspca_dev, 0x17, 0x64);
reg_w1(gspca_dev, 0x17, 0x64);
reg_w1(gspca_dev, 0x01, 0x42);
msleep(10);
reg_w1(gspca_dev, 0x01, 0x42);
i2c_w8(gspca_dev, om6802_init0[0]);
i2c_w8(gspca_dev, om6802_init0[1]);
msleep(15);
reg_w1(gspca_dev, 0x02, 0x71);
msleep(150);
break;
case SENSOR_OV7630:
reg_w1(gspca_dev, 0x01, 0x61);
reg_w1(gspca_dev, 0x17, 0xe2);
reg_w1(gspca_dev, 0x01, 0x60);
reg_w1(gspca_dev, 0x01, 0x40);
break;
case SENSOR_OV7648:
reg_w1(gspca_dev, 0x01, 0x63);
reg_w1(gspca_dev, 0x17, 0x20);
reg_w1(gspca_dev, 0x01, 0x62);
reg_w1(gspca_dev, 0x01, 0x42);
break;
case SENSOR_PO1030:
case SENSOR_SOI768:
reg_w1(gspca_dev, 0x01, 0x61);
reg_w1(gspca_dev, 0x17, 0x20);
reg_w1(gspca_dev, 0x01, 0x60);
reg_w1(gspca_dev, 0x01, 0x40);
break;
case SENSOR_PO2030N:
case SENSOR_OV7660:
reg_w1(gspca_dev, 0x01, 0x63);
reg_w1(gspca_dev, 0x17, 0x20);
reg_w1(gspca_dev, 0x01, 0x62);
reg_w1(gspca_dev, 0x01, 0x42);
break;
case SENSOR_SP80708:
reg_w1(gspca_dev, 0x01, 0x63);
reg_w1(gspca_dev, 0x17, 0x20);
reg_w1(gspca_dev, 0x01, 0x62);
reg_w1(gspca_dev, 0x01, 0x42);
msleep(100);
reg_w1(gspca_dev, 0x02, 0x62);
break;
default:
/* case SENSOR_HV7131R: */
/* case SENSOR_MI0360: */
/* case SENSOR_MO4000: */
reg_w1(gspca_dev, 0x01, 0x43);
reg_w1(gspca_dev, 0x17, 0x61);
reg_w1(gspca_dev, 0x01, 0x42);
if (sd->sensor == SENSOR_HV7131R)
hv7131r_probe(gspca_dev);
break;
}
}
/* this function is called at probe time */ /* this function is called at probe time */
static int sd_config(struct gspca_dev *gspca_dev, static int sd_config(struct gspca_dev *gspca_dev,
const struct usb_device_id *id) const struct usb_device_id *id)
...@@ -1898,7 +1782,8 @@ static int sd_config(struct gspca_dev *gspca_dev, ...@@ -1898,7 +1782,8 @@ static int sd_config(struct gspca_dev *gspca_dev,
struct cam *cam; struct cam *cam;
sd->bridge = id->driver_info >> 16; sd->bridge = id->driver_info >> 16;
sd->sensor = id->driver_info; sd->sensor = id->driver_info >> 8;
sd->flags = id->driver_info;
cam = &gspca_dev->cam; cam = &gspca_dev->cam;
if (sd->sensor == SENSOR_ADCM1700) { if (sd->sensor == SENSOR_ADCM1700) {
...@@ -1929,7 +1814,7 @@ static int sd_init(struct gspca_dev *gspca_dev) ...@@ -1929,7 +1814,7 @@ static int sd_init(struct gspca_dev *gspca_dev)
/* setup a selector by bridge */ /* setup a selector by bridge */
reg_w1(gspca_dev, 0xf1, 0x01); reg_w1(gspca_dev, 0xf1, 0x01);
reg_r(gspca_dev, 0x00, 1); reg_r(gspca_dev, 0x00, 1);
reg_w1(gspca_dev, 0xf1, gspca_dev->usb_buf[0]); reg_w1(gspca_dev, 0xf1, 0x00);
reg_r(gspca_dev, 0x00, 1); /* get sonix chip id */ reg_r(gspca_dev, 0x00, 1); /* get sonix chip id */
regF1 = gspca_dev->usb_buf[0]; regF1 = gspca_dev->usb_buf[0];
if (gspca_dev->usb_err < 0) if (gspca_dev->usb_err < 0)
...@@ -2423,10 +2308,17 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -2423,10 +2308,17 @@ static int sd_start(struct gspca_dev *gspca_dev)
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
int i; int i;
u8 reg1, reg17; u8 reg01, reg17;
u8 reg0102[2];
const u8 *sn9c1xx; const u8 *sn9c1xx;
const u8 (*init)[8]; const u8 (*init)[8];
const u8 *reg9a;
int mode; int mode;
static const u8 reg9a_def[] =
{0x00, 0x40, 0x20, 0x00, 0x00, 0x00};
static const u8 reg9a_spec[] =
{0x00, 0x40, 0x38, 0x30, 0x00, 0x20};
static const u8 regd4[] = {0x60, 0x00, 0x00};
static const u8 C0[] = { 0x2d, 0x2d, 0x3a, 0x05, 0x04, 0x3f }; static const u8 C0[] = { 0x2d, 0x2d, 0x3a, 0x05, 0x04, 0x3f };
static const u8 CA[] = { 0x28, 0xd8, 0x14, 0xec }; static const u8 CA[] = { 0x28, 0xd8, 0x14, 0xec };
static const u8 CA_adcm1700[] = static const u8 CA_adcm1700[] =
...@@ -2448,7 +2340,85 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -2448,7 +2340,85 @@ static int sd_start(struct gspca_dev *gspca_dev)
/* initialize the bridge */ /* initialize the bridge */
sn9c1xx = sn_tb[sd->sensor]; sn9c1xx = sn_tb[sd->sensor];
bridge_init(gspca_dev, sn9c1xx);
/* sensor clock already enabled in sd_init */
/* reg_w1(gspca_dev, 0xf1, 0x00); */
reg01 = sn9c1xx[1];
if (sd->flags & PDN_INV)
reg01 ^= S_PDN_INV; /* power down inverted */
reg_w1(gspca_dev, 0x01, reg01);
/* configure gpio */
reg0102[0] = reg01;
reg0102[1] = sn9c1xx[2];
if (gspca_dev->audio)
reg0102[1] |= 0x04; /* keep the audio connection */
reg_w(gspca_dev, 0x01, reg0102, 2);
reg_w(gspca_dev, 0x08, &sn9c1xx[8], 2);
reg_w(gspca_dev, 0x17, &sn9c1xx[0x17], 5);
switch (sd->sensor) {
case SENSOR_GC0307:
case SENSOR_OV7660:
case SENSOR_PO1030:
case SENSOR_PO2030N:
case SENSOR_SOI768:
case SENSOR_SP80708:
reg9a = reg9a_spec;
break;
default:
reg9a = reg9a_def;
break;
}
reg_w(gspca_dev, 0x9a, reg9a, 6);
reg_w(gspca_dev, 0xd4, regd4, sizeof regd4);
reg_w(gspca_dev, 0x03, &sn9c1xx[3], 0x0f);
reg17 = sn9c1xx[0x17];
switch (sd->sensor) {
case SENSOR_GC0307:
msleep(50); /*fixme: is it useful? */
break;
case SENSOR_OM6802:
msleep(10);
reg_w1(gspca_dev, 0x02, 0x73);
reg17 |= SEN_CLK_EN;
reg_w1(gspca_dev, 0x17, reg17);
reg_w1(gspca_dev, 0x01, 0x22);
msleep(100);
reg01 = SCL_SEL_OD | S_PDN_INV;
reg17 &= MCK_SIZE_MASK;
reg17 |= 0x04; /* clock / 4 */
break;
}
reg01 |= SYS_SEL_48M;
reg_w1(gspca_dev, 0x01, reg01);
reg17 |= SEN_CLK_EN;
reg_w1(gspca_dev, 0x17, reg17);
reg01 &= ~S_PWR_DN; /* sensor power on */
reg_w1(gspca_dev, 0x01, reg01);
reg01 &= ~SYS_SEL_48M;
reg_w1(gspca_dev, 0x01, reg01);
switch (sd->sensor) {
case SENSOR_HV7131R:
hv7131r_probe(gspca_dev); /*fixme: is it useful? */
break;
case SENSOR_OM6802:
msleep(10);
reg_w1(gspca_dev, 0x01, reg01);
i2c_w8(gspca_dev, om6802_init0[0]);
i2c_w8(gspca_dev, om6802_init0[1]);
msleep(15);
reg_w1(gspca_dev, 0x02, 0x71);
msleep(150);
break;
case SENSOR_SP80708:
msleep(100);
reg_w1(gspca_dev, 0x02, 0x62);
break;
}
/* initialize the sensor */ /* initialize the sensor */
i2c_w_seq(gspca_dev, sensor_init[sd->sensor]); i2c_w_seq(gspca_dev, sensor_init[sd->sensor]);
...@@ -2476,30 +2446,11 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -2476,30 +2446,11 @@ static int sd_start(struct gspca_dev *gspca_dev)
} }
reg_w1(gspca_dev, 0x18, sn9c1xx[0x18]); reg_w1(gspca_dev, 0x18, sn9c1xx[0x18]);
switch (sd->sensor) { switch (sd->sensor) {
case SENSOR_GC0307: case SENSOR_OM6802:
reg17 = 0xa2; /* case SENSOR_OV7648: * fixme: sometimes */
break;
case SENSOR_MT9V111:
case SENSOR_MI0360B:
reg17 = 0xe0;
break;
case SENSOR_ADCM1700:
case SENSOR_OV7630:
reg17 = 0xe2;
break;
case SENSOR_OV7648:
reg17 = 0x20;
break;
case SENSOR_OV7660:
case SENSOR_SOI768:
reg17 = 0xa0;
break;
case SENSOR_PO1030:
case SENSOR_PO2030N:
reg17 = 0xa0;
break; break;
default: default:
reg17 = 0x60; reg17 |= DEF_EN;
break; break;
} }
reg_w1(gspca_dev, 0x17, reg17); reg_w1(gspca_dev, 0x17, reg17);
...@@ -2546,95 +2497,67 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -2546,95 +2497,67 @@ static int sd_start(struct gspca_dev *gspca_dev)
init = NULL; init = NULL;
mode = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv; mode = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv;
if (mode) reg01 |= SYS_SEL_48M | V_TX_EN;
reg1 = 0x46; /* 320x240: clk 48Mhz, video trf enable */ reg17 &= ~MCK_SIZE_MASK;
else reg17 |= 0x02; /* clock / 2 */
reg1 = 0x06; /* 640x480: clk 24Mhz, video trf enable */
reg17 = 0x61; /* 0x:20: enable sensor clock */
switch (sd->sensor) { switch (sd->sensor) {
case SENSOR_ADCM1700: case SENSOR_ADCM1700:
init = adcm1700_sensor_param1; init = adcm1700_sensor_param1;
reg1 = 0x46;
reg17 = 0xe2;
break; break;
case SENSOR_GC0307: case SENSOR_GC0307:
init = gc0307_sensor_param1; init = gc0307_sensor_param1;
reg17 = 0xa2; break;
reg1 = 0x44; case SENSOR_HV7131R:
case SENSOR_MI0360:
if (mode)
reg01 |= SYS_SEL_48M; /* 320x240: clk 48Mhz */
else
reg01 &= ~SYS_SEL_48M; /* 640x480: clk 24Mhz */
reg17 &= ~MCK_SIZE_MASK;
reg17 |= 0x01; /* clock / 1 */
break; break;
case SENSOR_MI0360B: case SENSOR_MI0360B:
init = mi0360b_sensor_param1; init = mi0360b_sensor_param1;
reg1 &= ~0x02; /* don't inverse pin S_PWR_DN */
reg17 = 0xe2;
break; break;
case SENSOR_MO4000: case SENSOR_MO4000:
if (mode) { if (mode) { /* if 320x240 */
/* reg1 = 0x46; * 320 clk 48Mhz 60fp/s */ reg01 &= ~SYS_SEL_48M; /* clk 24Mz */
reg1 = 0x06; /* clk 24Mz */ reg17 &= ~MCK_SIZE_MASK;
} else { reg17 |= 0x01; /* clock / 1 */
reg17 = 0x22; /* 640 MCKSIZE */
/* reg1 = 0x06; * 640 clk 24Mz (done) */
} }
break; break;
case SENSOR_MT9V111: case SENSOR_MT9V111:
init = mt9v111_sensor_param1; init = mt9v111_sensor_param1;
if (mode) {
reg1 = 0x04; /* 320 clk 48Mhz */
} else {
/* reg1 = 0x06; * 640 clk 24Mz (done) */
reg17 = 0xc2;
}
break; break;
case SENSOR_OM6802: case SENSOR_OM6802:
init = om6802_sensor_param1; init = om6802_sensor_param1;
reg17 = 0x64; /* 640 MCKSIZE */ if (!mode) { /* if 640x480 */
reg17 &= ~MCK_SIZE_MASK;
reg17 |= 0x01; /* clock / 4 */
}
break; break;
case SENSOR_OV7630: case SENSOR_OV7630:
init = ov7630_sensor_param1; init = ov7630_sensor_param1;
reg17 = 0xe2;
reg1 = 0x44;
break; break;
case SENSOR_OV7648: case SENSOR_OV7648:
init = ov7648_sensor_param1; init = ov7648_sensor_param1;
reg17 = 0x21; reg17 &= ~MCK_SIZE_MASK;
/* reg1 = 0x42; * 42 - 46? */ reg17 |= 0x01; /* clock / 1 */
break; break;
case SENSOR_OV7660: case SENSOR_OV7660:
init = ov7660_sensor_param1; init = ov7660_sensor_param1;
if (sd->bridge == BRIDGE_SN9C120) {
if (mode) { /* 320x240 - 160x120 */
reg17 = 0xa2;
reg1 = 0x44; /* 48 Mhz, video trf eneble */
}
} else {
reg17 = 0x22;
reg1 = 0x06; /* 24 Mhz, video trf eneble
* inverse power down */
}
break; break;
case SENSOR_PO1030: case SENSOR_PO1030:
init = po1030_sensor_param1; init = po1030_sensor_param1;
reg17 = 0xa2;
reg1 = 0x44;
break; break;
case SENSOR_PO2030N: case SENSOR_PO2030N:
init = po2030n_sensor_param1; init = po2030n_sensor_param1;
reg1 = 0x46;
reg17 = 0xa2;
break; break;
case SENSOR_SOI768: case SENSOR_SOI768:
init = soi768_sensor_param1; init = soi768_sensor_param1;
reg1 = 0x44;
reg17 = 0xa2;
break; break;
case SENSOR_SP80708: case SENSOR_SP80708:
init = sp80708_sensor_param1; init = sp80708_sensor_param1;
if (mode) {
/*?? reg1 = 0x04; * 320 clk 48Mhz */
} else {
reg1 = 0x46; /* 640 clk 48Mz */
reg17 = 0xa2;
}
break; break;
} }
...@@ -2684,7 +2607,9 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -2684,7 +2607,9 @@ static int sd_start(struct gspca_dev *gspca_dev)
setjpegqual(gspca_dev); setjpegqual(gspca_dev);
reg_w1(gspca_dev, 0x17, reg17); reg_w1(gspca_dev, 0x17, reg17);
reg_w1(gspca_dev, 0x01, reg1); reg_w1(gspca_dev, 0x01, reg01);
sd->reg01 = reg01;
sd->reg17 = reg17;
sethvflip(gspca_dev); sethvflip(gspca_dev);
setbrightness(gspca_dev); setbrightness(gspca_dev);
...@@ -2706,41 +2631,64 @@ static void sd_stopN(struct gspca_dev *gspca_dev) ...@@ -2706,41 +2631,64 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
{ 0xa1, 0x21, 0x76, 0x20, 0x00, 0x00, 0x00, 0x10 }; { 0xa1, 0x21, 0x76, 0x20, 0x00, 0x00, 0x00, 0x10 };
static const u8 stopsoi768[] = static const u8 stopsoi768[] =
{ 0xa1, 0x21, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10 }; { 0xa1, 0x21, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10 };
u8 data; u8 reg01;
const u8 *sn9c1xx; u8 reg17;
data = 0x0b; reg01 = sd->reg01;
reg17 = sd->reg17 & ~SEN_CLK_EN;
switch (sd->sensor) { switch (sd->sensor) {
case SENSOR_ADCM1700:
case SENSOR_GC0307: case SENSOR_GC0307:
data = 0x29; case SENSOR_PO2030N:
case SENSOR_SP80708:
reg01 |= LED;
reg_w1(gspca_dev, 0x01, reg01);
reg01 &= ~(LED | V_TX_EN);
reg_w1(gspca_dev, 0x01, reg01);
/* reg_w1(gspca_dev, 0x02, 0x??); * LED off ? */
break; break;
case SENSOR_HV7131R: case SENSOR_HV7131R:
reg01 &= ~V_TX_EN;
reg_w1(gspca_dev, 0x01, reg01);
i2c_w8(gspca_dev, stophv7131); i2c_w8(gspca_dev, stophv7131);
data = 0x2b;
break; break;
case SENSOR_MI0360: case SENSOR_MI0360:
case SENSOR_MI0360B: case SENSOR_MI0360B:
reg01 &= ~V_TX_EN;
reg_w1(gspca_dev, 0x01, reg01);
/* reg_w1(gspca_dev, 0x02, 0x40); * LED off ? */
i2c_w8(gspca_dev, stopmi0360); i2c_w8(gspca_dev, stopmi0360);
data = 0x29;
break; break;
case SENSOR_OV7648:
i2c_w8(gspca_dev, stopov7648);
/* fall thru */
case SENSOR_MT9V111: case SENSOR_MT9V111:
case SENSOR_OV7630: case SENSOR_OM6802:
case SENSOR_PO1030: case SENSOR_PO1030:
data = 0x29; reg01 &= ~V_TX_EN;
reg_w1(gspca_dev, 0x01, reg01);
break;
case SENSOR_OV7630:
case SENSOR_OV7648:
reg01 &= ~V_TX_EN;
reg_w1(gspca_dev, 0x01, reg01);
i2c_w8(gspca_dev, stopov7648);
break;
case SENSOR_OV7660:
reg01 &= ~V_TX_EN;
reg_w1(gspca_dev, 0x01, reg01);
break; break;
case SENSOR_SOI768: case SENSOR_SOI768:
i2c_w8(gspca_dev, stopsoi768); i2c_w8(gspca_dev, stopsoi768);
data = 0x29;
break; break;
} }
sn9c1xx = sn_tb[sd->sensor];
reg_w1(gspca_dev, 0x01, sn9c1xx[1]); reg01 |= SCL_SEL_OD;
reg_w1(gspca_dev, 0x17, sn9c1xx[0x17]); reg_w1(gspca_dev, 0x01, reg01);
reg_w1(gspca_dev, 0x01, sn9c1xx[1]); reg01 |= S_PWR_DN; /* sensor power down */
reg_w1(gspca_dev, 0x01, data); reg_w1(gspca_dev, 0x01, reg01);
reg_w1(gspca_dev, 0x17, reg17);
reg01 &= ~SYS_SEL_48M; /* clock 24MHz */
reg_w1(gspca_dev, 0x01, reg01);
reg01 |= LED;
reg_w1(gspca_dev, 0x01, reg01);
/* Don't disable sensor clock as that disables the button on the cam */ /* Don't disable sensor clock as that disables the button on the cam */
/* reg_w1(gspca_dev, 0xf1, 0x01); */ /* reg_w1(gspca_dev, 0xf1, 0x01); */
} }
...@@ -2954,14 +2902,18 @@ static const struct sd_desc sd_desc = { ...@@ -2954,14 +2902,18 @@ static const struct sd_desc sd_desc = {
/* -- module initialisation -- */ /* -- module initialisation -- */
#define BS(bridge, sensor) \ #define BS(bridge, sensor) \
.driver_info = (BRIDGE_ ## bridge << 16) \ .driver_info = (BRIDGE_ ## bridge << 16) \
| SENSOR_ ## sensor | (SENSOR_ ## sensor << 8)
#define BSF(bridge, sensor, flags) \
.driver_info = (BRIDGE_ ## bridge << 16) \
| (SENSOR_ ## sensor << 8) \
| (flags)
static const __devinitdata struct usb_device_id device_table[] = { static const __devinitdata struct usb_device_id device_table[] = {
#if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE #if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE
{USB_DEVICE(0x0458, 0x7025), BS(SN9C120, MI0360)}, {USB_DEVICE(0x0458, 0x7025), BS(SN9C120, MI0360)},
{USB_DEVICE(0x0458, 0x702e), BS(SN9C120, OV7660)}, {USB_DEVICE(0x0458, 0x702e), BS(SN9C120, OV7660)},
#endif #endif
{USB_DEVICE(0x045e, 0x00f5), BS(SN9C105, OV7660)}, {USB_DEVICE(0x045e, 0x00f5), BSF(SN9C105, OV7660, PDN_INV)},
{USB_DEVICE(0x045e, 0x00f7), BS(SN9C105, OV7660)}, {USB_DEVICE(0x045e, 0x00f7), BSF(SN9C105, OV7660, PDN_INV)},
{USB_DEVICE(0x0471, 0x0327), BS(SN9C105, MI0360)}, {USB_DEVICE(0x0471, 0x0327), BS(SN9C105, MI0360)},
{USB_DEVICE(0x0471, 0x0328), BS(SN9C105, MI0360)}, {USB_DEVICE(0x0471, 0x0328), BS(SN9C105, MI0360)},
{USB_DEVICE(0x0471, 0x0330), BS(SN9C105, MI0360)}, {USB_DEVICE(0x0471, 0x0330), BS(SN9C105, MI0360)},
......
...@@ -92,7 +92,7 @@ int cx25821_get_format_size(void) ...@@ -92,7 +92,7 @@ int cx25821_get_format_size(void)
return ARRAY_SIZE(formats); return ARRAY_SIZE(formats);
} }
struct cx25821_fmt *format_by_fourcc(unsigned int fourcc) struct cx25821_fmt *cx25821_format_by_fourcc(unsigned int fourcc)
{ {
unsigned int i; unsigned int i;
...@@ -848,7 +848,7 @@ static int video_open(struct file *file) ...@@ -848,7 +848,7 @@ static int video_open(struct file *file)
pix_format = pix_format =
(dev->channels[ch_id].pixel_formats == (dev->channels[ch_id].pixel_formats ==
PIXEL_FRMT_411) ? V4L2_PIX_FMT_Y41P : V4L2_PIX_FMT_YUYV; PIXEL_FRMT_411) ? V4L2_PIX_FMT_Y41P : V4L2_PIX_FMT_YUYV;
fh->fmt = format_by_fourcc(pix_format); fh->fmt = cx25821_format_by_fourcc(pix_format);
v4l2_prio_open(&dev->channels[ch_id].prio, &fh->prio); v4l2_prio_open(&dev->channels[ch_id].prio, &fh->prio);
...@@ -1010,7 +1010,7 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv, ...@@ -1010,7 +1010,7 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
if (0 != err) if (0 != err)
return err; return err;
fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat); fh->fmt = cx25821_format_by_fourcc(f->fmt.pix.pixelformat);
fh->vidq.field = f->fmt.pix.field; fh->vidq.field = f->fmt.pix.field;
/* check if width and height is valid based on set standard */ /* check if width and height is valid based on set standard */
...@@ -1119,7 +1119,7 @@ int cx25821_vidioc_try_fmt_vid_cap(struct file *file, void *priv, struct v4l2_fo ...@@ -1119,7 +1119,7 @@ int cx25821_vidioc_try_fmt_vid_cap(struct file *file, void *priv, struct v4l2_fo
enum v4l2_field field; enum v4l2_field field;
unsigned int maxw, maxh; unsigned int maxw, maxh;
fmt = format_by_fourcc(f->fmt.pix.pixelformat); fmt = cx25821_format_by_fourcc(f->fmt.pix.pixelformat);
if (NULL == fmt) if (NULL == fmt)
return -EINVAL; return -EINVAL;
......
...@@ -87,7 +87,7 @@ extern unsigned int vid_limit; ...@@ -87,7 +87,7 @@ extern unsigned int vid_limit;
#define FORMAT_FLAGS_PACKED 0x01 #define FORMAT_FLAGS_PACKED 0x01
extern struct cx25821_fmt formats[]; extern struct cx25821_fmt formats[];
extern struct cx25821_fmt *format_by_fourcc(unsigned int fourcc); extern struct cx25821_fmt *cx25821_format_by_fourcc(unsigned int fourcc);
extern struct cx25821_data timeout_data[MAX_VID_CHANNEL_NUM]; extern struct cx25821_data timeout_data[MAX_VID_CHANNEL_NUM];
extern void cx25821_dump_video_queue(struct cx25821_dev *dev, extern void cx25821_dump_video_queue(struct cx25821_dev *dev,
......
...@@ -161,7 +161,7 @@ extern struct list_head saa7146_devices; ...@@ -161,7 +161,7 @@ extern struct list_head saa7146_devices;
extern struct mutex saa7146_devices_lock; extern struct mutex saa7146_devices_lock;
int saa7146_register_extension(struct saa7146_extension*); int saa7146_register_extension(struct saa7146_extension*);
int saa7146_unregister_extension(struct saa7146_extension*); int saa7146_unregister_extension(struct saa7146_extension*);
struct saa7146_format* format_by_fourcc(struct saa7146_dev *dev, int fourcc); struct saa7146_format* saa7146_format_by_fourcc(struct saa7146_dev *dev, int fourcc);
int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt); int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt);
void saa7146_pgtable_free(struct pci_dev *pci, struct saa7146_pgtable *pt); void saa7146_pgtable_free(struct pci_dev *pci, struct saa7146_pgtable *pt);
int saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt, struct scatterlist *list, int length ); int saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt, struct scatterlist *list, int length );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment