| From cd8f894eacf13996d920fdd2aef1afc55156b191 Mon Sep 17 00:00:00 2001 |
| From: Andy Walls <awalls@radix.net> |
| Date: Fri, 9 Jan 2009 22:59:27 -0300 |
| Subject: V4L/DVB (10218): cx23885: Fix Oops for mixed install of analog and digital only cards |
| |
| From: Andy Walls <awalls@radix.net> |
| |
| commit cd8f894eacf13996d920fdd2aef1afc55156b191 upstream. |
| |
| Analog support for HVR-1250 has not been completed, but does exist for |
| the HVR-1800. |
| |
| Since both cards use the same driver, it tries to create the analog |
| dev for both devices, which is not possible. |
| |
| This causes a NULL error to show up in video_open and mpeg_open. |
| |
| -Mark |
| |
| Iterations through the cx23885_devlist must check for NULL |
| pointers as some supported devices only have DVB support at the moment. |
| Mark Jenks encoutered an Oops in a system with both an HVR-1250 and HVR-1800 |
| installed. |
| |
| -Andy |
| |
| Reported-by: Mark Jenks <mjenks1968@gmail.com> |
| Tested-by: Mark Jenks <mjenks1968@gmail.com> |
| Signed-off-by: Mark Jenks <mjenks1968@gmail.com> |
| Signed-off-by: Andy Walls <awalls@radix.net> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> |
| Signed-off-by: Jarod Wilson <jarod@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/media/video/cx23885/cx23885-417.c | 3 ++- |
| drivers/media/video/cx23885/cx23885-video.c | 5 +++-- |
| 2 files changed, 5 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/media/video/cx23885/cx23885-417.c |
| +++ b/drivers/media/video/cx23885/cx23885-417.c |
| @@ -1585,7 +1585,8 @@ static int mpeg_open(struct inode *inode |
| lock_kernel(); |
| list_for_each(list, &cx23885_devlist) { |
| h = list_entry(list, struct cx23885_dev, devlist); |
| - if (h->v4l_device->minor == minor) { |
| + if (h->v4l_device && |
| + h->v4l_device->minor == minor) { |
| dev = h; |
| break; |
| } |
| --- a/drivers/media/video/cx23885/cx23885-video.c |
| +++ b/drivers/media/video/cx23885/cx23885-video.c |
| @@ -730,12 +730,13 @@ static int video_open(struct inode *inod |
| lock_kernel(); |
| list_for_each(list, &cx23885_devlist) { |
| h = list_entry(list, struct cx23885_dev, devlist); |
| - if (h->video_dev->minor == minor) { |
| + if (h->video_dev && |
| + h->video_dev->minor == minor) { |
| dev = h; |
| type = V4L2_BUF_TYPE_VIDEO_CAPTURE; |
| } |
| if (h->vbi_dev && |
| - h->vbi_dev->minor == minor) { |
| + h->vbi_dev->minor == minor) { |
| dev = h; |
| type = V4L2_BUF_TYPE_VBI_CAPTURE; |
| } |