Browse Source

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>
Ian Armstrong 15 years ago
parent
commit
5f39b9f660
1 changed files with 11 additions and 3 deletions
  1. 11 3
      drivers/media/video/ivtv/ivtvfb.c

+ 11 - 3
drivers/media/video/ivtv/ivtvfb.c

@@ -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;
 	}
 	}