Skip to content

Commit

Permalink
V4L/DVB (5808): Bttv: fix v4l1 breaking the driver
Browse files Browse the repository at this point in the history
If one uses a V4L *one* application, such as vlc or mplayer's v4l driver, as
the first user after the driver is loaded, the driver wedges itself and will
never capture properly.  Even if one uses a V4L2 application later, it still
won't work.

If one uses a V4L *two* application first, such as tvtime or mplayer's v4l2
driver, then the driver will be ok.  One can then run a V4L1 application, and
it will work.

It turns out the problem is with norm changing and the crop support that was
added in 2.6.21.  The driver defaults to PAL, and keeps the last norm it was
set too across opens.  If one changes the norm via V4L1, the cropping
parameters are not reset like they should be, and they'll remain broken across
device opens.

This patch removes the direct setting of btv->tvnorm in the V4L1 ioctl
VIDIOCSCHAN handler.  The norm is set via the existing call to set_input(),
which calls set_tvnorm(), which will reset the cropping values now that it is
able to detect the norm change.

Signed-off-by: Trent Piepho <xyzzy@speakeasy.org>
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
  • Loading branch information
Trent Piepho authored and Mauro Carvalho Chehab committed Jul 3, 2007
1 parent 872aad4 commit 333408f
Showing 1 changed file with 6 additions and 7 deletions.
13 changes: 6 additions & 7 deletions drivers/media/video/bt8xx/bttv-driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -1331,7 +1331,7 @@ set_tvnorm(struct bttv *btv, unsigned int norm)

/* Call with btv->lock down. */
static void
set_input(struct bttv *btv, unsigned int input)
set_input(struct bttv *btv, unsigned int input, unsigned int norm)
{
unsigned long flags;

Expand All @@ -1350,7 +1350,7 @@ set_input(struct bttv *btv, unsigned int input)
}
audio_input(btv,(input == bttv_tvcards[btv->c.type].tuner ?
TVAUDIO_INPUT_TUNER : TVAUDIO_INPUT_EXTERN));
set_tvnorm(btv,btv->tvnorm);
set_tvnorm(btv, norm);
i2c_vidiocschan(btv);
}

Expand Down Expand Up @@ -1441,7 +1441,7 @@ static void bttv_reinit_bt848(struct bttv *btv)

init_bt848(btv);
btv->pll.pll_current = -1;
set_input(btv,btv->input);
set_input(btv, btv->input, btv->tvnorm);
}

static int get_control(struct bttv *btv, struct v4l2_control *c)
Expand Down Expand Up @@ -2011,8 +2011,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
return 0;
}

btv->tvnorm = v->norm;
set_input(btv,v->channel);
set_input(btv, v->channel, v->norm);
mutex_unlock(&btv->lock);
return 0;
}
Expand Down Expand Up @@ -2148,7 +2147,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
if (*i > bttv_tvcards[btv->c.type].video_inputs)
return -EINVAL;
mutex_lock(&btv->lock);
set_input(btv,*i);
set_input(btv, *i, btv->tvnorm);
mutex_unlock(&btv->lock);
return 0;
}
Expand Down Expand Up @@ -4780,7 +4779,7 @@ static int __devinit bttv_probe(struct pci_dev *dev,
bt848_hue(btv,32768);
bt848_sat(btv,32768);
audio_mute(btv, 1);
set_input(btv,0);
set_input(btv, 0, btv->tvnorm);
bttv_crop_reset(&btv->crop[0], btv->tvnorm);
btv->crop[1] = btv->crop[0]; /* current = default */
disclaim_vbi_lines(btv);
Expand Down

0 comments on commit 333408f

Please sign in to comment.