diff options
author | Hans Verkuil <hverkuil@xs4all.nl> | 2010-02-20 05:56:25 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-02-26 13:11:05 -0500 |
commit | cd7d9beb09d89d62bc3c6336e4cb9a2ee3da6163 (patch) | |
tree | 94ed5180b0cfac0f1f256bbb5ed9e0fb2643d93f /drivers/media/video/hexium_gemini.c | |
parent | 8d55662512127c84ac90873fb68ba44842e2c426 (diff) |
V4L/DVB: saa7146_vv: fix regression where v4l2_device was registered too late
v4l2_device_register needs to be called before the i2c subdevs are loaded.
However, it was called afterwards in the saa7146 driver. This caused an oops
when loading the mxb and hexium drivers. The vv_init function is now split
into two: one registers the v4l2_device, the other does the rest of the
initialization. The three drivers that depend on this have been updated to
call the new vv_devinit function.
Thanks to Michael Hunold for reporting this.
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/hexium_gemini.c')
-rw-r--r-- | drivers/media/video/hexium_gemini.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/media/video/hexium_gemini.c b/drivers/media/video/hexium_gemini.c index 60d992ee2589..e620a3a92f25 100644 --- a/drivers/media/video/hexium_gemini.c +++ b/drivers/media/video/hexium_gemini.c | |||
@@ -352,9 +352,13 @@ static struct saa7146_ext_vv vv_data; | |||
352 | static int hexium_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_data *info) | 352 | static int hexium_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_data *info) |
353 | { | 353 | { |
354 | struct hexium *hexium = (struct hexium *) dev->ext_priv; | 354 | struct hexium *hexium = (struct hexium *) dev->ext_priv; |
355 | int ret; | ||
355 | 356 | ||
356 | DEB_EE((".\n")); | 357 | DEB_EE((".\n")); |
357 | 358 | ||
359 | ret = saa7146_vv_devinit(dev); | ||
360 | if (ret) | ||
361 | return ret; | ||
358 | hexium = kzalloc(sizeof(struct hexium), GFP_KERNEL); | 362 | hexium = kzalloc(sizeof(struct hexium), GFP_KERNEL); |
359 | if (NULL == hexium) { | 363 | if (NULL == hexium) { |
360 | printk("hexium_gemini: not enough kernel memory in hexium_attach().\n"); | 364 | printk("hexium_gemini: not enough kernel memory in hexium_attach().\n"); |
@@ -400,9 +404,10 @@ static int hexium_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_d | |||
400 | vv_data.ops.vidioc_enum_input = vidioc_enum_input; | 404 | vv_data.ops.vidioc_enum_input = vidioc_enum_input; |
401 | vv_data.ops.vidioc_g_input = vidioc_g_input; | 405 | vv_data.ops.vidioc_g_input = vidioc_g_input; |
402 | vv_data.ops.vidioc_s_input = vidioc_s_input; | 406 | vv_data.ops.vidioc_s_input = vidioc_s_input; |
403 | if (0 != saa7146_register_device(&hexium->video_dev, dev, "hexium gemini", VFL_TYPE_GRABBER)) { | 407 | ret = saa7146_register_device(&hexium->video_dev, dev, "hexium gemini", VFL_TYPE_GRABBER); |
408 | if (ret < 0) { | ||
404 | printk("hexium_gemini: cannot register capture v4l2 device. skipping.\n"); | 409 | printk("hexium_gemini: cannot register capture v4l2 device. skipping.\n"); |
405 | return -1; | 410 | return ret; |
406 | } | 411 | } |
407 | 412 | ||
408 | printk("hexium_gemini: found 'hexium gemini' frame grabber-%d.\n", hexium_num); | 413 | printk("hexium_gemini: found 'hexium gemini' frame grabber-%d.\n", hexium_num); |