| From stable-bounces@linux.kernel.org Sat Mar 3 06:37:14 2007 |
| From: Michael Krufky <mkrufky@linuxtv.org> |
| Date: Sat, 03 Mar 2007 09:35:54 -0500 |
| Subject: V4L: pvrusb2: Fix video corruption on stream start |
| To: stable@kernel.org |
| Cc: v4l-dvb maintainer list <v4l-dvb-maintainer@linuxtv.org>, Linux Kernel Mailing List <linux-kernel@vger.kernel.org> |
| Message-ID: <45E987CA.90407@linuxtv.org> |
| |
| From: Mike Isely <isely@pobox.com> |
| |
| This introduces some extra cx23416 commands when streaming is |
| started. The addition of these commands fix random sporadic video |
| corruption that can take place when the video stream is temporarily |
| disrupted through loss of signal (e.g. changing the channel in the RF |
| tuner). |
| |
| This fix is already in the upstream driver source and has proven |
| itself there; this is a backport for the 2.6.20.y kernel series. |
| |
| (backported from commit 6fe7d2c4660174110c6872cacc4fc2acb6e00acf) |
| |
| Signed-off-by: Mike Isely <isely@pobox.com> |
| Signed-off-by: Michael Krufky <mkrufky@linuxtv.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/media/video/pvrusb2/pvrusb2-encoder.c | 40 ++++++++++++++++++++++++++ |
| 1 file changed, 40 insertions(+) |
| |
| --- linux-2.6.20.1.orig/drivers/media/video/pvrusb2/pvrusb2-encoder.c |
| +++ linux-2.6.20.1/drivers/media/video/pvrusb2/pvrusb2-encoder.c |
| @@ -288,6 +288,44 @@ static int pvr2_encoder_vcmd(struct pvr2 |
| return pvr2_encoder_cmd(hdw,cmd,args,0,data); |
| } |
| |
| + |
| +/* This implements some extra setup for the encoder that seems to be |
| + specific to the PVR USB2 hardware. */ |
| +int pvr2_encoder_prep_config(struct pvr2_hdw *hdw) |
| +{ |
| + int ret = 0; |
| + int encMisc3Arg = 0; |
| + |
| + /* Mike Isely <isely@pobox.com> 22-Feb-2007 The windows driver |
| + sends the following list of ENC_MISC commands (for both |
| + 24xxx and 29xxx devices). Meanings are not entirely clear, |
| + however without the ENC_MISC(3,encMisc3Arg) command then we risk |
| + random perpetual video corruption whenever the video input |
| + breaks up for a moment (like when switching channels). */ |
| + |
| + |
| + /* This ENC_MISC(3,encMisc3Arg) command is critical - without |
| + it there will eventually be video corruption. Also, the |
| + 29xxx case is strange - the Windows driver is passing 1 |
| + regardless of device type but if we have 1 for 29xxx device |
| + the video turns sluggish. */ |
| + switch (hdw->hdw_type) { |
| + case PVR2_HDW_TYPE_24XXX: encMisc3Arg = 1; break; |
| + case PVR2_HDW_TYPE_29XXX: encMisc3Arg = 0; break; |
| + default: break; |
| + } |
| + ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 3, |
| + encMisc3Arg,0,0); |
| + |
| + ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 8,0,0,0); |
| + |
| + ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 0,3,0,0); |
| + ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4,15,0,0,0); |
| + |
| + return ret; |
| +} |
| + |
| + |
| int pvr2_encoder_configure(struct pvr2_hdw *hdw) |
| { |
| int ret; |
| @@ -302,6 +340,8 @@ int pvr2_encoder_configure(struct pvr2_h |
| |
| ret = 0; |
| |
| + ret |= pvr2_encoder_prep_config(hdw); |
| + |
| if (!ret) ret = pvr2_encoder_vcmd( |
| hdw,CX2341X_ENC_SET_NUM_VSYNC_LINES, 2, |
| 0xf0, 0xf0); |