linux-omap 2.6.37: sync with OE .dev
[glsdk/meta-ti-glsdk.git] / recipes-bsp / linux / linux-omap / media / 0029-v4l-v4l2_subdev-userspace-frame-interval-API.patch
1 From b137f96a198afb39c8457e2c5d28c1c4bca129a3 Mon Sep 17 00:00:00 2001
2 From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
3 Date: Wed, 5 May 2010 16:38:35 +0200
4 Subject: [PATCH 29/43] v4l: v4l2_subdev userspace frame interval API
6 The three new ioctl VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL,
7 VIDIOC_SUBDEV_G_FRAME_INTERVAL and VIDIOC_SUBDEV_S_FRAME_INTERVAL can be
8 used to enumerate and configure a subdev's frame rate from userspace.
10 Two new video::g/s_frame_interval subdev operations are introduced to
11 support those ioctls. The existing video::g/s_parm operations are
12 deprecated and shouldn't be used anymore.
14 Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
15 Signed-off-by: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com>
16 ---
17  Documentation/DocBook/media-entities.tmpl          |    6 +
18  Documentation/DocBook/v4l/v4l2.xml                 |    2 +
19  .../v4l/vidioc-subdev-enum-frame-interval.xml      |  146 ++++++++++++++++++++
20  .../DocBook/v4l/vidioc-subdev-g-frame-interval.xml |  135 ++++++++++++++++++
21  drivers/media/video/v4l2-subdev.c                  |   16 ++
22  include/linux/v4l2-subdev.h                        |   36 +++++
23  include/media/v4l2-subdev.h                        |    7 +
24  7 files changed, 348 insertions(+), 0 deletions(-)
25  create mode 100644 Documentation/DocBook/v4l/vidioc-subdev-enum-frame-interval.xml
26  create mode 100644 Documentation/DocBook/v4l/vidioc-subdev-g-frame-interval.xml
28 diff --git a/Documentation/DocBook/media-entities.tmpl b/Documentation/DocBook/media-entities.tmpl
29 index 538f8fe..4af3c2e 100644
30 --- a/Documentation/DocBook/media-entities.tmpl
31 +++ b/Documentation/DocBook/media-entities.tmpl
32 @@ -89,7 +89,9 @@
33  <!ENTITY VIDIOC-SUBDEV-ENUM-FRAME-SIZE "<link linkend='vidioc-subdev-enum-frame-size'><constant>VIDIOC_SUBDEV_ENUM_FRAME_SIZE</constant></link>">
34  <!ENTITY VIDIOC-SUBDEV-ENUM-MBUS-CODE "<link linkend='vidioc-subdev-enum-mbus-code'><constant>VIDIOC_SUBDEV_ENUM_MBUS_CODE</constant></link>">
35  <!ENTITY VIDIOC-SUBDEV-G-FMT "<link linkend='vidioc-subdev-g-fmt'><constant>VIDIOC_SUBDEV_G_FMT</constant></link>">
36 +<!ENTITY VIDIOC-SUBDEV-G-FRAME-INTERVAL "<link linkend='vidioc-subdev-g-frame-interval'><constant>VIDIOC_SUBDEV_G_FRAME_INTERVAL</constant></link>">
37  <!ENTITY VIDIOC-SUBDEV-S-FMT "<link linkend='vidioc-subdev-g-fmt'><constant>VIDIOC_SUBDEV_S_FMT</constant></link>">
38 +<!ENTITY VIDIOC-SUBDEV-S-FRAME-INTERVAL "<link linkend='vidioc-subdev-g-frame-interval'><constant>VIDIOC_SUBDEV_S_FRAME_INTERVAL</constant></link>">
39  <!ENTITY VIDIOC-TRY-ENCODER-CMD "<link linkend='vidioc-encoder-cmd'><constant>VIDIOC_TRY_ENCODER_CMD</constant></link>">
40  <!ENTITY VIDIOC-TRY-EXT-CTRLS "<link linkend='vidioc-g-ext-ctrls'><constant>VIDIOC_TRY_EXT_CTRLS</constant></link>">
41  <!ENTITY VIDIOC-TRY-FMT "<link linkend='vidioc-g-fmt'><constant>VIDIOC_TRY_FMT</constant></link>">
42 @@ -190,6 +192,8 @@
43  <!ENTITY v4l2-sliced-vbi-cap "struct&nbsp;<link linkend='v4l2-sliced-vbi-cap'>v4l2_sliced_vbi_cap</link>">
44  <!ENTITY v4l2-sliced-vbi-data "struct&nbsp;<link linkend='v4l2-sliced-vbi-data'>v4l2_sliced_vbi_data</link>">
45  <!ENTITY v4l2-sliced-vbi-format "struct&nbsp;<link linkend='v4l2-sliced-vbi-format'>v4l2_sliced_vbi_format</link>">
46 +<!ENTITY v4l2-subdev-frame-interval "struct&nbsp;<link linkend='v4l2-subdev-frame-interval'>v4l2_subdev_frame_interval</link>">
47 +<!ENTITY v4l2-subdev-frame-interval-enum "struct&nbsp;<link linkend='v4l2-subdev-frame-interval-enum'>v4l2_subdev_frame_interval_enum</link>">
48  <!ENTITY v4l2-subdev-frame-size-enum "struct&nbsp;<link linkend='v4l2-subdev-frame-size-enum'>v4l2_subdev_frame_size_enum</link>">
49  <!ENTITY v4l2-subdev-format "struct&nbsp;<link linkend='v4l2-subdev-format'>v4l2_subdev_format</link>">
50  <!ENTITY v4l2-subdev-mbus-code-enum "struct&nbsp;<link linkend='v4l2-subdev-mbus-code-enum'>v4l2_subdev_mbus_code_enum</link>">
51 @@ -325,10 +329,12 @@
52  <!ENTITY sub-reqbufs SYSTEM "v4l/vidioc-reqbufs.xml">
53  <!ENTITY sub-s-hw-freq-seek SYSTEM "v4l/vidioc-s-hw-freq-seek.xml">
54  <!ENTITY sub-streamon SYSTEM "v4l/vidioc-streamon.xml">
55 +<!ENTITY sub-subdev-enum-frame-interval SYSTEM "v4l/vidioc-subdev-enum-frame-interval.xml">
56  <!ENTITY sub-subdev-enum-frame-size SYSTEM "v4l/vidioc-subdev-enum-frame-size.xml">
57  <!ENTITY sub-subdev-enum-mbus-code SYSTEM "v4l/vidioc-subdev-enum-mbus-code.xml">
58  <!ENTITY sub-subdev-formats SYSTEM "v4l/subdev-formats.xml">
59  <!ENTITY sub-subdev-g-fmt SYSTEM "v4l/vidioc-subdev-g-fmt.xml">
60 +<!ENTITY sub-subdev-g-frame-interval SYSTEM "v4l/vidioc-subdev-g-frame-interval.xml">
61  <!ENTITY sub-capture-c SYSTEM "v4l/capture.c.xml">
62  <!ENTITY sub-keytable-c SYSTEM "v4l/keytable.c.xml">
63  <!ENTITY sub-v4l2grab-c SYSTEM "v4l/v4l2grab.c.xml">
64 diff --git a/Documentation/DocBook/v4l/v4l2.xml b/Documentation/DocBook/v4l/v4l2.xml
65 index 695e3bf..e6225e0 100644
66 --- a/Documentation/DocBook/v4l/v4l2.xml
67 +++ b/Documentation/DocBook/v4l/v4l2.xml
68 @@ -478,9 +478,11 @@ and discussions on the V4L mailing list.</revremark>
69      &sub-reqbufs;
70      &sub-s-hw-freq-seek;
71      &sub-streamon;
72 +    &sub-subdev-enum-frame-interval;
73      &sub-subdev-enum-frame-size;
74      &sub-subdev-enum-mbus-code;
75      &sub-subdev-g-fmt;
76 +    &sub-subdev-g-frame-interval;
77      &sub-subscribe-event;
78      <!-- End of ioctls. -->
79      &sub-mmap;
80 diff --git a/Documentation/DocBook/v4l/vidioc-subdev-enum-frame-interval.xml b/Documentation/DocBook/v4l/vidioc-subdev-enum-frame-interval.xml
81 new file mode 100644
82 index 0000000..bcea9d4
83 --- /dev/null
84 +++ b/Documentation/DocBook/v4l/vidioc-subdev-enum-frame-interval.xml
85 @@ -0,0 +1,146 @@
86 +<refentry id="vidioc-subdev-enum-frame-interval">
87 +  <refmeta>
88 +    <refentrytitle>ioctl VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL</refentrytitle>
89 +    &manvol;
90 +  </refmeta>
91 +
92 +  <refnamediv>
93 +    <refname>VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL</refname>
94 +    <refpurpose>Enumerate frame intervals</refpurpose>
95 +  </refnamediv>
96 +
97 +  <refsynopsisdiv>
98 +    <funcsynopsis>
99 +      <funcprototype>
100 +       <funcdef>int <function>ioctl</function></funcdef>
101 +       <paramdef>int <parameter>fd</parameter></paramdef>
102 +       <paramdef>int <parameter>request</parameter></paramdef>
103 +       <paramdef>struct v4l2_subdev_frame_interval_enum *
104 +       <parameter>argp</parameter></paramdef>
105 +      </funcprototype>
106 +    </funcsynopsis>
107 +  </refsynopsisdiv>
109 +  <refsect1>
110 +    <title>Arguments</title>
112 +    <variablelist>
113 +      <varlistentry>
114 +       <term><parameter>fd</parameter></term>
115 +       <listitem>
116 +         <para>&fd;</para>
117 +       </listitem>
118 +      </varlistentry>
119 +      <varlistentry>
120 +       <term><parameter>request</parameter></term>
121 +       <listitem>
122 +         <para>VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL</para>
123 +       </listitem>
124 +      </varlistentry>
125 +      <varlistentry>
126 +       <term><parameter>argp</parameter></term>
127 +       <listitem>
128 +         <para></para>
129 +       </listitem>
130 +      </varlistentry>
131 +    </variablelist>
132 +  </refsect1>
134 +  <refsect1>
135 +    <title>Description</title>
137 +    <para>This ioctl lets applications enumerate available frame intervals on a
138 +    given sub-device pad. Frame intervals only makes sense for sub-devices that
139 +    can control the frame period on their own. This includes, for instance,
140 +    image sensors and TV tuners.</para>
142 +    <para>For the common use case of image sensors, the frame intervals
143 +    available on the sub-device output pad depend on the frame format and size
144 +    on the same pad. Applications must thus specify the desired format and size
145 +    when enumerating frame intervals.</para>
147 +    <para>To enumerate frame intervals applications initialize the
148 +    <structfield>index</structfield>, <structfield>pad</structfield>,
149 +    <structfield>code</structfield>, <structfield>width</structfield> and
150 +    <structfield>height</structfield> fields of
151 +    &v4l2-subdev-frame-interval-enum; and call the
152 +    <constant>VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL</constant> ioctl with a pointer
153 +    to this structure. Drivers fill the rest of the structure or return
154 +    an &EINVAL; if one of the input fields is invalid. All frame intervals are
155 +    enumerable by beginning at index zero and incrementing by one until
156 +    <errorcode>EINVAL</errorcode> is returned.</para>
158 +    <para>Available frame intervals may depend on the current 'try' formats
159 +    at other pads of the sub-device, as well as on the current active links. See
160 +    &VIDIOC-SUBDEV-G-FMT; for more information about the try formats.</para>
162 +    <para>Sub-devices that support the frame interval enumeration ioctl should
163 +    implemented it on a single pad only. Its behaviour when supported on
164 +    multiple pads of the same sub-device is not defined.</para>
166 +    <table pgwide="1" frame="none" id="v4l2-subdev-frame-interval-enum">
167 +      <title>struct <structname>v4l2_subdev_frame_interval_enum</structname></title>
168 +      <tgroup cols="3">
169 +       &cs-str;
170 +       <tbody valign="top">
171 +         <row>
172 +           <entry>__u32</entry>
173 +           <entry><structfield>index</structfield></entry>
174 +           <entry>Number of the format in the enumeration, set by the
175 +           application.</entry>
176 +         </row>
177 +         <row>
178 +           <entry>__u32</entry>
179 +           <entry><structfield>pad</structfield></entry>
180 +           <entry>Pad number as reported by the media controller API.</entry>
181 +         </row>
182 +         <row>
183 +           <entry>__u32</entry>
184 +           <entry><structfield>code</structfield></entry>
185 +           <entry>The media bus format code, as defined in
186 +           <xref linkend="v4l2-mbus-format" />.</entry>
187 +         </row>
188 +         <row>
189 +           <entry>__u32</entry>
190 +           <entry><structfield>width</structfield></entry>
191 +           <entry>Frame width, in pixels.</entry>
192 +         </row>
193 +         <row>
194 +           <entry>__u32</entry>
195 +           <entry><structfield>height</structfield></entry>
196 +           <entry>Frame height, in pixels.</entry>
197 +         </row>
198 +         <row>
199 +           <entry>&v4l2-fract;</entry>
200 +           <entry><structfield>interval</structfield></entry>
201 +           <entry>Period, in seconds, between consecutive video frames.</entry>
202 +         </row>
203 +         <row>
204 +           <entry>__u32</entry>
205 +           <entry><structfield>reserved</structfield>[9]</entry>
206 +           <entry>Reserved for future extensions. Applications and drivers must
207 +           set the array to zero.</entry>
208 +         </row>
209 +       </tbody>
210 +      </tgroup>
211 +    </table>
212 +  </refsect1>
214 +  <refsect1>
215 +    &return-value;
217 +    <variablelist>
218 +      <varlistentry>
219 +       <term><errorcode>EINVAL</errorcode></term>
220 +       <listitem>
221 +         <para>The &v4l2-subdev-frame-interval-enum;
222 +         <structfield>pad</structfield> references a non-existing pad, one of
223 +         the <structfield>code</structfield>, <structfield>width</structfield>
224 +         or <structfield>height</structfield> fields are invalid for the given
225 +         pad or the <structfield>index</structfield> field is out of bounds.
226 +         </para>
227 +       </listitem>
228 +      </varlistentry>
229 +    </variablelist>
230 +  </refsect1>
231 +</refentry>
232 diff --git a/Documentation/DocBook/v4l/vidioc-subdev-g-frame-interval.xml b/Documentation/DocBook/v4l/vidioc-subdev-g-frame-interval.xml
233 new file mode 100644
234 index 0000000..848ec78
235 --- /dev/null
236 +++ b/Documentation/DocBook/v4l/vidioc-subdev-g-frame-interval.xml
237 @@ -0,0 +1,135 @@
238 +<refentry id="vidioc-subdev-g-frame-interval">
239 +  <refmeta>
240 +    <refentrytitle>ioctl VIDIOC_SUBDEV_G_FRAME_INTERVAL, VIDIOC_SUBDEV_S_FRAME_INTERVAL</refentrytitle>
241 +    &manvol;
242 +  </refmeta>
244 +  <refnamediv>
245 +    <refname>VIDIOC_SUBDEV_G_FRAME_INTERVAL</refname>
246 +    <refname>VIDIOC_SUBDEV_S_FRAME_INTERVAL</refname>
247 +    <refpurpose>Get or set the frame interval on a subdev pad</refpurpose>
248 +  </refnamediv>
250 +  <refsynopsisdiv>
251 +    <funcsynopsis>
252 +      <funcprototype>
253 +       <funcdef>int <function>ioctl</function></funcdef>
254 +       <paramdef>int <parameter>fd</parameter></paramdef>
255 +       <paramdef>int <parameter>request</parameter></paramdef>
256 +       <paramdef>struct v4l2_subdev_frame_interval *<parameter>argp</parameter>
257 +       </paramdef>
258 +      </funcprototype>
259 +    </funcsynopsis>
260 +  </refsynopsisdiv>
262 +  <refsect1>
263 +    <title>Arguments</title>
265 +    <variablelist>
266 +      <varlistentry>
267 +       <term><parameter>fd</parameter></term>
268 +       <listitem>
269 +         <para>&fd;</para>
270 +       </listitem>
271 +      </varlistentry>
272 +      <varlistentry>
273 +       <term><parameter>request</parameter></term>
274 +       <listitem>
275 +         <para>VIDIOC_SUBDEV_G_FRAME_INTERVAL, VIDIOC_SUBDEV_S_FRAME_INTERVAL</para>
276 +       </listitem>
277 +      </varlistentry>
278 +      <varlistentry>
279 +       <term><parameter>argp</parameter></term>
280 +       <listitem>
281 +         <para></para>
282 +       </listitem>
283 +      </varlistentry>
284 +    </variablelist>
285 +  </refsect1>
287 +  <refsect1>
288 +    <title>Description</title>
290 +    <para>These ioctls are used to get and set the frame interval at specific
291 +    subdev pads in the image pipeline. The frame interval only makes sense for
292 +    sub-devices that can control the frame period on their own. This includes,
293 +    for instance, image sensors and TV tuners. Sub-devices that don't support
294 +    frame intervals must not implement these ioctls.</para>
296 +    <para>To retrieve the current frame interval applications set the
297 +    <structfield>pad</structfield> field of a &v4l2-subdev-frame-interval; to
298 +    the desired pad number as reported by the media controller API. When they
299 +    call the <constant>VIDIOC_SUBDEV_G_FRAME_INTERVAL</constant> ioctl with a
300 +    pointer to this structure the driver fills the members of the
301 +    <structfield>interval</structfield> field.</para>
303 +    <para>To change the current frame interval applications set both the
304 +    <structfield>pad</structfield> field and all members of the
305 +    <structfield>interval</structfield> field. When they call the
306 +    <constant>VIDIOC_SUBDEV_S_FRAME_INTERVAL</constant> ioctl with a pointer to
307 +    this structure the driver verifies the requested interval, adjusts it based
308 +    on the hardware capabilities and configures the device. Upon return the
309 +    &v4l2-subdev-frame-interval; contains the current frame interval as would be
310 +    returned by a <constant>VIDIOC_SUBDEV_G_FRAME_INTERVAL</constant> call.
311 +    </para>
313 +    <para>Drivers must not return an error solely because the requested interval
314 +    doesn't match the device capabilities. They must instead modify the interval
315 +    to match what the hardware can provide. The modified interval should be as
316 +    close as possible to the original request.</para>
318 +    <para>Sub-devices that support the frame interval ioctls should implement
319 +    them on a single pad only. Their behaviour when supported on multiple pads
320 +    of the same sub-device is not defined.</para>
322 +    <table pgwide="1" frame="none" id="v4l2-subdev-frame-interval">
323 +      <title>struct <structname>v4l2_subdev_frame_interval</structname></title>
324 +      <tgroup cols="3">
325 +        &cs-str;
326 +       <tbody valign="top">
327 +         <row>
328 +           <entry>__u32</entry>
329 +           <entry><structfield>pad</structfield></entry>
330 +           <entry>Pad number as reported by the media controller API.</entry>
331 +         </row>
332 +         <row>
333 +           <entry>&v4l2-fract;</entry>
334 +           <entry><structfield>interval</structfield></entry>
335 +           <entry>Period, in seconds, between consecutive video frames.</entry>
336 +         </row>
337 +         <row>
338 +           <entry>__u32</entry>
339 +           <entry><structfield>reserved</structfield>[9]</entry>
340 +           <entry>Reserved for future extensions. Applications and drivers must
341 +           set the array to zero.</entry>
342 +         </row>
343 +       </tbody>
344 +      </tgroup>
345 +    </table>
346 +  </refsect1>
348 +  <refsect1>
349 +    &return-value;
351 +    <variablelist>
352 +      <varlistentry>
353 +       <term><errorcode>EBUSY</errorcode></term>
354 +       <listitem>
355 +         <para>The frame interval can't be changed because the pad is currently
356 +         busy. This can be caused, for instance, by an active video stream on
357 +         the pad. The ioctl must not be retried without performing another
358 +         action to fix the problem first. Only returned by
359 +         <constant>VIDIOC_SUBDEV_S_FRAME_INTERVAL</constant></para>
360 +       </listitem>
361 +      </varlistentry>
362 +      <varlistentry>
363 +       <term><errorcode>EINVAL</errorcode></term>
364 +       <listitem>
365 +         <para>The &v4l2-subdev-frame-interval; <structfield>pad</structfield>
366 +         references a non-existing pad, or the pad doesn't support frame
367 +         intervals.</para>
368 +       </listitem>
369 +      </varlistentry>
370 +    </variablelist>
371 +  </refsect1>
372 +</refentry>
373 diff --git a/drivers/media/video/v4l2-subdev.c b/drivers/media/video/v4l2-subdev.c
374 index 73aae00..316a08a 100644
375 --- a/drivers/media/video/v4l2-subdev.c
376 +++ b/drivers/media/video/v4l2-subdev.c
377 @@ -232,6 +232,22 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)
378                 return v4l2_subdev_call(sd, pad, enum_frame_size, subdev_fh,
379                                         fse);
380         }
382 +       case VIDIOC_SUBDEV_G_FRAME_INTERVAL:
383 +               return v4l2_subdev_call(sd, video, g_frame_interval, arg);
385 +       case VIDIOC_SUBDEV_S_FRAME_INTERVAL:
386 +               return v4l2_subdev_call(sd, video, s_frame_interval, arg);
388 +       case VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL: {
389 +               struct v4l2_subdev_frame_interval_enum *fie = arg;
391 +               if (fie->pad >= sd->entity.num_pads)
392 +                       return -EINVAL;
394 +               return v4l2_subdev_call(sd, pad, enum_frame_interval, subdev_fh,
395 +                                       fie);
396 +       }
397  #endif
398         default:
399                 return -ENOIOCTLCMD;
400 diff --git a/include/linux/v4l2-subdev.h b/include/linux/v4l2-subdev.h
401 index 38d0eda..bf9f3e9 100644
402 --- a/include/linux/v4l2-subdev.h
403 +++ b/include/linux/v4l2-subdev.h
404 @@ -80,11 +80,47 @@ struct v4l2_subdev_frame_size_enum {
405         __u32 reserved[9];
406  };
407  
408 +/**
409 + * struct v4l2_subdev_frame_interval - Pad-level frame rate
410 + * @pad: pad number, as reported by the media API
411 + * @interval: frame interval in seconds
412 + */
413 +struct v4l2_subdev_frame_interval {
414 +       __u32 pad;
415 +       struct v4l2_fract interval;
416 +       __u32 reserved[9];
417 +};
419 +/**
420 + * struct v4l2_subdev_frame_interval_enum - Frame interval enumeration
421 + * @pad: pad number, as reported by the media API
422 + * @index: frame interval index during enumeration
423 + * @code: format code (from enum v4l2_mbus_pixelcode)
424 + * @width: frame width in pixels
425 + * @height: frame height in pixels
426 + * @interval: frame interval in seconds
427 + */
428 +struct v4l2_subdev_frame_interval_enum {
429 +       __u32 index;
430 +       __u32 pad;
431 +       __u32 code;
432 +       __u32 width;
433 +       __u32 height;
434 +       struct v4l2_fract interval;
435 +       __u32 reserved[9];
436 +};
438  #define VIDIOC_SUBDEV_G_FMT    _IOWR('V',  4, struct v4l2_subdev_format)
439  #define VIDIOC_SUBDEV_S_FMT    _IOWR('V',  5, struct v4l2_subdev_format)
440 +#define VIDIOC_SUBDEV_G_FRAME_INTERVAL \
441 +                       _IOWR('V', 21, struct v4l2_subdev_frame_interval)
442 +#define VIDIOC_SUBDEV_S_FRAME_INTERVAL \
443 +                       _IOWR('V', 22, struct v4l2_subdev_frame_interval)
444  #define VIDIOC_SUBDEV_ENUM_MBUS_CODE \
445                         _IOWR('V',  2, struct v4l2_subdev_mbus_code_enum)
446  #define VIDIOC_SUBDEV_ENUM_FRAME_SIZE \
447                         _IOWR('V', 74, struct v4l2_subdev_frame_size_enum)
448 +#define VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL \
449 +                       _IOWR('V', 75, struct v4l2_subdev_frame_interval_enum)
450  
451  #endif
452 diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h
453 index f5611c2..9c8bcd3 100644
454 --- a/include/media/v4l2-subdev.h
455 +++ b/include/media/v4l2-subdev.h
456 @@ -281,6 +281,10 @@ struct v4l2_subdev_video_ops {
457         int (*s_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop);
458         int (*g_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param);
459         int (*s_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param);
460 +       int (*g_frame_interval)(struct v4l2_subdev *sd,
461 +                               struct v4l2_subdev_frame_interval *interval);
462 +       int (*s_frame_interval)(struct v4l2_subdev *sd,
463 +                               struct v4l2_subdev_frame_interval *interval);
464         int (*enum_framesizes)(struct v4l2_subdev *sd, struct v4l2_frmsizeenum *fsize);
465         int (*enum_frameintervals)(struct v4l2_subdev *sd, struct v4l2_frmivalenum *fival);
466         int (*enum_dv_presets) (struct v4l2_subdev *sd,
467 @@ -431,6 +435,9 @@ struct v4l2_subdev_pad_ops {
468         int (*enum_frame_size)(struct v4l2_subdev *sd,
469                                struct v4l2_subdev_fh *fh,
470                                struct v4l2_subdev_frame_size_enum *fse);
471 +       int (*enum_frame_interval)(struct v4l2_subdev *sd,
472 +                                  struct v4l2_subdev_fh *fh,
473 +                                  struct v4l2_subdev_frame_interval_enum *fie);
474         int (*get_fmt)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
475                        struct v4l2_subdev_format *format);
476         int (*set_fmt)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
477 -- 
478 1.6.6.1