linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 00/10] Support getting default values from any control
@ 2015-08-21 13:19 Ricardo Ribalda Delgado
  2015-08-21 13:19 ` [PATCH v2 01/10] videodev2.h: Fix typo in comment Ricardo Ribalda Delgado
                   ` (10 more replies)
  0 siblings, 11 replies; 17+ messages in thread
From: Ricardo Ribalda Delgado @ 2015-08-21 13:19 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Mike Isely, Laurent Pinchart,
	Hans Verkuil, Steven Toth, Sakari Ailus, Vincent Palatin,
	linux-media, linux-kernel
  Cc: Ricardo Ribalda Delgado

Integer controls provide a way to get their default/initial value, but
any other control (p_u32, p_u8.....) provide no other way to get the
initial value than unloading the module and loading it back.

*What is the actual problem?
I have a custom control with WIDTH integer values. Every value
represents the calibrated FPN (fixed pattern noise) correction value for that
column
-Application A changes the FPN correction value
-Application B wants to restore the calibrated value but it cant :(

*What is the proposed solution?

(Kudos to Hans Verkuil!!!)

The key change is in struct v4l2_ext_controls where the __u32 ctrl_class field
is changed to:

        union {
                __u32 ctrl_class;
                __u32 which;
        };

And two new defines are added:

#define V4L2_CTRL_WHICH_CUR_VAL        0
#define V4L2_CTRL_WHICH_DEF_VAL        0x0f000000

The 'which' field tells you which controls are get/set/tried.

V4L2_CTRL_WHICH_CUR_VAL: the current value of the controls
V4L2_CTRL_WHICH_DEF_VAL: the default value of the controls
V4L2_CTRL_CLASS_*: the current value of the controls belonging to the specified class.
        Note: this is deprecated usage and is only there for backwards compatibility.
        Which is also why I don't think there is a need to add V4L2_CTRL_WHICH_
        aliases for these defines.


I have posted a copy of my working tree to

https://github.com/ribalda/linux/tree/which_def_v2

Changelog v2:

Suggested by Hans Verkuil <hverkuil@xs4all.nl>

Replace ctrls_class with which on all the codebase
Changes in Documentation
(Thanks!)

Ricardo Ribalda Delgado (10):
  videodev2.h: Fix typo in comment
  videodev2.h: Extend struct v4l2_ext_controls
  media/v4l2-compat-ioctl32: Simple stylechecks
  media/core: Replace ctrl_class with which
  media/v4l2-core: struct struct v4l2_ext_controls param which
  usb/uvc: Support for V4L2_CTRL_WHICH_DEF_VAL
  media/usb/pvrusb2: Support for V4L2_CTRL_WHICH_DEF_VAL
  media/pci/saa7164-encoder Support for V4L2_CTRL_WHICH_DEF_VAL
  media/pci/saa7164-vbi Support for V4L2_CTRL_WHICH_DEF_VAL
  Docbook: media: Document changes on struct v4l2_ext_controls

 Documentation/DocBook/media/v4l/v4l2.xml           |  9 ++++
 .../DocBook/media/v4l/vidioc-g-ext-ctrls.xml       | 28 ++++++++--
 drivers/media/pci/saa7164/saa7164-encoder.c        | 59 ++++++++++++---------
 drivers/media/pci/saa7164/saa7164-vbi.c            | 61 +++++++++++++---------
 drivers/media/platform/s5p-mfc/s5p_mfc_dec.c       |  2 +-
 drivers/media/platform/s5p-mfc/s5p_mfc_enc.c       |  2 +-
 drivers/media/usb/pvrusb2/pvrusb2-v4l2.c           | 17 +++++-
 drivers/media/usb/uvc/uvc_v4l2.c                   | 14 ++++-
 drivers/media/v4l2-core/v4l2-compat-ioctl32.c      | 17 +++---
 drivers/media/v4l2-core/v4l2-ctrls.c               | 54 +++++++++++++------
 drivers/media/v4l2-core/v4l2-ioctl.c               | 14 ++---
 include/uapi/linux/videodev2.h                     | 14 ++++-
 12 files changed, 200 insertions(+), 91 deletions(-)

-- 
2.5.0


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v2 01/10] videodev2.h: Fix typo in comment
  2015-08-21 13:19 [PATCH v2 00/10] Support getting default values from any control Ricardo Ribalda Delgado
@ 2015-08-21 13:19 ` Ricardo Ribalda Delgado
  2015-08-21 13:19 ` [PATCH v2 02/10] videodev2.h: Extend struct v4l2_ext_controls Ricardo Ribalda Delgado
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 17+ messages in thread
From: Ricardo Ribalda Delgado @ 2015-08-21 13:19 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Mike Isely, Laurent Pinchart,
	Hans Verkuil, Steven Toth, Sakari Ailus, Vincent Palatin,
	linux-media, linux-kernel
  Cc: Ricardo Ribalda Delgado

Referenced file has moved

Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
---
 include/uapi/linux/videodev2.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
index 3228fbebcd63..72fa3e490e30 100644
--- a/include/uapi/linux/videodev2.h
+++ b/include/uapi/linux/videodev2.h
@@ -2271,7 +2271,7 @@ struct v4l2_create_buffers {
 #define VIDIOC_QUERY_EXT_CTRL	_IOWR('V', 103, struct v4l2_query_ext_ctrl)
 
 /* Reminder: when adding new ioctls please add support for them to
-   drivers/media/video/v4l2-compat-ioctl32.c as well! */
+   drivers/media/v4l2-core/v4l2-compat-ioctl32.c as well! */
 
 #define BASE_VIDIOC_PRIVATE	192		/* 192-255 are private */
 
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 02/10] videodev2.h: Extend struct v4l2_ext_controls
  2015-08-21 13:19 [PATCH v2 00/10] Support getting default values from any control Ricardo Ribalda Delgado
  2015-08-21 13:19 ` [PATCH v2 01/10] videodev2.h: Fix typo in comment Ricardo Ribalda Delgado
@ 2015-08-21 13:19 ` Ricardo Ribalda Delgado
  2015-08-21 13:19 ` [PATCH v2 03/10] media/v4l2-compat-ioctl32: Simple stylechecks Ricardo Ribalda Delgado
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 17+ messages in thread
From: Ricardo Ribalda Delgado @ 2015-08-21 13:19 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Mike Isely, Laurent Pinchart,
	Hans Verkuil, Steven Toth, Sakari Ailus, Vincent Palatin,
	linux-media, linux-kernel
  Cc: Ricardo Ribalda Delgado

So it can be used to get the default value of a control.

Without this change it is not possible to get  get the
default value of array controls.

Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
---
 include/uapi/linux/videodev2.h | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
index 72fa3e490e30..2e857b19a155 100644
--- a/include/uapi/linux/videodev2.h
+++ b/include/uapi/linux/videodev2.h
@@ -1461,7 +1461,10 @@ struct v4l2_ext_control {
 } __attribute__ ((packed));
 
 struct v4l2_ext_controls {
-	__u32 ctrl_class;
+	union {
+		__u32 ctrl_class;
+		__u32 which;
+	};
 	__u32 count;
 	__u32 error_idx;
 	__u32 reserved[2];
@@ -1472,6 +1475,8 @@ struct v4l2_ext_controls {
 #define V4L2_CTRL_ID2CLASS(id)    ((id) & 0x0fff0000UL)
 #define V4L2_CTRL_DRIVER_PRIV(id) (((id) & 0xffff) >= 0x1000)
 #define V4L2_CTRL_MAX_DIMS	  (4)
+#define V4L2_CTRL_WHICH_CUR_VAL   0
+#define V4L2_CTRL_WHICH_DEF_VAL   0x0f000000
 
 enum v4l2_ctrl_type {
 	V4L2_CTRL_TYPE_INTEGER	     = 1,
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 03/10] media/v4l2-compat-ioctl32: Simple stylechecks
  2015-08-21 13:19 [PATCH v2 00/10] Support getting default values from any control Ricardo Ribalda Delgado
  2015-08-21 13:19 ` [PATCH v2 01/10] videodev2.h: Fix typo in comment Ricardo Ribalda Delgado
  2015-08-21 13:19 ` [PATCH v2 02/10] videodev2.h: Extend struct v4l2_ext_controls Ricardo Ribalda Delgado
@ 2015-08-21 13:19 ` Ricardo Ribalda Delgado
  2015-08-21 13:19 ` [PATCH v2 04/10] media/core: Replace ctrl_class with which Ricardo Ribalda Delgado
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 17+ messages in thread
From: Ricardo Ribalda Delgado @ 2015-08-21 13:19 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Mike Isely, Laurent Pinchart,
	Hans Verkuil, Steven Toth, Sakari Ailus, Vincent Palatin,
	linux-media, linux-kernel
  Cc: Ricardo Ribalda Delgado

The next patches on the serie need this modifications to pass clean
checkpath.pl.

Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
---
 drivers/media/v4l2-core/v4l2-compat-ioctl32.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
index af635430524e..5416806609a8 100644
--- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
+++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
@@ -609,11 +609,11 @@ static inline int put_v4l2_input32(struct v4l2_input *kp, struct v4l2_input32 __
 }
 
 struct v4l2_ext_controls32 {
-       __u32 ctrl_class;
-       __u32 count;
-       __u32 error_idx;
-       __u32 reserved[2];
-       compat_caddr_t controls; /* actually struct v4l2_ext_control32 * */
+	__u32 ctrl_class;
+	__u32 count;
+	__u32 error_idx;
+	__u32 reserved[2];
+	compat_caddr_t controls; /* actually struct v4l2_ext_control32 * */
 };
 
 struct v4l2_ext_control32 {
@@ -655,7 +655,8 @@ static int get_v4l2_ext_controls32(struct v4l2_ext_controls *kp, struct v4l2_ext
 		get_user(kp->ctrl_class, &up->ctrl_class) ||
 		get_user(kp->count, &up->count) ||
 		get_user(kp->error_idx, &up->error_idx) ||
-		copy_from_user(kp->reserved, up->reserved, sizeof(kp->reserved)))
+		copy_from_user(kp->reserved, up->reserved,
+			       sizeof(kp->reserved)))
 			return -EFAULT;
 	n = kp->count;
 	if (n == 0) {
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 04/10] media/core: Replace ctrl_class with which
  2015-08-21 13:19 [PATCH v2 00/10] Support getting default values from any control Ricardo Ribalda Delgado
                   ` (2 preceding siblings ...)
  2015-08-21 13:19 ` [PATCH v2 03/10] media/v4l2-compat-ioctl32: Simple stylechecks Ricardo Ribalda Delgado
@ 2015-08-21 13:19 ` Ricardo Ribalda Delgado
  2015-08-21 13:19 ` [PATCH v2 05/10] media/v4l2-core: struct struct v4l2_ext_controls param which Ricardo Ribalda Delgado
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 17+ messages in thread
From: Ricardo Ribalda Delgado @ 2015-08-21 13:19 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Mike Isely, Laurent Pinchart,
	Hans Verkuil, Steven Toth, Sakari Ailus, Vincent Palatin,
	linux-media, linux-kernel
  Cc: Ricardo Ribalda Delgado

Replace the obsolete field ctrl_class with "which".

Make sure it not used in future modules by commenting out the field with
ifndef __KERNEL_ .

The field cannot be simply removed because that would be change on the
kenel API to the userspace (and we don't like that).

Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
---
 .../DocBook/media/v4l/vidioc-g-ext-ctrls.xml       |  6 +++---
 drivers/media/pci/saa7164/saa7164-encoder.c        |  6 +++---
 drivers/media/pci/saa7164/saa7164-vbi.c            |  6 +++---
 drivers/media/platform/s5p-mfc/s5p_mfc_dec.c       |  2 +-
 drivers/media/platform/s5p-mfc/s5p_mfc_enc.c       |  2 +-
 drivers/media/v4l2-core/v4l2-compat-ioctl32.c      |  6 +++---
 drivers/media/v4l2-core/v4l2-ctrls.c               | 24 +++++++++++-----------
 drivers/media/v4l2-core/v4l2-ioctl.c               | 14 ++++++-------
 include/uapi/linux/videodev2.h                     |  5 +++++
 9 files changed, 38 insertions(+), 33 deletions(-)

diff --git a/Documentation/DocBook/media/v4l/vidioc-g-ext-ctrls.xml b/Documentation/DocBook/media/v4l/vidioc-g-ext-ctrls.xml
index c5bdbfcc42b3..8f4eb395665d 100644
--- a/Documentation/DocBook/media/v4l/vidioc-g-ext-ctrls.xml
+++ b/Documentation/DocBook/media/v4l/vidioc-g-ext-ctrls.xml
@@ -61,7 +61,7 @@ must belong to the same control class.</para>
 
     <para>Applications must always fill in the
 <structfield>count</structfield>,
-<structfield>ctrl_class</structfield>,
+<structfield>which</structfield>,
 <structfield>controls</structfield> and
 <structfield>reserved</structfield> fields of &v4l2-ext-controls;, and
 initialize the &v4l2-ext-control; array pointed to by the
@@ -109,7 +109,7 @@ the driver whether wrong values are automatically adjusted to a valid
 value or if an error is returned.</para>
 
     <para>When the <structfield>id</structfield> or
-<structfield>ctrl_class</structfield> is invalid drivers return an
+<structfield>which</structfield> is invalid drivers return an
 &EINVAL;. When the value is out of bounds drivers can choose to take
 the closest valid value or return an &ERANGE;, whatever seems more
 appropriate. In the first case the new value is set in
@@ -383,7 +383,7 @@ These controls are described in <xref linkend="rf-tuner-controls" />.</entry>
 	<listitem>
 	  <para>The &v4l2-ext-control; <structfield>id</structfield>
 is invalid, the &v4l2-ext-controls;
-<structfield>ctrl_class</structfield> is invalid, or the &v4l2-ext-control;
+<structfield>which</structfield> is invalid, or the &v4l2-ext-control;
 <structfield>value</structfield> was inappropriate (e.g. the given menu
 index is not supported by the driver). This error code is
 also returned by the <constant>VIDIOC_S_EXT_CTRLS</constant> and
diff --git a/drivers/media/pci/saa7164/saa7164-encoder.c b/drivers/media/pci/saa7164/saa7164-encoder.c
index 4434e0f28c26..e0ec64ed06fc 100644
--- a/drivers/media/pci/saa7164/saa7164-encoder.c
+++ b/drivers/media/pci/saa7164/saa7164-encoder.c
@@ -538,7 +538,7 @@ static int vidioc_g_ext_ctrls(struct file *file, void *priv,
 	struct saa7164_port *port = fh->port;
 	int i, err = 0;
 
-	if (ctrls->ctrl_class == V4L2_CTRL_CLASS_MPEG) {
+	if (ctrls->which == V4L2_CTRL_CLASS_MPEG) {
 		for (i = 0; i < ctrls->count; i++) {
 			struct v4l2_ext_control *ctrl = ctrls->controls + i;
 
@@ -612,7 +612,7 @@ static int vidioc_try_ext_ctrls(struct file *file, void *priv,
 {
 	int i, err = 0;
 
-	if (ctrls->ctrl_class == V4L2_CTRL_CLASS_MPEG) {
+	if (ctrls->which == V4L2_CTRL_CLASS_MPEG) {
 		for (i = 0; i < ctrls->count; i++) {
 			struct v4l2_ext_control *ctrl = ctrls->controls + i;
 
@@ -687,7 +687,7 @@ static int vidioc_s_ext_ctrls(struct file *file, void *priv,
 	struct saa7164_port *port = fh->port;
 	int i, err = 0;
 
-	if (ctrls->ctrl_class == V4L2_CTRL_CLASS_MPEG) {
+	if (ctrls->which == V4L2_CTRL_CLASS_MPEG) {
 		for (i = 0; i < ctrls->count; i++) {
 			struct v4l2_ext_control *ctrl = ctrls->controls + i;
 
diff --git a/drivers/media/pci/saa7164/saa7164-vbi.c b/drivers/media/pci/saa7164/saa7164-vbi.c
index 859fd03d82f9..08f23b6d9cef 100644
--- a/drivers/media/pci/saa7164/saa7164-vbi.c
+++ b/drivers/media/pci/saa7164/saa7164-vbi.c
@@ -501,7 +501,7 @@ static int vidioc_g_ext_ctrls(struct file *file, void *priv,
 	struct saa7164_port *port = fh->port;
 	int i, err = 0;
 
-	if (ctrls->ctrl_class == V4L2_CTRL_CLASS_MPEG) {
+	if (ctrls->which == V4L2_CTRL_CLASS_MPEG) {
 		for (i = 0; i < ctrls->count; i++) {
 			struct v4l2_ext_control *ctrl = ctrls->controls + i;
 
@@ -560,7 +560,7 @@ static int vidioc_try_ext_ctrls(struct file *file, void *priv,
 {
 	int i, err = 0;
 
-	if (ctrls->ctrl_class == V4L2_CTRL_CLASS_MPEG) {
+	if (ctrls->which == V4L2_CTRL_CLASS_MPEG) {
 		for (i = 0; i < ctrls->count; i++) {
 			struct v4l2_ext_control *ctrl = ctrls->controls + i;
 
@@ -626,7 +626,7 @@ static int vidioc_s_ext_ctrls(struct file *file, void *priv,
 	struct saa7164_port *port = fh->port;
 	int i, err = 0;
 
-	if (ctrls->ctrl_class == V4L2_CTRL_CLASS_MPEG) {
+	if (ctrls->which == V4L2_CTRL_CLASS_MPEG) {
 		for (i = 0; i < ctrls->count; i++) {
 			struct v4l2_ext_control *ctrl = ctrls->controls + i;
 
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c b/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c
index aebe4fd7f03a..fa18f5035bc3 100644
--- a/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c
+++ b/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c
@@ -1113,7 +1113,7 @@ const struct v4l2_ioctl_ops *get_dec_v4l2_ioctl_ops(void)
 	return &s5p_mfc_dec_ioctl_ops;
 }
 
-#define IS_MFC51_PRIV(x) ((V4L2_CTRL_ID2CLASS(x) == V4L2_CTRL_CLASS_MPEG) \
+#define IS_MFC51_PRIV(x) ((V4L2_CTRL_ID2WHICH(x) == V4L2_CTRL_CLASS_MPEG) \
 						&& V4L2_CTRL_DRIVER_PRIV(x))
 
 int s5p_mfc_dec_ctrls_setup(struct s5p_mfc_ctx *ctx)
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c b/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c
index 2e57e9f45b85..c1e561bd2dd8 100644
--- a/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c
+++ b/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c
@@ -2060,7 +2060,7 @@ const struct v4l2_ioctl_ops *get_enc_v4l2_ioctl_ops(void)
 	return &s5p_mfc_enc_ioctl_ops;
 }
 
-#define IS_MFC51_PRIV(x) ((V4L2_CTRL_ID2CLASS(x) == V4L2_CTRL_CLASS_MPEG) \
+#define IS_MFC51_PRIV(x) ((V4L2_CTRL_ID2WHICH(x) == V4L2_CTRL_CLASS_MPEG) \
 						&& V4L2_CTRL_DRIVER_PRIV(x))
 
 int s5p_mfc_enc_ctrls_setup(struct s5p_mfc_ctx *ctx)
diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
index 5416806609a8..e3c1c214e893 100644
--- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
+++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
@@ -609,7 +609,7 @@ static inline int put_v4l2_input32(struct v4l2_input *kp, struct v4l2_input32 __
 }
 
 struct v4l2_ext_controls32 {
-	__u32 ctrl_class;
+	__u32 which;
 	__u32 count;
 	__u32 error_idx;
 	__u32 reserved[2];
@@ -652,7 +652,7 @@ static int get_v4l2_ext_controls32(struct v4l2_ext_controls *kp, struct v4l2_ext
 	compat_caddr_t p;
 
 	if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_ext_controls32)) ||
-		get_user(kp->ctrl_class, &up->ctrl_class) ||
+		get_user(kp->which, &up->which) ||
 		get_user(kp->count, &up->count) ||
 		get_user(kp->error_idx, &up->error_idx) ||
 		copy_from_user(kp->reserved, up->reserved,
@@ -702,7 +702,7 @@ static int put_v4l2_ext_controls32(struct v4l2_ext_controls *kp, struct v4l2_ext
 	compat_caddr_t p;
 
 	if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_ext_controls32)) ||
-		put_user(kp->ctrl_class, &up->ctrl_class) ||
+		put_user(kp->which, &up->which) ||
 		put_user(kp->count, &up->count) ||
 		put_user(kp->error_idx, &up->error_idx) ||
 		copy_to_user(up->reserved, kp->reserved, sizeof(up->reserved)))
diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
index b6b7dcc1b77d..580098ba5c0b 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
@@ -1760,7 +1760,7 @@ static struct v4l2_ctrl_ref *find_private_ref(
 	list_for_each_entry(ref, &hdl->ctrl_refs, node) {
 		/* Search for private user controls that are compatible with
 		   VIDIOC_G/S_CTRL. */
-		if (V4L2_CTRL_ID2CLASS(ref->ctrl->id) == V4L2_CTRL_CLASS_USER &&
+		if (V4L2_CTRL_ID2WHICH(ref->ctrl->id) == V4L2_CTRL_CLASS_USER &&
 		    V4L2_CTRL_DRIVER_PRIV(ref->ctrl->id)) {
 			if (!ref->ctrl->is_int)
 				continue;
@@ -1829,7 +1829,7 @@ static int handler_new_ref(struct v4l2_ctrl_handler *hdl,
 	struct v4l2_ctrl_ref *ref;
 	struct v4l2_ctrl_ref *new_ref;
 	u32 id = ctrl->id;
-	u32 class_ctrl = V4L2_CTRL_ID2CLASS(id) | 1;
+	u32 class_ctrl = V4L2_CTRL_ID2WHICH(id) | 1;
 	int bucket = id % hdl->nr_of_buckets;	/* which bucket to use */
 
 	/*
@@ -2251,9 +2251,9 @@ EXPORT_SYMBOL(v4l2_ctrl_add_handler);
 
 bool v4l2_ctrl_radio_filter(const struct v4l2_ctrl *ctrl)
 {
-	if (V4L2_CTRL_ID2CLASS(ctrl->id) == V4L2_CTRL_CLASS_FM_TX)
+	if (V4L2_CTRL_ID2WHICH(ctrl->id) == V4L2_CTRL_CLASS_FM_TX)
 		return true;
-	if (V4L2_CTRL_ID2CLASS(ctrl->id) == V4L2_CTRL_CLASS_FM_RX)
+	if (V4L2_CTRL_ID2WHICH(ctrl->id) == V4L2_CTRL_CLASS_FM_RX)
 		return true;
 	switch (ctrl->id) {
 	case V4L2_CID_AUDIO_MUTE:
@@ -2708,7 +2708,7 @@ static int prepare_ext_ctrls(struct v4l2_ctrl_handler *hdl,
 
 		cs->error_idx = i;
 
-		if (cs->ctrl_class && V4L2_CTRL_ID2CLASS(id) != cs->ctrl_class)
+		if (cs->which && V4L2_CTRL_ID2WHICH(id) != cs->which)
 			return -EINVAL;
 
 		/* Old-style private controls are not allowed for
@@ -2785,11 +2785,11 @@ static int prepare_ext_ctrls(struct v4l2_ctrl_handler *hdl,
 /* Handles the corner case where cs->count == 0. It checks whether the
    specified control class exists. If that class ID is 0, then it checks
    whether there are any controls at all. */
-static int class_check(struct v4l2_ctrl_handler *hdl, u32 ctrl_class)
+static int class_check(struct v4l2_ctrl_handler *hdl, u32 which)
 {
-	if (ctrl_class == 0)
+	if (!which)
 		return list_empty(&hdl->ctrl_refs) ? -EINVAL : 0;
-	return find_ref_lock(hdl, ctrl_class | 1) ? 0 : -EINVAL;
+	return find_ref_lock(hdl, which | 1) ? 0 : -EINVAL;
 }
 
 
@@ -2803,13 +2803,13 @@ int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct v4l2_ext_controls *cs
 	int i, j;
 
 	cs->error_idx = cs->count;
-	cs->ctrl_class = V4L2_CTRL_ID2CLASS(cs->ctrl_class);
+	cs->which = V4L2_CTRL_ID2WHICH(cs->which);
 
 	if (hdl == NULL)
 		return -EINVAL;
 
 	if (cs->count == 0)
-		return class_check(hdl, cs->ctrl_class);
+		return class_check(hdl, cs->which);
 
 	if (cs->count > ARRAY_SIZE(helper)) {
 		helpers = kmalloc_array(cs->count, sizeof(helper[0]),
@@ -3062,13 +3062,13 @@ static int try_set_ext_ctrls(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
 	int ret;
 
 	cs->error_idx = cs->count;
-	cs->ctrl_class = V4L2_CTRL_ID2CLASS(cs->ctrl_class);
+	cs->which = V4L2_CTRL_ID2WHICH(cs->which);
 
 	if (hdl == NULL)
 		return -EINVAL;
 
 	if (cs->count == 0)
-		return class_check(hdl, cs->ctrl_class);
+		return class_check(hdl, cs->which);
 
 	if (cs->count > ARRAY_SIZE(helper)) {
 		helpers = kmalloc_array(cs->count, sizeof(helper[0]),
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
index 4a384fc765b8..177f988ba7db 100644
--- a/drivers/media/v4l2-core/v4l2-ioctl.c
+++ b/drivers/media/v4l2-core/v4l2-ioctl.c
@@ -563,8 +563,8 @@ static void v4l_print_ext_controls(const void *arg, bool write_only)
 	const struct v4l2_ext_controls *p = arg;
 	int i;
 
-	pr_cont("class=0x%x, count=%d, error_idx=%d",
-			p->ctrl_class, p->count, p->error_idx);
+	pr_cont("which=0x%x, count=%d, error_idx=%d",
+			p->which, p->count, p->error_idx);
 	for (i = 0; i < p->count; i++) {
 		if (!p->controls[i].size)
 			pr_cont(", id/val=0x%x/0x%x",
@@ -900,13 +900,13 @@ static int check_ext_ctrls(struct v4l2_ext_controls *c, int allow_priv)
 	   Only when passed in through VIDIOC_G_CTRL and VIDIOC_S_CTRL
 	   is it allowed for backwards compatibility.
 	 */
-	if (!allow_priv && c->ctrl_class == V4L2_CID_PRIVATE_BASE)
+	if (!allow_priv && c->which == V4L2_CID_PRIVATE_BASE)
 		return 0;
-	if (c->ctrl_class == 0)
+	if (!c->which)
 		return 1;
 	/* Check that all controls are from the same control class. */
 	for (i = 0; i < c->count; i++) {
-		if (V4L2_CTRL_ID2CLASS(c->controls[i].id) != c->ctrl_class) {
+		if (V4L2_CTRL_ID2WHICH(c->controls[i].id) != c->which) {
 			c->error_idx = i;
 			return 0;
 		}
@@ -1928,7 +1928,7 @@ static int v4l_g_ctrl(const struct v4l2_ioctl_ops *ops,
 	if (ops->vidioc_g_ext_ctrls == NULL)
 		return -ENOTTY;
 
-	ctrls.ctrl_class = V4L2_CTRL_ID2CLASS(p->id);
+	ctrls.which = V4L2_CTRL_ID2WHICH(p->id);
 	ctrls.count = 1;
 	ctrls.controls = &ctrl;
 	ctrl.id = p->id;
@@ -1962,7 +1962,7 @@ static int v4l_s_ctrl(const struct v4l2_ioctl_ops *ops,
 	if (ops->vidioc_s_ext_ctrls == NULL)
 		return -ENOTTY;
 
-	ctrls.ctrl_class = V4L2_CTRL_ID2CLASS(p->id);
+	ctrls.which = V4L2_CTRL_ID2WHICH(p->id);
 	ctrls.count = 1;
 	ctrls.controls = &ctrl;
 	ctrl.id = p->id;
diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
index 2e857b19a155..bfcaa3fc04c2 100644
--- a/include/uapi/linux/videodev2.h
+++ b/include/uapi/linux/videodev2.h
@@ -1462,7 +1462,9 @@ struct v4l2_ext_control {
 
 struct v4l2_ext_controls {
 	union {
+#ifndef __KERNEL__
 		__u32 ctrl_class;
+#endif
 		__u32 which;
 	};
 	__u32 count;
@@ -1472,7 +1474,10 @@ struct v4l2_ext_controls {
 };
 
 #define V4L2_CTRL_ID_MASK      	  (0x0fffffff)
+#ifndef __KERNEL__
 #define V4L2_CTRL_ID2CLASS(id)    ((id) & 0x0fff0000UL)
+#endif
+#define V4L2_CTRL_ID2WHICH(id)    ((id) & 0x0fff0000UL)
 #define V4L2_CTRL_DRIVER_PRIV(id) (((id) & 0xffff) >= 0x1000)
 #define V4L2_CTRL_MAX_DIMS	  (4)
 #define V4L2_CTRL_WHICH_CUR_VAL   0
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 05/10] media/v4l2-core: struct struct v4l2_ext_controls param which
  2015-08-21 13:19 [PATCH v2 00/10] Support getting default values from any control Ricardo Ribalda Delgado
                   ` (3 preceding siblings ...)
  2015-08-21 13:19 ` [PATCH v2 04/10] media/core: Replace ctrl_class with which Ricardo Ribalda Delgado
@ 2015-08-21 13:19 ` Ricardo Ribalda Delgado
  2015-08-21 13:19 ` [PATCH v2 06/10] usb/uvc: Support for V4L2_CTRL_WHICH_DEF_VAL Ricardo Ribalda Delgado
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 17+ messages in thread
From: Ricardo Ribalda Delgado @ 2015-08-21 13:19 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Mike Isely, Laurent Pinchart,
	Hans Verkuil, Steven Toth, Sakari Ailus, Vincent Palatin,
	linux-media, linux-kernel
  Cc: Ricardo Ribalda Delgado

Support for new field which on v4l2_ext_controls, used to get the
default value of one or more controls.

Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
---
 drivers/media/v4l2-core/v4l2-ctrls.c | 34 +++++++++++++++++++++++++++++-----
 1 file changed, 29 insertions(+), 5 deletions(-)

diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
index 580098ba5c0b..8f1a5d3cbf7f 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
@@ -1489,6 +1489,17 @@ static int new_to_user(struct v4l2_ext_control *c,
 	return ptr_to_user(c, ctrl, ctrl->p_new);
 }
 
+/* Helper function: copy the initial control value back to the caller */
+static int def_to_user(struct v4l2_ext_control *c, struct v4l2_ctrl *ctrl)
+{
+	int idx;
+
+	for (idx = 0; idx < ctrl->elems; idx++)
+		ctrl->type_ops->init(ctrl, idx, ctrl->p_new);
+
+	return ptr_to_user(c, ctrl, ctrl->p_new);
+}
+
 /* Helper function: copy the caller-provider value to the given control value */
 static int user_to_ptr(struct v4l2_ext_control *c,
 		       struct v4l2_ctrl *ctrl,
@@ -2708,7 +2719,9 @@ static int prepare_ext_ctrls(struct v4l2_ctrl_handler *hdl,
 
 		cs->error_idx = i;
 
-		if (cs->which && V4L2_CTRL_ID2WHICH(id) != cs->which)
+		if (cs->which &&
+		    cs->which != V4L2_CTRL_WHICH_DEF_VAL &&
+		    V4L2_CTRL_ID2WHICH(id) != cs->which)
 			return -EINVAL;
 
 		/* Old-style private controls are not allowed for
@@ -2787,7 +2800,7 @@ static int prepare_ext_ctrls(struct v4l2_ctrl_handler *hdl,
    whether there are any controls at all. */
 static int class_check(struct v4l2_ctrl_handler *hdl, u32 which)
 {
-	if (!which)
+	if (which == 0 || which == V4L2_CTRL_WHICH_DEF_VAL)
 		return list_empty(&hdl->ctrl_refs) ? -EINVAL : 0;
 	return find_ref_lock(hdl, which | 1) ? 0 : -EINVAL;
 }
@@ -2801,6 +2814,9 @@ int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct v4l2_ext_controls *cs
 	struct v4l2_ctrl_helper *helpers = helper;
 	int ret;
 	int i, j;
+	bool def_value;
+
+	def_value = (cs->which == V4L2_CTRL_WHICH_DEF_VAL)
 
 	cs->error_idx = cs->count;
 	cs->which = V4L2_CTRL_ID2WHICH(cs->which);
@@ -2827,9 +2843,11 @@ int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct v4l2_ext_controls *cs
 
 	for (i = 0; !ret && i < cs->count; i++) {
 		int (*ctrl_to_user)(struct v4l2_ext_control *c,
-				    struct v4l2_ctrl *ctrl) = cur_to_user;
+				    struct v4l2_ctrl *ctrl);
 		struct v4l2_ctrl *master;
 
+		ctrl_to_user = def_value ? def_to_user : cur_to_user;
+
 		if (helpers[i].mref == NULL)
 			continue;
 
@@ -2839,8 +2857,9 @@ int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct v4l2_ext_controls *cs
 		v4l2_ctrl_lock(master);
 
 		/* g_volatile_ctrl will update the new control values */
-		if ((master->flags & V4L2_CTRL_FLAG_VOLATILE) ||
-			(master->has_volatiles && !is_cur_manual(master))) {
+		if (!def_value &&
+		    ((master->flags & V4L2_CTRL_FLAG_VOLATILE) ||
+		    (master->has_volatiles && !is_cur_manual(master)))) {
 			for (j = 0; j < master->ncontrols; j++)
 				cur_to_new(master->cluster[j]);
 			ret = call_op(master, g_volatile_ctrl);
@@ -3062,6 +3081,11 @@ static int try_set_ext_ctrls(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
 	int ret;
 
 	cs->error_idx = cs->count;
+
+	/* Default value cannot be changed */
+	if (cs->which == V4L2_CTRL_WHICH_DEF_VAL)
+		return -EINVAL;
+
 	cs->which = V4L2_CTRL_ID2WHICH(cs->which);
 
 	if (hdl == NULL)
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 06/10] usb/uvc: Support for V4L2_CTRL_WHICH_DEF_VAL
  2015-08-21 13:19 [PATCH v2 00/10] Support getting default values from any control Ricardo Ribalda Delgado
                   ` (4 preceding siblings ...)
  2015-08-21 13:19 ` [PATCH v2 05/10] media/v4l2-core: struct struct v4l2_ext_controls param which Ricardo Ribalda Delgado
@ 2015-08-21 13:19 ` Ricardo Ribalda Delgado
  2015-09-04 10:56   ` Hans Verkuil
  2015-10-29  0:08   ` Laurent Pinchart
  2015-08-21 13:19 ` [PATCH v2 07/10] media/usb/pvrusb2: " Ricardo Ribalda Delgado
                   ` (4 subsequent siblings)
  10 siblings, 2 replies; 17+ messages in thread
From: Ricardo Ribalda Delgado @ 2015-08-21 13:19 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Mike Isely, Laurent Pinchart,
	Hans Verkuil, Steven Toth, Sakari Ailus, Vincent Palatin,
	linux-media, linux-kernel
  Cc: Ricardo Ribalda Delgado

This driver does not use the control infrastructure.
Add support for the new field which on structure
 v4l2_ext_controls

Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
---
 drivers/media/usb/uvc/uvc_v4l2.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c
index 2764f43607c1..e6d3a1bcfa2f 100644
--- a/drivers/media/usb/uvc/uvc_v4l2.c
+++ b/drivers/media/usb/uvc/uvc_v4l2.c
@@ -980,6 +980,7 @@ static int uvc_ioctl_g_ext_ctrls(struct file *file, void *fh,
 	struct uvc_fh *handle = fh;
 	struct uvc_video_chain *chain = handle->chain;
 	struct v4l2_ext_control *ctrl = ctrls->controls;
+	struct v4l2_queryctrl qc;
 	unsigned int i;
 	int ret;
 
@@ -988,7 +989,14 @@ static int uvc_ioctl_g_ext_ctrls(struct file *file, void *fh,
 		return ret;
 
 	for (i = 0; i < ctrls->count; ++ctrl, ++i) {
-		ret = uvc_ctrl_get(chain, ctrl);
+		if (ctrls->which == V4L2_CTRL_WHICH_DEF_VAL) {
+			qc.id = ctrl->id;
+			ret = uvc_query_v4l2_ctrl(chain, &qc);
+			if (!ret)
+				ctrl->value = qc.default_value;
+		} else
+			ret = uvc_ctrl_get(chain, ctrl);
+
 		if (ret < 0) {
 			uvc_ctrl_rollback(handle);
 			ctrls->error_idx = i;
@@ -1010,6 +1018,10 @@ static int uvc_ioctl_s_try_ext_ctrls(struct uvc_fh *handle,
 	unsigned int i;
 	int ret;
 
+	/* Default value cannot be changed */
+	if (ctrls->which == V4L2_CTRL_WHICH_DEF_VAL)
+		return -EINVAL;
+
 	ret = uvc_ctrl_begin(chain);
 	if (ret < 0)
 		return ret;
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 07/10] media/usb/pvrusb2: Support for V4L2_CTRL_WHICH_DEF_VAL
  2015-08-21 13:19 [PATCH v2 00/10] Support getting default values from any control Ricardo Ribalda Delgado
                   ` (5 preceding siblings ...)
  2015-08-21 13:19 ` [PATCH v2 06/10] usb/uvc: Support for V4L2_CTRL_WHICH_DEF_VAL Ricardo Ribalda Delgado
@ 2015-08-21 13:19 ` Ricardo Ribalda Delgado
  2015-08-22  1:55   ` Mike Isely
  2015-08-21 13:19 ` [PATCH v2 08/10] media/pci/saa7164-encoder " Ricardo Ribalda Delgado
                   ` (3 subsequent siblings)
  10 siblings, 1 reply; 17+ messages in thread
From: Ricardo Ribalda Delgado @ 2015-08-21 13:19 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Mike Isely, Laurent Pinchart,
	Hans Verkuil, Steven Toth, Sakari Ailus, Vincent Palatin,
	linux-media, linux-kernel
  Cc: Ricardo Ribalda Delgado

This driver does not use the control infrastructure.
Add support for the new field which on structure
 v4l2_ext_controls

Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
---
 drivers/media/usb/pvrusb2/pvrusb2-v4l2.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c b/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c
index 1c5f85bf7ed4..43b2f2214798 100644
--- a/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c
+++ b/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c
@@ -628,6 +628,7 @@ static int pvr2_g_ext_ctrls(struct file *file, void *priv,
 	struct pvr2_v4l2_fh *fh = file->private_data;
 	struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
 	struct v4l2_ext_control *ctrl;
+	struct pvr2_ctrl *cptr;
 	unsigned int idx;
 	int val;
 	int ret;
@@ -635,8 +636,18 @@ static int pvr2_g_ext_ctrls(struct file *file, void *priv,
 	ret = 0;
 	for (idx = 0; idx < ctls->count; idx++) {
 		ctrl = ctls->controls + idx;
-		ret = pvr2_ctrl_get_value(
+		if (ctls->which == V4L2_CTRL_WHICH_DEF_VAL) {
+			cptr = pvr2_hdw_get_ctrl_v4l(hdw, ctrl->id);
+			if (cptr)
+				pvr2_ctrl_get_def(cptr, &val);
+			else
+				ret = -EINVAL;
+
+
+		} else
+			ret = pvr2_ctrl_get_value(
 				pvr2_hdw_get_ctrl_v4l(hdw, ctrl->id), &val);
+
 		if (ret) {
 			ctls->error_idx = idx;
 			return ret;
@@ -658,6 +669,10 @@ static int pvr2_s_ext_ctrls(struct file *file, void *priv,
 	unsigned int idx;
 	int ret;
 
+	/* Default value cannot be changed */
+	if (ctls->which == V4L2_CTRL_WHICH_DEF_VAL)
+		return -EINVAL;
+
 	ret = 0;
 	for (idx = 0; idx < ctls->count; idx++) {
 		ctrl = ctls->controls + idx;
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 08/10] media/pci/saa7164-encoder Support for V4L2_CTRL_WHICH_DEF_VAL
  2015-08-21 13:19 [PATCH v2 00/10] Support getting default values from any control Ricardo Ribalda Delgado
                   ` (6 preceding siblings ...)
  2015-08-21 13:19 ` [PATCH v2 07/10] media/usb/pvrusb2: " Ricardo Ribalda Delgado
@ 2015-08-21 13:19 ` Ricardo Ribalda Delgado
  2015-08-21 13:19 ` [PATCH v2 09/10] media/pci/saa7164-vbi " Ricardo Ribalda Delgado
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 17+ messages in thread
From: Ricardo Ribalda Delgado @ 2015-08-21 13:19 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Mike Isely, Laurent Pinchart,
	Hans Verkuil, Steven Toth, Sakari Ailus, Vincent Palatin,
	linux-media, linux-kernel
  Cc: Ricardo Ribalda Delgado

This driver does not use the control infrastructure.
Add support for the new field which on structure
 v4l2_ext_controls

Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
---
 drivers/media/pci/saa7164/saa7164-encoder.c | 55 ++++++++++++++++-------------
 1 file changed, 31 insertions(+), 24 deletions(-)

diff --git a/drivers/media/pci/saa7164/saa7164-encoder.c b/drivers/media/pci/saa7164/saa7164-encoder.c
index e0ec64ed06fc..4a5c1ee3fb34 100644
--- a/drivers/media/pci/saa7164/saa7164-encoder.c
+++ b/drivers/media/pci/saa7164/saa7164-encoder.c
@@ -531,30 +531,6 @@ static int saa7164_get_ctrl(struct saa7164_port *port,
 	return 0;
 }
 
-static int vidioc_g_ext_ctrls(struct file *file, void *priv,
-	struct v4l2_ext_controls *ctrls)
-{
-	struct saa7164_encoder_fh *fh = file->private_data;
-	struct saa7164_port *port = fh->port;
-	int i, err = 0;
-
-	if (ctrls->which == V4L2_CTRL_CLASS_MPEG) {
-		for (i = 0; i < ctrls->count; i++) {
-			struct v4l2_ext_control *ctrl = ctrls->controls + i;
-
-			err = saa7164_get_ctrl(port, ctrl);
-			if (err) {
-				ctrls->error_idx = i;
-				break;
-			}
-		}
-		return err;
-
-	}
-
-	return -EINVAL;
-}
-
 static int saa7164_try_ctrl(struct v4l2_ext_control *ctrl, int ac3)
 {
 	int ret = -EINVAL;
@@ -884,6 +860,37 @@ static int vidioc_queryctrl(struct file *file, void *priv,
 	return -EINVAL;
 }
 
+static int vidioc_g_ext_ctrls(struct file *file, void *priv,
+	struct v4l2_ext_controls *ctrls)
+{
+	struct saa7164_encoder_fh *fh = file->private_data;
+	struct saa7164_port *port = fh->port;
+	int i, err = 0;
+
+	if (ctrls->which != V4L2_CTRL_CLASS_MPEG &&
+		ctrls->which != V4L2_CTRL_WHICH_DEF_VAL)
+		return -EINVAL;
+
+	for (i = 0; i < ctrls->count; i++) {
+		struct v4l2_ext_control *ctrl = ctrls->controls + i;
+
+		if (ctrls->which == V4L2_CTRL_WHICH_DEF_VAL) {
+			struct v4l2_queryctrl q;
+
+			err = fill_queryctrl(&port->encoder_params, &q);
+			if (!err)
+				ctrl->value = q.default_value;
+		} else
+			err = saa7164_get_ctrl(port, ctrl);
+
+		if (err) {
+			ctrls->error_idx = i;
+			break;
+		}
+	}
+	return err;
+}
+
 static int saa7164_encoder_stop_port(struct saa7164_port *port)
 {
 	struct saa7164_dev *dev = port->dev;
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 09/10] media/pci/saa7164-vbi Support for V4L2_CTRL_WHICH_DEF_VAL
  2015-08-21 13:19 [PATCH v2 00/10] Support getting default values from any control Ricardo Ribalda Delgado
                   ` (7 preceding siblings ...)
  2015-08-21 13:19 ` [PATCH v2 08/10] media/pci/saa7164-encoder " Ricardo Ribalda Delgado
@ 2015-08-21 13:19 ` Ricardo Ribalda Delgado
  2015-08-21 13:19 ` [PATCH v2 10/10] Docbook: media: Document changes on struct v4l2_ext_controls Ricardo Ribalda Delgado
  2015-09-04 11:01 ` [PATCH v2 00/10] Support getting default values from any control Hans Verkuil
  10 siblings, 0 replies; 17+ messages in thread
From: Ricardo Ribalda Delgado @ 2015-08-21 13:19 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Mike Isely, Laurent Pinchart,
	Hans Verkuil, Steven Toth, Sakari Ailus, Vincent Palatin,
	linux-media, linux-kernel
  Cc: Ricardo Ribalda Delgado

This driver does not use the control infrastructure.
Add support for the new field which on structure
 v4l2_ext_controls

Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
---
 drivers/media/pci/saa7164/saa7164-vbi.c | 57 +++++++++++++++++++--------------
 1 file changed, 33 insertions(+), 24 deletions(-)

diff --git a/drivers/media/pci/saa7164/saa7164-vbi.c b/drivers/media/pci/saa7164/saa7164-vbi.c
index 08f23b6d9cef..4c2d8ec5b4dd 100644
--- a/drivers/media/pci/saa7164/saa7164-vbi.c
+++ b/drivers/media/pci/saa7164/saa7164-vbi.c
@@ -494,30 +494,6 @@ static int saa7164_get_ctrl(struct saa7164_port *port,
 	return 0;
 }
 
-static int vidioc_g_ext_ctrls(struct file *file, void *priv,
-	struct v4l2_ext_controls *ctrls)
-{
-	struct saa7164_vbi_fh *fh = file->private_data;
-	struct saa7164_port *port = fh->port;
-	int i, err = 0;
-
-	if (ctrls->which == V4L2_CTRL_CLASS_MPEG) {
-		for (i = 0; i < ctrls->count; i++) {
-			struct v4l2_ext_control *ctrl = ctrls->controls + i;
-
-			err = saa7164_get_ctrl(port, ctrl);
-			if (err) {
-				ctrls->error_idx = i;
-				break;
-			}
-		}
-		return err;
-
-	}
-
-	return -EINVAL;
-}
-
 static int saa7164_try_ctrl(struct v4l2_ext_control *ctrl, int ac3)
 {
 	int ret = -EINVAL;
@@ -810,6 +786,39 @@ static int vidioc_queryctrl(struct file *file, void *priv,
 	return -EINVAL;
 }
 
+static int vidioc_g_ext_ctrls(struct file *file, void *priv,
+	struct v4l2_ext_controls *ctrls)
+{
+	struct saa7164_vbi_fh *fh = file->private_data;
+	struct saa7164_port *port = fh->port;
+	int i, err = 0;
+
+	if (ctrls->which != V4L2_CTRL_CLASS_MPEG &&
+		ctrls->which != V4L2_CTRL_WHICH_DEF_VAL)
+		return -EINVAL;
+
+	for (i = 0; i < ctrls->count; i++) {
+		struct v4l2_ext_control *ctrl = ctrls->controls + i;
+
+		if (ctrls->which == V4L2_CTRL_WHICH_DEF_VAL) {
+			struct v4l2_queryctrl q;
+
+			err = fill_queryctrl(&port->vbi_params, &q);
+			if (!err)
+				ctrl->value = q.default_value;
+		} else
+			err = saa7164_get_ctrl(port, ctrl);
+
+		if (err) {
+			ctrls->error_idx = i;
+			break;
+		}
+	}
+
+	return err;
+}
+
+
 static int saa7164_vbi_stop_port(struct saa7164_port *port)
 {
 	struct saa7164_dev *dev = port->dev;
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 10/10] Docbook: media: Document changes on struct v4l2_ext_controls
  2015-08-21 13:19 [PATCH v2 00/10] Support getting default values from any control Ricardo Ribalda Delgado
                   ` (8 preceding siblings ...)
  2015-08-21 13:19 ` [PATCH v2 09/10] media/pci/saa7164-vbi " Ricardo Ribalda Delgado
@ 2015-08-21 13:19 ` Ricardo Ribalda Delgado
  2015-09-04 11:01 ` [PATCH v2 00/10] Support getting default values from any control Hans Verkuil
  10 siblings, 0 replies; 17+ messages in thread
From: Ricardo Ribalda Delgado @ 2015-08-21 13:19 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Mike Isely, Laurent Pinchart,
	Hans Verkuil, Steven Toth, Sakari Ailus, Vincent Palatin,
	linux-media, linux-kernel
  Cc: Ricardo Ribalda Delgado

Vidioc-g-ext-ctrls can now be used to get the default value of the
controls.

Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
---
 Documentation/DocBook/media/v4l/v4l2.xml           |  9 +++++++++
 .../DocBook/media/v4l/vidioc-g-ext-ctrls.xml       | 22 ++++++++++++++++++++++
 2 files changed, 31 insertions(+)

diff --git a/Documentation/DocBook/media/v4l/v4l2.xml b/Documentation/DocBook/media/v4l/v4l2.xml
index e98caa1c39bd..be52bd2fb335 100644
--- a/Documentation/DocBook/media/v4l/v4l2.xml
+++ b/Documentation/DocBook/media/v4l/v4l2.xml
@@ -153,6 +153,15 @@ structs, ioctls) must be noted in more detail in the history chapter
 applications. -->
 
       <revision>
+	<revnumber>4.4</revnumber>
+	<date>2015-08-20</date>
+	<authorinitials>rr</authorinitials>
+	<revremark>Extend vidioc-g-ext-ctrls;. Replace ctrl_class with a new
+union with ctrl_class and which. Which is used to select the current value of
+the control or the default value.
+	</revremark>
+      </revision>
+      <revision>
 	<revnumber>3.21</revnumber>
 	<date>2015-02-13</date>
 	<authorinitials>mcc</authorinitials>
diff --git a/Documentation/DocBook/media/v4l/vidioc-g-ext-ctrls.xml b/Documentation/DocBook/media/v4l/vidioc-g-ext-ctrls.xml
index 8f4eb395665d..3b7bf68a8250 100644
--- a/Documentation/DocBook/media/v4l/vidioc-g-ext-ctrls.xml
+++ b/Documentation/DocBook/media/v4l/vidioc-g-ext-ctrls.xml
@@ -216,7 +216,12 @@ Valid if <constant>V4L2_CTRL_FLAG_HAS_PAYLOAD</constant> is set for this control
       <tgroup cols="3">
 	&cs-str;
 	<tbody valign="top">
+	 <row>
+	    <entry>union</entry>
+	    <entry>(anonymous)</entry>
+	  </row>
 	  <row>
+	    <entry></entry>
 	    <entry>__u32</entry>
 	    <entry><structfield>ctrl_class</structfield></entry>
 	    <entry>The control class to which all controls belong, see
@@ -228,6 +233,23 @@ with a <structfield>count</structfield> of 0. If that succeeds, then the driver
 supports this feature.</entry>
 	  </row>
 	  <row>
+	    <entry></entry>
+	    <entry>__u32</entry>
+	    <entry><structfield>which</structfield></entry>
+	    <entry><para>Which value of the control to get/set/try. <constant>V4L2_CTRL_WHICH_CUR_VAL</constant>
+will return the current value of the control and <constant>V4L2_CTRL_WHICH_DEF_VAL</constant> will
+return the default value of the control. Please note that you can only get the default value of the
+control, you cannot set or try it.</para>
+<para>For backwards compatibility you can also use a control class here (see
+<xref linkend="ctrl-class" />). In that case all controls have to belong to that
+control class. This usage is deprecated, instead just use <constant>V4L2_CTRL_WHICH_CUR_VAL</constant>.
+There are some very old drivers that do not yet support <constant>V4L2_CTRL_WHICH_CUR_VAL</constant>
+and that require a control class here. You can test for such drivers by setting ctrl_class to
+<constant>V4L2_CTRL_WHICH_CUR_VAL</constant> and calling VIDIOC_TRY_EXT_CTRLS with a count of 0.
+If that fails, then the driver does not support <constant>V4L2_CTRL_WHICH_CUR_VAL</constant>.</para>
+</entry>
+	  </row>
+	  <row>
 	    <entry>__u32</entry>
 	    <entry><structfield>count</structfield></entry>
 	    <entry>The number of controls in the controls array. May
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 07/10] media/usb/pvrusb2: Support for V4L2_CTRL_WHICH_DEF_VAL
  2015-08-21 13:19 ` [PATCH v2 07/10] media/usb/pvrusb2: " Ricardo Ribalda Delgado
@ 2015-08-22  1:55   ` Mike Isely
  0 siblings, 0 replies; 17+ messages in thread
From: Mike Isely @ 2015-08-22  1:55 UTC (permalink / raw)
  To: Ricardo Ribalda Delgado
  Cc: Mauro Carvalho Chehab, Laurent Pinchart, Hans Verkuil,
	Steven Toth, Sakari Ailus, Vincent Palatin, linux-media,
	Linux Kernel Mailing List, Mike Isely at pobox


The code you've added is carefully checking the return pointer from 
pvr2_hdw_get_ctrl_v4l() yet the original code did not operate this way.  
The result is that now there's this "unbalanced" effect where it appears 
that the validity of the pvr2_ctrl instance is only checked on one side 
of the if-statement.  I would recommend instead to elevate the call to 
pvr2_hdw_get_ctrl_v4l() out of the if-statement - since in both cases 
it's being called the same way both times.  Then do the validity check 
in that one spot and that simplifies the if-statement all the way down 
to choosing between pvr2_ctrl_get_value() vs pvr2_ctrl_get_def().

It's not a correctness comment; what you have should work fine.  So I'm 
ack'ing this in any case:

Acked-By: Mike Isely <isely@pobox.com>

But you can do the above pretty easily & safely, and simplify it a bit 
further.

  -Mike


On Fri, 21 Aug 2015, Ricardo Ribalda Delgado wrote:

> This driver does not use the control infrastructure.
> Add support for the new field which on structure
>  v4l2_ext_controls
> 
> Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
> ---
>  drivers/media/usb/pvrusb2/pvrusb2-v4l2.c | 17 ++++++++++++++++-
>  1 file changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c b/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c
> index 1c5f85bf7ed4..43b2f2214798 100644
> --- a/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c
> +++ b/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c
> @@ -628,6 +628,7 @@ static int pvr2_g_ext_ctrls(struct file *file, void *priv,
>  	struct pvr2_v4l2_fh *fh = file->private_data;
>  	struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
>  	struct v4l2_ext_control *ctrl;
> +	struct pvr2_ctrl *cptr;
>  	unsigned int idx;
>  	int val;
>  	int ret;
> @@ -635,8 +636,18 @@ static int pvr2_g_ext_ctrls(struct file *file, void *priv,
>  	ret = 0;
>  	for (idx = 0; idx < ctls->count; idx++) {
>  		ctrl = ctls->controls + idx;
> -		ret = pvr2_ctrl_get_value(
> +		if (ctls->which == V4L2_CTRL_WHICH_DEF_VAL) {
> +			cptr = pvr2_hdw_get_ctrl_v4l(hdw, ctrl->id);
> +			if (cptr)
> +				pvr2_ctrl_get_def(cptr, &val);
> +			else
> +				ret = -EINVAL;
> +
> +
> +		} else
> +			ret = pvr2_ctrl_get_value(
>  				pvr2_hdw_get_ctrl_v4l(hdw, ctrl->id), &val);
> +
>  		if (ret) {
>  			ctls->error_idx = idx;
>  			return ret;
> @@ -658,6 +669,10 @@ static int pvr2_s_ext_ctrls(struct file *file, void *priv,
>  	unsigned int idx;
>  	int ret;
>  
> +	/* Default value cannot be changed */
> +	if (ctls->which == V4L2_CTRL_WHICH_DEF_VAL)
> +		return -EINVAL;
> +
>  	ret = 0;
>  	for (idx = 0; idx < ctls->count; idx++) {
>  		ctrl = ctls->controls + idx;
> 

-- 

Mike Isely
isely @ isely (dot) net
PGP: 03 54 43 4D 75 E5 CC 92 71 16 01 E2 B5 F5 C1 E8

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 06/10] usb/uvc: Support for V4L2_CTRL_WHICH_DEF_VAL
  2015-08-21 13:19 ` [PATCH v2 06/10] usb/uvc: Support for V4L2_CTRL_WHICH_DEF_VAL Ricardo Ribalda Delgado
@ 2015-09-04 10:56   ` Hans Verkuil
  2015-09-17 13:17     ` Hans Verkuil
  2015-10-29  0:08   ` Laurent Pinchart
  1 sibling, 1 reply; 17+ messages in thread
From: Hans Verkuil @ 2015-09-04 10:56 UTC (permalink / raw)
  To: Ricardo Ribalda Delgado, Mauro Carvalho Chehab, Mike Isely,
	Laurent Pinchart, Hans Verkuil, Steven Toth, Sakari Ailus,
	Vincent Palatin, linux-media, linux-kernel

Laurent, can you review this?

Regards,

	Hans

On 08/21/2015 03:19 PM, Ricardo Ribalda Delgado wrote:
> This driver does not use the control infrastructure.
> Add support for the new field which on structure
>  v4l2_ext_controls
> 
> Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
> ---
>  drivers/media/usb/uvc/uvc_v4l2.c | 14 +++++++++++++-
>  1 file changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c
> index 2764f43607c1..e6d3a1bcfa2f 100644
> --- a/drivers/media/usb/uvc/uvc_v4l2.c
> +++ b/drivers/media/usb/uvc/uvc_v4l2.c
> @@ -980,6 +980,7 @@ static int uvc_ioctl_g_ext_ctrls(struct file *file, void *fh,
>  	struct uvc_fh *handle = fh;
>  	struct uvc_video_chain *chain = handle->chain;
>  	struct v4l2_ext_control *ctrl = ctrls->controls;
> +	struct v4l2_queryctrl qc;
>  	unsigned int i;
>  	int ret;
>  
> @@ -988,7 +989,14 @@ static int uvc_ioctl_g_ext_ctrls(struct file *file, void *fh,
>  		return ret;
>  
>  	for (i = 0; i < ctrls->count; ++ctrl, ++i) {
> -		ret = uvc_ctrl_get(chain, ctrl);
> +		if (ctrls->which == V4L2_CTRL_WHICH_DEF_VAL) {
> +			qc.id = ctrl->id;
> +			ret = uvc_query_v4l2_ctrl(chain, &qc);
> +			if (!ret)
> +				ctrl->value = qc.default_value;
> +		} else
> +			ret = uvc_ctrl_get(chain, ctrl);
> +
>  		if (ret < 0) {
>  			uvc_ctrl_rollback(handle);
>  			ctrls->error_idx = i;
> @@ -1010,6 +1018,10 @@ static int uvc_ioctl_s_try_ext_ctrls(struct uvc_fh *handle,
>  	unsigned int i;
>  	int ret;
>  
> +	/* Default value cannot be changed */
> +	if (ctrls->which == V4L2_CTRL_WHICH_DEF_VAL)
> +		return -EINVAL;
> +
>  	ret = uvc_ctrl_begin(chain);
>  	if (ret < 0)
>  		return ret;
> 


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 00/10] Support getting default values from any control
  2015-08-21 13:19 [PATCH v2 00/10] Support getting default values from any control Ricardo Ribalda Delgado
                   ` (9 preceding siblings ...)
  2015-08-21 13:19 ` [PATCH v2 10/10] Docbook: media: Document changes on struct v4l2_ext_controls Ricardo Ribalda Delgado
@ 2015-09-04 11:01 ` Hans Verkuil
  10 siblings, 0 replies; 17+ messages in thread
From: Hans Verkuil @ 2015-09-04 11:01 UTC (permalink / raw)
  To: Ricardo Ribalda Delgado, Mauro Carvalho Chehab, Mike Isely,
	Laurent Pinchart, Hans Verkuil, Steven Toth, Sakari Ailus,
	Vincent Palatin, linux-media, linux-kernel

This patch series looks good. I'll drop the saa7164 patches since I made a
patch series converting it to the control framework. Once Steve gives me the
Ack for that I can merge that series.

All I need to merge your series (minus the saa7164 patches) is the Ack from
Laurent for the uvc patch.

Regards,

	Hans

On 08/21/2015 03:19 PM, Ricardo Ribalda Delgado wrote:
> Integer controls provide a way to get their default/initial value, but
> any other control (p_u32, p_u8.....) provide no other way to get the
> initial value than unloading the module and loading it back.
> 
> *What is the actual problem?
> I have a custom control with WIDTH integer values. Every value
> represents the calibrated FPN (fixed pattern noise) correction value for that
> column
> -Application A changes the FPN correction value
> -Application B wants to restore the calibrated value but it cant :(
> 
> *What is the proposed solution?
> 
> (Kudos to Hans Verkuil!!!)
> 
> The key change is in struct v4l2_ext_controls where the __u32 ctrl_class field
> is changed to:
> 
>         union {
>                 __u32 ctrl_class;
>                 __u32 which;
>         };
> 
> And two new defines are added:
> 
> #define V4L2_CTRL_WHICH_CUR_VAL        0
> #define V4L2_CTRL_WHICH_DEF_VAL        0x0f000000
> 
> The 'which' field tells you which controls are get/set/tried.
> 
> V4L2_CTRL_WHICH_CUR_VAL: the current value of the controls
> V4L2_CTRL_WHICH_DEF_VAL: the default value of the controls
> V4L2_CTRL_CLASS_*: the current value of the controls belonging to the specified class.
>         Note: this is deprecated usage and is only there for backwards compatibility.
>         Which is also why I don't think there is a need to add V4L2_CTRL_WHICH_
>         aliases for these defines.
> 
> 
> I have posted a copy of my working tree to
> 
> https://github.com/ribalda/linux/tree/which_def_v2
> 
> Changelog v2:
> 
> Suggested by Hans Verkuil <hverkuil@xs4all.nl>
> 
> Replace ctrls_class with which on all the codebase
> Changes in Documentation
> (Thanks!)
> 
> Ricardo Ribalda Delgado (10):
>   videodev2.h: Fix typo in comment
>   videodev2.h: Extend struct v4l2_ext_controls
>   media/v4l2-compat-ioctl32: Simple stylechecks
>   media/core: Replace ctrl_class with which
>   media/v4l2-core: struct struct v4l2_ext_controls param which
>   usb/uvc: Support for V4L2_CTRL_WHICH_DEF_VAL
>   media/usb/pvrusb2: Support for V4L2_CTRL_WHICH_DEF_VAL
>   media/pci/saa7164-encoder Support for V4L2_CTRL_WHICH_DEF_VAL
>   media/pci/saa7164-vbi Support for V4L2_CTRL_WHICH_DEF_VAL
>   Docbook: media: Document changes on struct v4l2_ext_controls
> 
>  Documentation/DocBook/media/v4l/v4l2.xml           |  9 ++++
>  .../DocBook/media/v4l/vidioc-g-ext-ctrls.xml       | 28 ++++++++--
>  drivers/media/pci/saa7164/saa7164-encoder.c        | 59 ++++++++++++---------
>  drivers/media/pci/saa7164/saa7164-vbi.c            | 61 +++++++++++++---------
>  drivers/media/platform/s5p-mfc/s5p_mfc_dec.c       |  2 +-
>  drivers/media/platform/s5p-mfc/s5p_mfc_enc.c       |  2 +-
>  drivers/media/usb/pvrusb2/pvrusb2-v4l2.c           | 17 +++++-
>  drivers/media/usb/uvc/uvc_v4l2.c                   | 14 ++++-
>  drivers/media/v4l2-core/v4l2-compat-ioctl32.c      | 17 +++---
>  drivers/media/v4l2-core/v4l2-ctrls.c               | 54 +++++++++++++------
>  drivers/media/v4l2-core/v4l2-ioctl.c               | 14 ++---
>  include/uapi/linux/videodev2.h                     | 14 ++++-
>  12 files changed, 200 insertions(+), 91 deletions(-)
> 


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 06/10] usb/uvc: Support for V4L2_CTRL_WHICH_DEF_VAL
  2015-09-04 10:56   ` Hans Verkuil
@ 2015-09-17 13:17     ` Hans Verkuil
  2015-10-19 11:08       ` Ricardo Ribalda Delgado
  0 siblings, 1 reply; 17+ messages in thread
From: Hans Verkuil @ 2015-09-17 13:17 UTC (permalink / raw)
  To: Ricardo Ribalda Delgado, Laurent Pinchart, linux-media

On 09/04/15 12:56, Hans Verkuil wrote:
> Laurent, can you review this?

Ping! If I have an Ack on Monday at the latest, then I can make a pull request
for this series before I leave for 2 1/2 weeks.

Regards,

	Hans

> 
> Regards,
> 
> 	Hans
> 
> On 08/21/2015 03:19 PM, Ricardo Ribalda Delgado wrote:
>> This driver does not use the control infrastructure.
>> Add support for the new field which on structure
>>  v4l2_ext_controls
>>
>> Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
>> ---
>>  drivers/media/usb/uvc/uvc_v4l2.c | 14 +++++++++++++-
>>  1 file changed, 13 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c
>> index 2764f43607c1..e6d3a1bcfa2f 100644
>> --- a/drivers/media/usb/uvc/uvc_v4l2.c
>> +++ b/drivers/media/usb/uvc/uvc_v4l2.c
>> @@ -980,6 +980,7 @@ static int uvc_ioctl_g_ext_ctrls(struct file *file, void *fh,
>>  	struct uvc_fh *handle = fh;
>>  	struct uvc_video_chain *chain = handle->chain;
>>  	struct v4l2_ext_control *ctrl = ctrls->controls;
>> +	struct v4l2_queryctrl qc;
>>  	unsigned int i;
>>  	int ret;
>>  
>> @@ -988,7 +989,14 @@ static int uvc_ioctl_g_ext_ctrls(struct file *file, void *fh,
>>  		return ret;
>>  
>>  	for (i = 0; i < ctrls->count; ++ctrl, ++i) {
>> -		ret = uvc_ctrl_get(chain, ctrl);
>> +		if (ctrls->which == V4L2_CTRL_WHICH_DEF_VAL) {
>> +			qc.id = ctrl->id;
>> +			ret = uvc_query_v4l2_ctrl(chain, &qc);
>> +			if (!ret)
>> +				ctrl->value = qc.default_value;
>> +		} else
>> +			ret = uvc_ctrl_get(chain, ctrl);
>> +
>>  		if (ret < 0) {
>>  			uvc_ctrl_rollback(handle);
>>  			ctrls->error_idx = i;
>> @@ -1010,6 +1018,10 @@ static int uvc_ioctl_s_try_ext_ctrls(struct uvc_fh *handle,
>>  	unsigned int i;
>>  	int ret;
>>  
>> +	/* Default value cannot be changed */
>> +	if (ctrls->which == V4L2_CTRL_WHICH_DEF_VAL)
>> +		return -EINVAL;
>> +
>>  	ret = uvc_ctrl_begin(chain);
>>  	if (ret < 0)
>>  		return ret;
>>
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 06/10] usb/uvc: Support for V4L2_CTRL_WHICH_DEF_VAL
  2015-09-17 13:17     ` Hans Verkuil
@ 2015-10-19 11:08       ` Ricardo Ribalda Delgado
  0 siblings, 0 replies; 17+ messages in thread
From: Ricardo Ribalda Delgado @ 2015-10-19 11:08 UTC (permalink / raw)
  To: Hans Verkuil; +Cc: Laurent Pinchart, linux-media

Hello Laurent

Could you take a look to this patch.


Thanks!

On Thu, Sep 17, 2015 at 3:17 PM, Hans Verkuil <hverkuil@xs4all.nl> wrote:
> On 09/04/15 12:56, Hans Verkuil wrote:
>> Laurent, can you review this?
>
> Ping! If I have an Ack on Monday at the latest, then I can make a pull request
> for this series before I leave for 2 1/2 weeks.
>
> Regards,
>
>         Hans
>
>>
>> Regards,
>>
>>       Hans
>>
>> On 08/21/2015 03:19 PM, Ricardo Ribalda Delgado wrote:
>>> This driver does not use the control infrastructure.
>>> Add support for the new field which on structure
>>>  v4l2_ext_controls
>>>
>>> Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
>>> ---
>>>  drivers/media/usb/uvc/uvc_v4l2.c | 14 +++++++++++++-
>>>  1 file changed, 13 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c
>>> index 2764f43607c1..e6d3a1bcfa2f 100644
>>> --- a/drivers/media/usb/uvc/uvc_v4l2.c
>>> +++ b/drivers/media/usb/uvc/uvc_v4l2.c
>>> @@ -980,6 +980,7 @@ static int uvc_ioctl_g_ext_ctrls(struct file *file, void *fh,
>>>      struct uvc_fh *handle = fh;
>>>      struct uvc_video_chain *chain = handle->chain;
>>>      struct v4l2_ext_control *ctrl = ctrls->controls;
>>> +    struct v4l2_queryctrl qc;
>>>      unsigned int i;
>>>      int ret;
>>>
>>> @@ -988,7 +989,14 @@ static int uvc_ioctl_g_ext_ctrls(struct file *file, void *fh,
>>>              return ret;
>>>
>>>      for (i = 0; i < ctrls->count; ++ctrl, ++i) {
>>> -            ret = uvc_ctrl_get(chain, ctrl);
>>> +            if (ctrls->which == V4L2_CTRL_WHICH_DEF_VAL) {
>>> +                    qc.id = ctrl->id;
>>> +                    ret = uvc_query_v4l2_ctrl(chain, &qc);
>>> +                    if (!ret)
>>> +                            ctrl->value = qc.default_value;
>>> +            } else
>>> +                    ret = uvc_ctrl_get(chain, ctrl);
>>> +
>>>              if (ret < 0) {
>>>                      uvc_ctrl_rollback(handle);
>>>                      ctrls->error_idx = i;
>>> @@ -1010,6 +1018,10 @@ static int uvc_ioctl_s_try_ext_ctrls(struct uvc_fh *handle,
>>>      unsigned int i;
>>>      int ret;
>>>
>>> +    /* Default value cannot be changed */
>>> +    if (ctrls->which == V4L2_CTRL_WHICH_DEF_VAL)
>>> +            return -EINVAL;
>>> +
>>>      ret = uvc_ctrl_begin(chain);
>>>      if (ret < 0)
>>>              return ret;
>>>
>>



-- 
Ricardo Ribalda

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 06/10] usb/uvc: Support for V4L2_CTRL_WHICH_DEF_VAL
  2015-08-21 13:19 ` [PATCH v2 06/10] usb/uvc: Support for V4L2_CTRL_WHICH_DEF_VAL Ricardo Ribalda Delgado
  2015-09-04 10:56   ` Hans Verkuil
@ 2015-10-29  0:08   ` Laurent Pinchart
  1 sibling, 0 replies; 17+ messages in thread
From: Laurent Pinchart @ 2015-10-29  0:08 UTC (permalink / raw)
  To: Ricardo Ribalda Delgado
  Cc: Mauro Carvalho Chehab, Mike Isely, Hans Verkuil, Steven Toth,
	Sakari Ailus, Vincent Palatin, linux-media, linux-kernel

Hi Ricardo,

Thank you for the patch.

On Friday 21 August 2015 15:19:25 Ricardo Ribalda Delgado wrote:
> This driver does not use the control infrastructure.
> Add support for the new field which on structure
>  v4l2_ext_controls
> 
> Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
> ---
>  drivers/media/usb/uvc/uvc_v4l2.c | 14 +++++++++++++-
>  1 file changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/media/usb/uvc/uvc_v4l2.c
> b/drivers/media/usb/uvc/uvc_v4l2.c index 2764f43607c1..e6d3a1bcfa2f 100644
> --- a/drivers/media/usb/uvc/uvc_v4l2.c
> +++ b/drivers/media/usb/uvc/uvc_v4l2.c
> @@ -980,6 +980,7 @@ static int uvc_ioctl_g_ext_ctrls(struct file *file, void
> *fh, struct uvc_fh *handle = fh;
>  	struct uvc_video_chain *chain = handle->chain;
>  	struct v4l2_ext_control *ctrl = ctrls->controls;
> +	struct v4l2_queryctrl qc;
>  	unsigned int i;
>  	int ret;
> 
> @@ -988,7 +989,14 @@ static int uvc_ioctl_g_ext_ctrls(struct file *file,
> void *fh, return ret;
> 
>  	for (i = 0; i < ctrls->count; ++ctrl, ++i) {
> -		ret = uvc_ctrl_get(chain, ctrl);
> +		if (ctrls->which == V4L2_CTRL_WHICH_DEF_VAL) {
> +			qc.id = ctrl->id;
> +			ret = uvc_query_v4l2_ctrl(chain, &qc);

The uvc_ctrl_begin() call above locks chain->ctrl_mutex, and 
uvc_query_v4l2_ctrl() will then try to acquire the same lock. That's not a 
good idea :-)

I propose moving the ctrls->which check before the uvc_ctrl_begin() call and 
implement it as

	if (ctrls->which == V4L2_CTRL_WHICH_DEF_VAL) {
		for (i = 0; i < ctrls->count; ++ctrl, ++i) {
			struct v4l2_queryctrl qc = { .id = ctrl->id };

			ret = uvc_query_v4l2_ctrl(chain, &qc);
			if (ret < 0) {
				ctrls->error_idx = i;
				return ret;
			}

			ctrl->value = qc.default_value;
		}

		return 0;
	}

> +			if (!ret)
> +				ctrl->value = qc.default_value;
> +		} else
> +			ret = uvc_ctrl_get(chain, ctrl);
> +
>  		if (ret < 0) {
>  			uvc_ctrl_rollback(handle);
>  			ctrls->error_idx = i;
> @@ -1010,6 +1018,10 @@ static int uvc_ioctl_s_try_ext_ctrls(struct uvc_fh
> *handle, unsigned int i;
>  	int ret;
> 
> +	/* Default value cannot be changed */
> +	if (ctrls->which == V4L2_CTRL_WHICH_DEF_VAL)
> +		return -EINVAL;
> +
>  	ret = uvc_ctrl_begin(chain);
>  	if (ret < 0)
>  		return ret;

-- 
Regards,

Laurent Pinchart


^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2015-10-29  0:08 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-08-21 13:19 [PATCH v2 00/10] Support getting default values from any control Ricardo Ribalda Delgado
2015-08-21 13:19 ` [PATCH v2 01/10] videodev2.h: Fix typo in comment Ricardo Ribalda Delgado
2015-08-21 13:19 ` [PATCH v2 02/10] videodev2.h: Extend struct v4l2_ext_controls Ricardo Ribalda Delgado
2015-08-21 13:19 ` [PATCH v2 03/10] media/v4l2-compat-ioctl32: Simple stylechecks Ricardo Ribalda Delgado
2015-08-21 13:19 ` [PATCH v2 04/10] media/core: Replace ctrl_class with which Ricardo Ribalda Delgado
2015-08-21 13:19 ` [PATCH v2 05/10] media/v4l2-core: struct struct v4l2_ext_controls param which Ricardo Ribalda Delgado
2015-08-21 13:19 ` [PATCH v2 06/10] usb/uvc: Support for V4L2_CTRL_WHICH_DEF_VAL Ricardo Ribalda Delgado
2015-09-04 10:56   ` Hans Verkuil
2015-09-17 13:17     ` Hans Verkuil
2015-10-19 11:08       ` Ricardo Ribalda Delgado
2015-10-29  0:08   ` Laurent Pinchart
2015-08-21 13:19 ` [PATCH v2 07/10] media/usb/pvrusb2: " Ricardo Ribalda Delgado
2015-08-22  1:55   ` Mike Isely
2015-08-21 13:19 ` [PATCH v2 08/10] media/pci/saa7164-encoder " Ricardo Ribalda Delgado
2015-08-21 13:19 ` [PATCH v2 09/10] media/pci/saa7164-vbi " Ricardo Ribalda Delgado
2015-08-21 13:19 ` [PATCH v2 10/10] Docbook: media: Document changes on struct v4l2_ext_controls Ricardo Ribalda Delgado
2015-09-04 11:01 ` [PATCH v2 00/10] Support getting default values from any control Hans Verkuil

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).