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:
committed by
Mauro Carvalho Chehab
parent
064a2485aa
commit
5f39b9f660
@@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user