V4L/DVB: ivtvfb : Module load / unload fixes

Check firmware state when loading module & if firmware is not responding exit
with an error. When module is unloaded, only disable the framebuffer & not all
decoder output.

Signed-off-by: Ian Armstrong <ian@iarmst.demon.co.uk>
Signed-off-by: Andy Walls <awalls@md.metrocast.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Ian Armstrong
2010-05-23 22:10:30 -03:00
committed by Mauro Carvalho Chehab
parent 064a2485aa
commit 5f39b9f660

View File

@@ -1066,7 +1066,11 @@ static int ivtvfb_init_io(struct ivtv *itv)
} }
mutex_unlock(&itv->serialize_lock); mutex_unlock(&itv->serialize_lock);
ivtvfb_get_framebuffer(itv, &oi->video_rbase, &oi->video_buffer_size); if (ivtvfb_get_framebuffer(itv, &oi->video_rbase,
&oi->video_buffer_size) < 0) {
IVTVFB_ERR("Firmware failed to respond\n");
return -EIO;
}
/* The osd buffer size depends on the number of video buffers allocated /* The osd buffer size depends on the number of video buffers allocated
on the PVR350 itself. For now we'll hardcode the smallest osd buffer on the PVR350 itself. For now we'll hardcode the smallest osd buffer
@@ -1158,8 +1162,11 @@ static int ivtvfb_init_card(struct ivtv *itv)
} }
/* Find & setup the OSD buffer */ /* Find & setup the OSD buffer */
if ((rc = ivtvfb_init_io(itv))) rc = ivtvfb_init_io(itv);
if (rc) {
ivtvfb_release_buffers(itv);
return rc; return rc;
}
/* Set the startup video mode information */ /* Set the startup video mode information */
if ((rc = ivtvfb_init_vidmode(itv))) { if ((rc = ivtvfb_init_vidmode(itv))) {
@@ -1210,6 +1217,7 @@ static int ivtvfb_callback_cleanup(struct device *dev, void *p)
{ {
struct v4l2_device *v4l2_dev = dev_get_drvdata(dev); struct v4l2_device *v4l2_dev = dev_get_drvdata(dev);
struct ivtv *itv = container_of(v4l2_dev, struct ivtv, v4l2_dev); struct ivtv *itv = container_of(v4l2_dev, struct ivtv, v4l2_dev);
struct osd_info *oi = itv->osd_info;
if (itv && (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) { if (itv && (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
if (unregister_framebuffer(&itv->osd_info->ivtvfb_info)) { if (unregister_framebuffer(&itv->osd_info->ivtvfb_info)) {
@@ -1218,7 +1226,7 @@ static int ivtvfb_callback_cleanup(struct device *dev, void *p)
return 0; return 0;
} }
IVTVFB_INFO("Unregister framebuffer %d\n", itv->instance); IVTVFB_INFO("Unregister framebuffer %d\n", itv->instance);
ivtvfb_blank(FB_BLANK_POWERDOWN, &itv->osd_info->ivtvfb_info); ivtvfb_blank(FB_BLANK_VSYNC_SUSPEND, &oi->ivtvfb_info);
ivtvfb_release_buffers(itv); ivtvfb_release_buffers(itv);
itv->osd_video_pbase = 0; itv->osd_video_pbase = 0;
} }