Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2444a2fc authored by Jeff Garzik's avatar Jeff Garzik Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (4741): {ov511,stv680}: handle sysfs errors

parent 474ce781
Loading
Loading
Loading
Loading
+47 −11
Original line number Diff line number Diff line
@@ -5648,17 +5648,49 @@ static ssize_t show_exposure(struct class_device *cd, char *buf)
}
static CLASS_DEVICE_ATTR(exposure, S_IRUGO, show_exposure, NULL);

static void ov_create_sysfs(struct video_device *vdev)
static int ov_create_sysfs(struct video_device *vdev)
{
	video_device_create_file(vdev, &class_device_attr_custom_id);
	video_device_create_file(vdev, &class_device_attr_model);
	video_device_create_file(vdev, &class_device_attr_bridge);
	video_device_create_file(vdev, &class_device_attr_sensor);
	video_device_create_file(vdev, &class_device_attr_brightness);
	video_device_create_file(vdev, &class_device_attr_saturation);
	video_device_create_file(vdev, &class_device_attr_contrast);
	video_device_create_file(vdev, &class_device_attr_hue);
	video_device_create_file(vdev, &class_device_attr_exposure);
	int rc;

	rc = video_device_create_file(vdev, &class_device_attr_custom_id);
	if (rc) goto err;
	rc = video_device_create_file(vdev, &class_device_attr_model);
	if (rc) goto err_id;
	rc = video_device_create_file(vdev, &class_device_attr_bridge);
	if (rc) goto err_model;
	rc = video_device_create_file(vdev, &class_device_attr_sensor);
	if (rc) goto err_bridge;
	rc = video_device_create_file(vdev, &class_device_attr_brightness);
	if (rc) goto err_sensor;
	rc = video_device_create_file(vdev, &class_device_attr_saturation);
	if (rc) goto err_bright;
	rc = video_device_create_file(vdev, &class_device_attr_contrast);
	if (rc) goto err_sat;
	rc = video_device_create_file(vdev, &class_device_attr_hue);
	if (rc) goto err_contrast;
	rc = video_device_create_file(vdev, &class_device_attr_exposure);
	if (rc) goto err_hue;

	return 0;

err_hue:
	video_device_remove_file(vdev, &class_device_attr_hue);
err_contrast:
	video_device_remove_file(vdev, &class_device_attr_contrast);
err_sat:
	video_device_remove_file(vdev, &class_device_attr_saturation);
err_bright:
	video_device_remove_file(vdev, &class_device_attr_brightness);
err_sensor:
	video_device_remove_file(vdev, &class_device_attr_sensor);
err_bridge:
	video_device_remove_file(vdev, &class_device_attr_bridge);
err_model:
	video_device_remove_file(vdev, &class_device_attr_model);
err_id:
	video_device_remove_file(vdev, &class_device_attr_custom_id);
err:
	return rc;
}

/****************************************************************************
@@ -5817,7 +5849,11 @@ ov51x_probe(struct usb_interface *intf, const struct usb_device_id *id)
	     ov->vdev->minor);

	usb_set_intfdata(intf, ov);
	ov_create_sysfs(ov->vdev);
	if (ov_create_sysfs(ov->vdev)) {
		err("ov_create_sysfs failed");
		goto error;
	}

	return 0;

error:
+43 −10
Original line number Diff line number Diff line
@@ -516,16 +516,45 @@ stv680_file(frames_read, framecount, "%d\n");
stv680_file(packets_dropped, dropped, "%d\n");
stv680_file(decoding_errors, error, "%d\n");

static void stv680_create_sysfs_files(struct video_device *vdev)
static int stv680_create_sysfs_files(struct video_device *vdev)
{
	video_device_create_file(vdev, &class_device_attr_model);
	video_device_create_file(vdev, &class_device_attr_in_use);
	video_device_create_file(vdev, &class_device_attr_streaming);
	video_device_create_file(vdev, &class_device_attr_palette);
	video_device_create_file(vdev, &class_device_attr_frames_total);
	video_device_create_file(vdev, &class_device_attr_frames_read);
	video_device_create_file(vdev, &class_device_attr_packets_dropped);
	video_device_create_file(vdev, &class_device_attr_decoding_errors);
	int rc;

	rc = video_device_create_file(vdev, &class_device_attr_model);
	if (rc) goto err;
	rc = video_device_create_file(vdev, &class_device_attr_in_use);
	if (rc) goto err_model;
	rc = video_device_create_file(vdev, &class_device_attr_streaming);
	if (rc) goto err_inuse;
	rc = video_device_create_file(vdev, &class_device_attr_palette);
	if (rc) goto err_stream;
	rc = video_device_create_file(vdev, &class_device_attr_frames_total);
	if (rc) goto err_pal;
	rc = video_device_create_file(vdev, &class_device_attr_frames_read);
	if (rc) goto err_framtot;
	rc = video_device_create_file(vdev, &class_device_attr_packets_dropped);
	if (rc) goto err_framread;
	rc = video_device_create_file(vdev, &class_device_attr_decoding_errors);
	if (rc) goto err_dropped;

	return 0;

err_dropped:
	video_device_remove_file(vdev, &class_device_attr_packets_dropped);
err_framread:
	video_device_remove_file(vdev, &class_device_attr_frames_read);
err_framtot:
	video_device_remove_file(vdev, &class_device_attr_frames_total);
err_pal:
	video_device_remove_file(vdev, &class_device_attr_palette);
err_stream:
	video_device_remove_file(vdev, &class_device_attr_streaming);
err_inuse:
	video_device_remove_file(vdev, &class_device_attr_in_use);
err_model:
	video_device_remove_file(vdev, &class_device_attr_model);
err:
	return rc;
}

static void stv680_remove_sysfs_files(struct video_device *vdev)
@@ -1418,9 +1447,13 @@ static int stv680_probe (struct usb_interface *intf, const struct usb_device_id
	PDEBUG (0, "STV(i): registered new video device: video%d", stv680->vdev->minor);

	usb_set_intfdata (intf, stv680);
	stv680_create_sysfs_files(stv680->vdev);
	retval = stv680_create_sysfs_files(stv680->vdev);
	if (retval)
		goto error_unreg;
	return 0;

error_unreg:
	video_unregister_device(stv680->vdev);
error_vdev:
	video_device_release(stv680->vdev);
error: