[v3,2/4] utils: codegen: controls.py: Parse direction information
diff mbox series

Message ID 20241129091916.298359-3-paul.elder@ideasonboard.com
State Superseded
Headers show
Series
  • Add direction field to ControlId
Related show

Commit Message

Paul Elder Nov. 29, 2024, 9:19 a.m. UTC
In preparation for adding support for querying direction information
from controls, parse the direction information from control ID
definitions. This can later be plugged in directly to the IPA code
generators simply by using ctrl.direction.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

---
Changes in v3:
- minor reordering

Changes in v2:
- prevent errors in parsing properties, since the direction field is now
  required yet properties can only be out
  - do this by expanding the Control constructor to take the mode
    argument, so that needs to be passed in by the users of Control
---
 src/py/libcamera/gen-py-controls.py |  2 +-
 utils/codegen/controls.py           | 24 +++++++++++++++++++++++-
 utils/codegen/gen-controls.py       |  2 +-
 utils/codegen/gen-gst-controls.py   |  2 +-
 4 files changed, 26 insertions(+), 4 deletions(-)

Comments

Kieran Bingham Dec. 6, 2024, 12:21 p.m. UTC | #1
Quoting Paul Elder (2024-11-29 09:19:14)
> In preparation for adding support for querying direction information
> from controls, parse the direction information from control ID
> definitions. This can later be plugged in directly to the IPA code
> generators simply by using ctrl.direction.
> 
> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>

> 
> ---
> Changes in v3:
> - minor reordering
> 
> Changes in v2:
> - prevent errors in parsing properties, since the direction field is now
>   required yet properties can only be out
>   - do this by expanding the Control constructor to take the mode
>     argument, so that needs to be passed in by the users of Control
> ---
>  src/py/libcamera/gen-py-controls.py |  2 +-
>  utils/codegen/controls.py           | 24 +++++++++++++++++++++++-
>  utils/codegen/gen-controls.py       |  2 +-
>  utils/codegen/gen-gst-controls.py   |  2 +-
>  4 files changed, 26 insertions(+), 4 deletions(-)
> 
> diff --git a/src/py/libcamera/gen-py-controls.py b/src/py/libcamera/gen-py-controls.py
> index cf09c146084d..d43a7c1c7eab 100755
> --- a/src/py/libcamera/gen-py-controls.py
> +++ b/src/py/libcamera/gen-py-controls.py
> @@ -83,7 +83,7 @@ def main(argv):
>              vendors.append(vendor)
>  
>          for ctrl in data['controls']:
> -            ctrl = Control(*ctrl.popitem(), vendor)
> +            ctrl = Control(*ctrl.popitem(), vendor, args.mode)
>              controls.append(extend_control(ctrl, args.mode))
>  
>      data = {
> diff --git a/utils/codegen/controls.py b/utils/codegen/controls.py
> index 03c77cc64abe..602f15b25fb6 100644
> --- a/utils/codegen/controls.py
> +++ b/utils/codegen/controls.py
> @@ -28,7 +28,7 @@ class ControlEnum(object):
>  
>  
>  class Control(object):
> -    def __init__(self, name, data, vendor):
> +    def __init__(self, name, data, vendor, mode):
>          self.__name = name
>          self.__data = data
>          self.__enum_values = None
> @@ -60,6 +60,16 @@ class Control(object):
>  
>              self.__size = num_elems
>  
> +        if mode == 'properties':
> +            self.__direction = 'out'
> +        else:
> +            direction = self.__data.get('direction')
> +            if direction is None:
> +                raise RuntimeError(f'Control `{self.__name}` missing required field `{direction}`')
> +            if direction not in ['in', 'out', 'inout']:
> +                raise RuntimeError(f'Control `{self.__name}` direction `{direction}` is invalid; must be one of `in`, `out`, or `inout`')
> +            self.__direction = direction
> +
>      @property
>      def description(self):
>          """The control description"""
> @@ -111,6 +121,18 @@ class Control(object):
>          else:
>              return f"Span<const {typ}>"
>  
> +    @property
> +    def direction(self):
> +        in_flag = 'ControlId::Direction::In'
> +        out_flag = 'ControlId::Direction::Out'
> +
> +        if self.__direction == 'inout':
> +            return f'{in_flag} | {out_flag}'
> +        if self.__direction == 'in':
> +            return in_flag
> +        if self.__direction == 'out':
> +            return out_flag
> +
>      @property
>      def element_type(self):
>          return self.__data.get('type')
> diff --git a/utils/codegen/gen-controls.py b/utils/codegen/gen-controls.py
> index 3034e9a54760..59b716c1c48c 100755
> --- a/utils/codegen/gen-controls.py
> +++ b/utils/codegen/gen-controls.py
> @@ -71,7 +71,7 @@ def main(argv):
>          ctrls = controls.setdefault(vendor, [])
>  
>          for i, ctrl in enumerate(data['controls']):
> -            ctrl = Control(*ctrl.popitem(), vendor)
> +            ctrl = Control(*ctrl.popitem(), vendor, args.mode)
>              ctrls.append(extend_control(ctrl, i, ranges))
>  
>      # Sort the vendors by range numerical value
> diff --git a/utils/codegen/gen-gst-controls.py b/utils/codegen/gen-gst-controls.py
> index 2601a67588a3..df0988266294 100755
> --- a/utils/codegen/gen-gst-controls.py
> +++ b/utils/codegen/gen-gst-controls.py
> @@ -154,7 +154,7 @@ def main(argv):
>          ctrls = controls.setdefault(vendor, [])
>  
>          for ctrl in data['controls']:
> -            ctrl = Control(*ctrl.popitem(), vendor)
> +            ctrl = Control(*ctrl.popitem(), vendor, mode='controls')
>  
>              if ctrl.name in exposed_controls:
>                  ctrls.append(extend_control(ctrl))
> -- 
> 2.39.2
>
Kieran Bingham Dec. 6, 2024, 12:47 p.m. UTC | #2
Quoting Paul Elder (2024-11-29 09:19:14)
> In preparation for adding support for querying direction information
> from controls, parse the direction information from control ID
> definitions. This can later be plugged in directly to the IPA code
> generators simply by using ctrl.direction.
> 
> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> 
> ---
> Changes in v3:
> - minor reordering
> 
> Changes in v2:
> - prevent errors in parsing properties, since the direction field is now
>   required yet properties can only be out
>   - do this by expanding the Control constructor to take the mode
>     argument, so that needs to be passed in by the users of Control
> ---
>  src/py/libcamera/gen-py-controls.py |  2 +-
>  utils/codegen/controls.py           | 24 +++++++++++++++++++++++-
>  utils/codegen/gen-controls.py       |  2 +-
>  utils/codegen/gen-gst-controls.py   |  2 +-
>  4 files changed, 26 insertions(+), 4 deletions(-)
> 
> diff --git a/src/py/libcamera/gen-py-controls.py b/src/py/libcamera/gen-py-controls.py
> index cf09c146084d..d43a7c1c7eab 100755
> --- a/src/py/libcamera/gen-py-controls.py
> +++ b/src/py/libcamera/gen-py-controls.py
> @@ -83,7 +83,7 @@ def main(argv):
>              vendors.append(vendor)
>  
>          for ctrl in data['controls']:
> -            ctrl = Control(*ctrl.popitem(), vendor)
> +            ctrl = Control(*ctrl.popitem(), vendor, args.mode)
>              controls.append(extend_control(ctrl, args.mode))
>  
>      data = {
> diff --git a/utils/codegen/controls.py b/utils/codegen/controls.py
> index 03c77cc64abe..602f15b25fb6 100644
> --- a/utils/codegen/controls.py
> +++ b/utils/codegen/controls.py
> @@ -28,7 +28,7 @@ class ControlEnum(object):
>  
>  
>  class Control(object):
> -    def __init__(self, name, data, vendor):
> +    def __init__(self, name, data, vendor, mode):
>          self.__name = name
>          self.__data = data
>          self.__enum_values = None
> @@ -60,6 +60,16 @@ class Control(object):
>  
>              self.__size = num_elems
>  
> +        if mode == 'properties':
> +            self.__direction = 'out'
> +        else:
> +            direction = self.__data.get('direction')
> +            if direction is None:
> +                raise RuntimeError(f'Control `{self.__name}` missing required field `{direction}`')
> +            if direction not in ['in', 'out', 'inout']:
> +                raise RuntimeError(f'Control `{self.__name}` direction `{direction}` is invalid; must be one of `in`, `out`, or `inout`')
> +            self.__direction = direction
> +
>      @property
>      def description(self):
>          """The control description"""
> @@ -111,6 +121,18 @@ class Control(object):
>          else:
>              return f"Span<const {typ}>"
>  
> +    @property
> +    def direction(self):
> +        in_flag = 'ControlId::Direction::In'
> +        out_flag = 'ControlId::Direction::Out'

Does this work ? Are these the flags that are only introduced in the
next patch ?



> +
> +        if self.__direction == 'inout':
> +            return f'{in_flag} | {out_flag}'
> +        if self.__direction == 'in':
> +            return in_flag
> +        if self.__direction == 'out':
> +            return out_flag
> +
>      @property
>      def element_type(self):
>          return self.__data.get('type')
> diff --git a/utils/codegen/gen-controls.py b/utils/codegen/gen-controls.py
> index 3034e9a54760..59b716c1c48c 100755
> --- a/utils/codegen/gen-controls.py
> +++ b/utils/codegen/gen-controls.py
> @@ -71,7 +71,7 @@ def main(argv):
>          ctrls = controls.setdefault(vendor, [])
>  
>          for i, ctrl in enumerate(data['controls']):
> -            ctrl = Control(*ctrl.popitem(), vendor)
> +            ctrl = Control(*ctrl.popitem(), vendor, args.mode)
>              ctrls.append(extend_control(ctrl, i, ranges))
>  
>      # Sort the vendors by range numerical value
> diff --git a/utils/codegen/gen-gst-controls.py b/utils/codegen/gen-gst-controls.py
> index 2601a67588a3..df0988266294 100755
> --- a/utils/codegen/gen-gst-controls.py
> +++ b/utils/codegen/gen-gst-controls.py
> @@ -154,7 +154,7 @@ def main(argv):
>          ctrls = controls.setdefault(vendor, [])
>  
>          for ctrl in data['controls']:
> -            ctrl = Control(*ctrl.popitem(), vendor)
> +            ctrl = Control(*ctrl.popitem(), vendor, mode='controls')
>  
>              if ctrl.name in exposed_controls:
>                  ctrls.append(extend_control(ctrl))
> -- 
> 2.39.2
>
Laurent Pinchart Dec. 6, 2024, 1:16 p.m. UTC | #3
On Fri, Dec 06, 2024 at 12:47:30PM +0000, Kieran Bingham wrote:
> Quoting Paul Elder (2024-11-29 09:19:14)
> > In preparation for adding support for querying direction information
> > from controls, parse the direction information from control ID
> > definitions. This can later be plugged in directly to the IPA code
> > generators simply by using ctrl.direction.
> > 
> > Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > 
> > ---
> > Changes in v3:
> > - minor reordering
> > 
> > Changes in v2:
> > - prevent errors in parsing properties, since the direction field is now
> >   required yet properties can only be out
> >   - do this by expanding the Control constructor to take the mode
> >     argument, so that needs to be passed in by the users of Control
> > ---
> >  src/py/libcamera/gen-py-controls.py |  2 +-
> >  utils/codegen/controls.py           | 24 +++++++++++++++++++++++-
> >  utils/codegen/gen-controls.py       |  2 +-
> >  utils/codegen/gen-gst-controls.py   |  2 +-
> >  4 files changed, 26 insertions(+), 4 deletions(-)
> > 
> > diff --git a/src/py/libcamera/gen-py-controls.py b/src/py/libcamera/gen-py-controls.py
> > index cf09c146084d..d43a7c1c7eab 100755
> > --- a/src/py/libcamera/gen-py-controls.py
> > +++ b/src/py/libcamera/gen-py-controls.py
> > @@ -83,7 +83,7 @@ def main(argv):
> >              vendors.append(vendor)
> >  
> >          for ctrl in data['controls']:
> > -            ctrl = Control(*ctrl.popitem(), vendor)
> > +            ctrl = Control(*ctrl.popitem(), vendor, args.mode)
> >              controls.append(extend_control(ctrl, args.mode))
> >  
> >      data = {
> > diff --git a/utils/codegen/controls.py b/utils/codegen/controls.py
> > index 03c77cc64abe..602f15b25fb6 100644
> > --- a/utils/codegen/controls.py
> > +++ b/utils/codegen/controls.py
> > @@ -28,7 +28,7 @@ class ControlEnum(object):
> >  
> >  
> >  class Control(object):
> > -    def __init__(self, name, data, vendor):
> > +    def __init__(self, name, data, vendor, mode):
> >          self.__name = name
> >          self.__data = data
> >          self.__enum_values = None
> > @@ -60,6 +60,16 @@ class Control(object):
> >  
> >              self.__size = num_elems
> >  
> > +        if mode == 'properties':
> > +            self.__direction = 'out'
> > +        else:
> > +            direction = self.__data.get('direction')
> > +            if direction is None:
> > +                raise RuntimeError(f'Control `{self.__name}` missing required field `{direction}`')
> > +            if direction not in ['in', 'out', 'inout']:
> > +                raise RuntimeError(f'Control `{self.__name}` direction `{direction}` is invalid; must be one of `in`, `out`, or `inout`')
> > +            self.__direction = direction
> > +
> >      @property
> >      def description(self):
> >          """The control description"""
> > @@ -111,6 +121,18 @@ class Control(object):
> >          else:
> >              return f"Span<const {typ}>"
> >  
> > +    @property
> > +    def direction(self):
> > +        in_flag = 'ControlId::Direction::In'
> > +        out_flag = 'ControlId::Direction::Out'
> 
> Does this work ? Are these the flags that are only introduced in the
> next patch ?

As the template is only modified in the next patch, this patch alone
shouldn't cause any difference in the generated code.

> > +
> > +        if self.__direction == 'inout':
> > +            return f'{in_flag} | {out_flag}'
> > +        if self.__direction == 'in':
> > +            return in_flag
> > +        if self.__direction == 'out':
> > +            return out_flag
> > +
> >      @property
> >      def element_type(self):
> >          return self.__data.get('type')
> > diff --git a/utils/codegen/gen-controls.py b/utils/codegen/gen-controls.py
> > index 3034e9a54760..59b716c1c48c 100755
> > --- a/utils/codegen/gen-controls.py
> > +++ b/utils/codegen/gen-controls.py
> > @@ -71,7 +71,7 @@ def main(argv):
> >          ctrls = controls.setdefault(vendor, [])
> >  
> >          for i, ctrl in enumerate(data['controls']):
> > -            ctrl = Control(*ctrl.popitem(), vendor)
> > +            ctrl = Control(*ctrl.popitem(), vendor, args.mode)
> >              ctrls.append(extend_control(ctrl, i, ranges))
> >  
> >      # Sort the vendors by range numerical value
> > diff --git a/utils/codegen/gen-gst-controls.py b/utils/codegen/gen-gst-controls.py
> > index 2601a67588a3..df0988266294 100755
> > --- a/utils/codegen/gen-gst-controls.py
> > +++ b/utils/codegen/gen-gst-controls.py
> > @@ -154,7 +154,7 @@ def main(argv):
> >          ctrls = controls.setdefault(vendor, [])
> >  
> >          for ctrl in data['controls']:
> > -            ctrl = Control(*ctrl.popitem(), vendor)
> > +            ctrl = Control(*ctrl.popitem(), vendor, mode='controls')
> >  
> >              if ctrl.name in exposed_controls:
> >                  ctrls.append(extend_control(ctrl))
Kieran Bingham Dec. 6, 2024, 1:32 p.m. UTC | #4
Quoting Laurent Pinchart (2024-12-06 13:16:11)
> On Fri, Dec 06, 2024 at 12:47:30PM +0000, Kieran Bingham wrote:
> > Quoting Paul Elder (2024-11-29 09:19:14)
> > > In preparation for adding support for querying direction information
> > > from controls, parse the direction information from control ID
> > > definitions. This can later be plugged in directly to the IPA code
> > > generators simply by using ctrl.direction.
> > > 
> > > Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
> > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > > 
> > > ---
> > > Changes in v3:
> > > - minor reordering
> > > 
> > > Changes in v2:
> > > - prevent errors in parsing properties, since the direction field is now
> > >   required yet properties can only be out
> > >   - do this by expanding the Control constructor to take the mode
> > >     argument, so that needs to be passed in by the users of Control
> > > ---
> > >  src/py/libcamera/gen-py-controls.py |  2 +-
> > >  utils/codegen/controls.py           | 24 +++++++++++++++++++++++-
> > >  utils/codegen/gen-controls.py       |  2 +-
> > >  utils/codegen/gen-gst-controls.py   |  2 +-
> > >  4 files changed, 26 insertions(+), 4 deletions(-)
> > > 
> > > diff --git a/src/py/libcamera/gen-py-controls.py b/src/py/libcamera/gen-py-controls.py
> > > index cf09c146084d..d43a7c1c7eab 100755
> > > --- a/src/py/libcamera/gen-py-controls.py
> > > +++ b/src/py/libcamera/gen-py-controls.py
> > > @@ -83,7 +83,7 @@ def main(argv):
> > >              vendors.append(vendor)
> > >  
> > >          for ctrl in data['controls']:
> > > -            ctrl = Control(*ctrl.popitem(), vendor)
> > > +            ctrl = Control(*ctrl.popitem(), vendor, args.mode)
> > >              controls.append(extend_control(ctrl, args.mode))
> > >  
> > >      data = {
> > > diff --git a/utils/codegen/controls.py b/utils/codegen/controls.py
> > > index 03c77cc64abe..602f15b25fb6 100644
> > > --- a/utils/codegen/controls.py
> > > +++ b/utils/codegen/controls.py
> > > @@ -28,7 +28,7 @@ class ControlEnum(object):
> > >  
> > >  
> > >  class Control(object):
> > > -    def __init__(self, name, data, vendor):
> > > +    def __init__(self, name, data, vendor, mode):
> > >          self.__name = name
> > >          self.__data = data
> > >          self.__enum_values = None
> > > @@ -60,6 +60,16 @@ class Control(object):
> > >  
> > >              self.__size = num_elems
> > >  
> > > +        if mode == 'properties':
> > > +            self.__direction = 'out'
> > > +        else:
> > > +            direction = self.__data.get('direction')
> > > +            if direction is None:
> > > +                raise RuntimeError(f'Control `{self.__name}` missing required field `{direction}`')
> > > +            if direction not in ['in', 'out', 'inout']:
> > > +                raise RuntimeError(f'Control `{self.__name}` direction `{direction}` is invalid; must be one of `in`, `out`, or `inout`')
> > > +            self.__direction = direction
> > > +
> > >      @property
> > >      def description(self):
> > >          """The control description"""
> > > @@ -111,6 +121,18 @@ class Control(object):
> > >          else:
> > >              return f"Span<const {typ}>"
> > >  
> > > +    @property
> > > +    def direction(self):
> > > +        in_flag = 'ControlId::Direction::In'
> > > +        out_flag = 'ControlId::Direction::Out'
> > 
> > Does this work ? Are these the flags that are only introduced in the
> > next patch ?
> 
> As the template is only modified in the next patch, this patch alone
> shouldn't cause any difference in the generated code.

Ok, thanks - well the already given tag still stands then.
--
Kieran

> 
> > > +
> > > +        if self.__direction == 'inout':
> > > +            return f'{in_flag} | {out_flag}'
> > > +        if self.__direction == 'in':
> > > +            return in_flag
> > > +        if self.__direction == 'out':
> > > +            return out_flag
> > > +
> > >      @property
> > >      def element_type(self):
> > >          return self.__data.get('type')
> > > diff --git a/utils/codegen/gen-controls.py b/utils/codegen/gen-controls.py
> > > index 3034e9a54760..59b716c1c48c 100755
> > > --- a/utils/codegen/gen-controls.py
> > > +++ b/utils/codegen/gen-controls.py
> > > @@ -71,7 +71,7 @@ def main(argv):
> > >          ctrls = controls.setdefault(vendor, [])
> > >  
> > >          for i, ctrl in enumerate(data['controls']):
> > > -            ctrl = Control(*ctrl.popitem(), vendor)
> > > +            ctrl = Control(*ctrl.popitem(), vendor, args.mode)
> > >              ctrls.append(extend_control(ctrl, i, ranges))
> > >  
> > >      # Sort the vendors by range numerical value
> > > diff --git a/utils/codegen/gen-gst-controls.py b/utils/codegen/gen-gst-controls.py
> > > index 2601a67588a3..df0988266294 100755
> > > --- a/utils/codegen/gen-gst-controls.py
> > > +++ b/utils/codegen/gen-gst-controls.py
> > > @@ -154,7 +154,7 @@ def main(argv):
> > >          ctrls = controls.setdefault(vendor, [])
> > >  
> > >          for ctrl in data['controls']:
> > > -            ctrl = Control(*ctrl.popitem(), vendor)
> > > +            ctrl = Control(*ctrl.popitem(), vendor, mode='controls')
> > >  
> > >              if ctrl.name in exposed_controls:
> > >                  ctrls.append(extend_control(ctrl))
> 
> -- 
> Regards,
> 
> Laurent Pinchart

Patch
diff mbox series

diff --git a/src/py/libcamera/gen-py-controls.py b/src/py/libcamera/gen-py-controls.py
index cf09c146084d..d43a7c1c7eab 100755
--- a/src/py/libcamera/gen-py-controls.py
+++ b/src/py/libcamera/gen-py-controls.py
@@ -83,7 +83,7 @@  def main(argv):
             vendors.append(vendor)
 
         for ctrl in data['controls']:
-            ctrl = Control(*ctrl.popitem(), vendor)
+            ctrl = Control(*ctrl.popitem(), vendor, args.mode)
             controls.append(extend_control(ctrl, args.mode))
 
     data = {
diff --git a/utils/codegen/controls.py b/utils/codegen/controls.py
index 03c77cc64abe..602f15b25fb6 100644
--- a/utils/codegen/controls.py
+++ b/utils/codegen/controls.py
@@ -28,7 +28,7 @@  class ControlEnum(object):
 
 
 class Control(object):
-    def __init__(self, name, data, vendor):
+    def __init__(self, name, data, vendor, mode):
         self.__name = name
         self.__data = data
         self.__enum_values = None
@@ -60,6 +60,16 @@  class Control(object):
 
             self.__size = num_elems
 
+        if mode == 'properties':
+            self.__direction = 'out'
+        else:
+            direction = self.__data.get('direction')
+            if direction is None:
+                raise RuntimeError(f'Control `{self.__name}` missing required field `{direction}`')
+            if direction not in ['in', 'out', 'inout']:
+                raise RuntimeError(f'Control `{self.__name}` direction `{direction}` is invalid; must be one of `in`, `out`, or `inout`')
+            self.__direction = direction
+
     @property
     def description(self):
         """The control description"""
@@ -111,6 +121,18 @@  class Control(object):
         else:
             return f"Span<const {typ}>"
 
+    @property
+    def direction(self):
+        in_flag = 'ControlId::Direction::In'
+        out_flag = 'ControlId::Direction::Out'
+
+        if self.__direction == 'inout':
+            return f'{in_flag} | {out_flag}'
+        if self.__direction == 'in':
+            return in_flag
+        if self.__direction == 'out':
+            return out_flag
+
     @property
     def element_type(self):
         return self.__data.get('type')
diff --git a/utils/codegen/gen-controls.py b/utils/codegen/gen-controls.py
index 3034e9a54760..59b716c1c48c 100755
--- a/utils/codegen/gen-controls.py
+++ b/utils/codegen/gen-controls.py
@@ -71,7 +71,7 @@  def main(argv):
         ctrls = controls.setdefault(vendor, [])
 
         for i, ctrl in enumerate(data['controls']):
-            ctrl = Control(*ctrl.popitem(), vendor)
+            ctrl = Control(*ctrl.popitem(), vendor, args.mode)
             ctrls.append(extend_control(ctrl, i, ranges))
 
     # Sort the vendors by range numerical value
diff --git a/utils/codegen/gen-gst-controls.py b/utils/codegen/gen-gst-controls.py
index 2601a67588a3..df0988266294 100755
--- a/utils/codegen/gen-gst-controls.py
+++ b/utils/codegen/gen-gst-controls.py
@@ -154,7 +154,7 @@  def main(argv):
         ctrls = controls.setdefault(vendor, [])
 
         for ctrl in data['controls']:
-            ctrl = Control(*ctrl.popitem(), vendor)
+            ctrl = Control(*ctrl.popitem(), vendor, mode='controls')
 
             if ctrl.name in exposed_controls:
                 ctrls.append(extend_control(ctrl))