linux-omap 2.6.37: sync with OE .dev
[glsdk/meta-ti-glsdk.git] / recipes-bsp / linux / linux-omap / media / 0013-media-Media-device-information-query.patch
1 From cb6936ced565e168ac7f9be06dc3320733aac17f Mon Sep 17 00:00:00 2001
2 From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
3 Date: Wed, 18 Aug 2010 16:41:22 +0200
4 Subject: [PATCH 13/43] media: Media device information query
6 Create the following ioctl and implement it at the media device level to
7 query device information.
9 - MEDIA_IOC_DEVICE_INFO: Query media device information
11 The ioctl and its data structure are defined in the new kernel header
12 linux/media.h available to userspace applications.
14 Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
15 ---
16  Documentation/DocBook/media-entities.tmpl          |   12 ++
17  Documentation/DocBook/v4l/media-controller.xml     |   10 ++
18  Documentation/DocBook/v4l/media-func-close.xml     |   59 +++++++++
19  Documentation/DocBook/v4l/media-func-ioctl.xml     |  116 +++++++++++++++++
20  Documentation/DocBook/v4l/media-func-open.xml      |   94 ++++++++++++++
21  .../DocBook/v4l/media-ioc-device-info.xml          |  132 ++++++++++++++++++++
22  drivers/media/media-device.c                       |   57 +++++++++
23  include/linux/Kbuild                               |    1 +
24  include/linux/media.h                              |   45 +++++++
25  9 files changed, 526 insertions(+), 0 deletions(-)
26  create mode 100644 Documentation/DocBook/v4l/media-func-close.xml
27  create mode 100644 Documentation/DocBook/v4l/media-func-ioctl.xml
28  create mode 100644 Documentation/DocBook/v4l/media-func-open.xml
29  create mode 100644 Documentation/DocBook/v4l/media-ioc-device-info.xml
30  create mode 100644 include/linux/media.h
32 diff --git a/Documentation/DocBook/media-entities.tmpl b/Documentation/DocBook/media-entities.tmpl
33 index 61d6f11..6af3375 100644
34 --- a/Documentation/DocBook/media-entities.tmpl
35 +++ b/Documentation/DocBook/media-entities.tmpl
36 @@ -11,6 +11,10 @@
37  <!ENTITY func-select "<link linkend='func-select'><function>select()</function></link>">
38  <!ENTITY func-write "<link linkend='func-write'><function>write()</function></link>">
39  
40 +<!ENTITY media-func-close "<link linkend='media-func-close'><function>close()</function></link>">
41 +<!ENTITY media-func-ioctl "<link linkend='media-func-ioctl'><function>ioctl()</function></link>">
42 +<!ENTITY media-func-open "<link linkend='media-func-open'><function>open()</function></link>">
43 +
44  <!-- Ioctls -->
45  <!ENTITY VIDIOC-CROPCAP "<link linkend='vidioc-cropcap'><constant>VIDIOC_CROPCAP</constant></link>">
46  <!ENTITY VIDIOC-DBG-G-CHIP-IDENT "<link linkend='vidioc-dbg-g-chip-ident'><constant>VIDIOC_DBG_G_CHIP_IDENT</constant></link>">
47 @@ -87,6 +91,8 @@
48  <!ENTITY VIDIOC-TRY-FMT "<link linkend='vidioc-g-fmt'><constant>VIDIOC_TRY_FMT</constant></link>">
49  <!ENTITY VIDIOC-UNSUBSCRIBE-EVENT "<link linkend='vidioc-subscribe-event'><constant>VIDIOC_UNSUBSCRIBE_EVENT</constant></link>">
50  
51 +<!ENTITY MEDIA-IOC-DEVICE-INFO "<link linkend='media-ioc-device-info'><constant>MEDIA_IOC_DEVICE_INFO</constant></link>">
52 +
53  <!-- Types -->
54  <!ENTITY v4l2-std-id "<link linkend='v4l2-std-id'>v4l2_std_id</link>">
55  
56 @@ -181,6 +187,8 @@
57  <!ENTITY v4l2-vbi-format "struct&nbsp;<link linkend='v4l2-vbi-format'>v4l2_vbi_format</link>">
58  <!ENTITY v4l2-window "struct&nbsp;<link linkend='v4l2-window'>v4l2_window</link>">
59  
60 +<!ENTITY media-device-info "struct&nbsp;<link linkend='media-device-info'>media_device_info</link>">
61 +
62  <!-- Error Codes -->
63  <!ENTITY EACCES "<errorcode>EACCES</errorcode> error code">
64  <!ENTITY EAGAIN "<errorcode>EAGAIN</errorcode> error code">
65 @@ -322,6 +330,10 @@
66  <!ENTITY sub-media-indices SYSTEM "media-indices.tmpl">
67  
68  <!ENTITY sub-media-controller SYSTEM "v4l/media-controller.xml">
69 +<!ENTITY sub-media-open SYSTEM "v4l/media-func-open.xml">
70 +<!ENTITY sub-media-close SYSTEM "v4l/media-func-close.xml">
71 +<!ENTITY sub-media-ioctl SYSTEM "v4l/media-func-ioctl.xml">
72 +<!ENTITY sub-media-ioc-device-info SYSTEM "v4l/media-ioc-device-info.xml">
73  
74  <!-- Function Reference -->
75  <!ENTITY close SYSTEM "v4l/func-close.xml">
76 diff --git a/Documentation/DocBook/v4l/media-controller.xml b/Documentation/DocBook/v4l/media-controller.xml
77 index f89228d..a46b786 100644
78 --- a/Documentation/DocBook/v4l/media-controller.xml
79 +++ b/Documentation/DocBook/v4l/media-controller.xml
80 @@ -74,3 +74,13 @@
81      pad to a sink pad.</para>
82    </section>
83  </chapter>
84 +
85 +<appendix id="media-user-func">
86 +  <title>Function Reference</title>
87 +  <!-- Keep this alphabetically sorted. -->
88 +  &sub-media-open;
89 +  &sub-media-close;
90 +  &sub-media-ioctl;
91 +  <!-- All ioctls go here. -->
92 +  &sub-media-ioc-device-info;
93 +</appendix>
94 diff --git a/Documentation/DocBook/v4l/media-func-close.xml b/Documentation/DocBook/v4l/media-func-close.xml
95 new file mode 100644
96 index 0000000..be149c8
97 --- /dev/null
98 +++ b/Documentation/DocBook/v4l/media-func-close.xml
99 @@ -0,0 +1,59 @@
100 +<refentry id="media-func-close">
101 +  <refmeta>
102 +    <refentrytitle>media close()</refentrytitle>
103 +    &manvol;
104 +  </refmeta>
106 +  <refnamediv>
107 +    <refname>media-close</refname>
108 +    <refpurpose>Close a media device</refpurpose>
109 +  </refnamediv>
111 +  <refsynopsisdiv>
112 +    <funcsynopsis>
113 +      <funcsynopsisinfo>#include &lt;unistd.h&gt;</funcsynopsisinfo>
114 +      <funcprototype>
115 +       <funcdef>int <function>close</function></funcdef>
116 +       <paramdef>int <parameter>fd</parameter></paramdef>
117 +      </funcprototype>
118 +    </funcsynopsis>
119 +  </refsynopsisdiv>
121 +  <refsect1>
122 +    <title>Arguments</title>
124 +    <variablelist>
125 +      <varlistentry>
126 +       <term><parameter>fd</parameter></term>
127 +       <listitem>
128 +         <para>&fd;</para>
129 +       </listitem>
130 +      </varlistentry>
131 +    </variablelist>
132 +  </refsect1>
134 +  <refsect1>
135 +    <title>Description</title>
137 +    <para>Closes the media device. Resources associated with the file descriptor
138 +    are freed. The device configuration remain unchanged.</para>
139 +  </refsect1>
141 +  <refsect1>
142 +    <title>Return Value</title>
144 +    <para><function>close</function> returns 0 on success. On error, -1 is
145 +    returned, and <varname>errno</varname> is set appropriately. Possible error
146 +    codes are:</para>
148 +    <variablelist>
149 +      <varlistentry>
150 +       <term><errorcode>EBADF</errorcode></term>
151 +       <listitem>
152 +         <para><parameter>fd</parameter> is not a valid open file descriptor.
153 +         </para>
154 +       </listitem>
155 +      </varlistentry>
156 +    </variablelist>
157 +  </refsect1>
158 +</refentry>
159 diff --git a/Documentation/DocBook/v4l/media-func-ioctl.xml b/Documentation/DocBook/v4l/media-func-ioctl.xml
160 new file mode 100644
161 index 0000000..bda8604
162 --- /dev/null
163 +++ b/Documentation/DocBook/v4l/media-func-ioctl.xml
164 @@ -0,0 +1,116 @@
165 +<refentry id="media-func-ioctl">
166 +  <refmeta>
167 +    <refentrytitle>media ioctl()</refentrytitle>
168 +    &manvol;
169 +  </refmeta>
171 +  <refnamediv>
172 +    <refname>media-ioctl</refname>
173 +    <refpurpose>Control a media device</refpurpose>
174 +  </refnamediv>
176 +  <refsynopsisdiv>
177 +    <funcsynopsis>
178 +      <funcsynopsisinfo>#include &lt;sys/ioctl.h&gt;</funcsynopsisinfo>
179 +      <funcprototype>
180 +       <funcdef>int <function>ioctl</function></funcdef>
181 +       <paramdef>int <parameter>fd</parameter></paramdef>
182 +       <paramdef>int <parameter>request</parameter></paramdef>
183 +       <paramdef>void *<parameter>argp</parameter></paramdef>
184 +      </funcprototype>
185 +    </funcsynopsis>
186 +  </refsynopsisdiv>
188 +  <refsect1>
189 +    <title>Arguments</title>
191 +    <variablelist>
192 +      <varlistentry>
193 +       <term><parameter>fd</parameter></term>
194 +       <listitem>
195 +         <para>&fd;</para>
196 +       </listitem>
197 +      </varlistentry>
198 +      <varlistentry>
199 +       <term><parameter>request</parameter></term>
200 +       <listitem>
201 +         <para>Media ioctl request code as defined in the media.h header file,
202 +         for example MEDIA_IOC_SETUP_LINK.</para>
203 +       </listitem>
204 +      </varlistentry>
205 +      <varlistentry>
206 +       <term><parameter>argp</parameter></term>
207 +       <listitem>
208 +         <para>Pointer to a request-specific structure.</para>
209 +       </listitem>
210 +      </varlistentry>
211 +    </variablelist>
212 +  </refsect1>
214 +  <refsect1>
215 +    <title>Description</title>
216 +    <para>The <function>ioctl()</function> function manipulates media device
217 +    parameters. The argument <parameter>fd</parameter> must be an open file
218 +    descriptor.</para>
219 +    <para>The ioctl <parameter>request</parameter> code specifies the media
220 +    function to be called. It has encoded in it whether the argument is an
221 +    input, output or read/write parameter, and the size of the argument
222 +    <parameter>argp</parameter> in bytes.</para>
223 +    <para>Macros and structures definitions specifying media ioctl requests and
224 +    their parameters are located in the media.h header file. All media ioctl
225 +    requests, their respective function and parameters are specified in
226 +    <xref linkend="media-user-func" />.</para>
227 +  </refsect1>
229 +  <refsect1>
230 +    <title>Return Value</title>
232 +    <para><function>ioctl()</function> returns <returnvalue>0</returnvalue> on
233 +    success. On failure, <returnvalue>-1</returnvalue> is returned, and the
234 +    <varname>errno</varname> variable is set appropriately. Generic error codes
235 +    are listed below, and request-specific error codes are listed in the
236 +    individual requests descriptions.</para>
237 +    <para>When an ioctl that takes an output or read/write parameter fails,
238 +    the parameter remains unmodified.</para>
240 +    <variablelist>
241 +      <varlistentry>
242 +       <term><errorcode>EBADF</errorcode></term>
243 +       <listitem>
244 +         <para><parameter>fd</parameter> is not a valid open file descriptor.
245 +         </para>
246 +       </listitem>
247 +      </varlistentry>
248 +      <varlistentry>
249 +       <term><errorcode>EFAULT</errorcode></term>
250 +       <listitem>
251 +         <para><parameter>argp</parameter> references an inaccessible memory
252 +         area.</para>
253 +       </listitem>
254 +      </varlistentry>
255 +      <varlistentry>
256 +       <term><errorcode>EINVAL</errorcode></term>
257 +       <listitem>
258 +         <para>The <parameter>request</parameter> or the data pointed to by
259 +         <parameter>argp</parameter> is not valid. This is a very common error
260 +         code, see the individual ioctl requests listed in
261 +         <xref linkend="media-user-func" /> for actual causes.</para>
262 +       </listitem>
263 +      </varlistentry>
264 +      <varlistentry>
265 +       <term><errorcode>ENOMEM</errorcode></term>
266 +       <listitem>
267 +         <para>Insufficient kernel memory was available to complete the
268 +         request.</para>
269 +       </listitem>
270 +      </varlistentry>
271 +      <varlistentry>
272 +       <term><errorcode>ENOTTY</errorcode></term>
273 +       <listitem>
274 +         <para><parameter>fd</parameter> is  not  associated  with  a character
275 +         special device.</para>
276 +       </listitem>
277 +      </varlistentry>
278 +    </variablelist>
279 +  </refsect1>
280 +</refentry>
281 diff --git a/Documentation/DocBook/v4l/media-func-open.xml b/Documentation/DocBook/v4l/media-func-open.xml
282 new file mode 100644
283 index 0000000..f7df034
284 --- /dev/null
285 +++ b/Documentation/DocBook/v4l/media-func-open.xml
286 @@ -0,0 +1,94 @@
287 +<refentry id="media-func-open">
288 +  <refmeta>
289 +    <refentrytitle>media open()</refentrytitle>
290 +    &manvol;
291 +  </refmeta>
293 +  <refnamediv>
294 +    <refname>media-open</refname>
295 +    <refpurpose>Open a media device</refpurpose>
296 +  </refnamediv>
298 +  <refsynopsisdiv>
299 +    <funcsynopsis>
300 +      <funcsynopsisinfo>#include &lt;fcntl.h&gt;</funcsynopsisinfo>
301 +      <funcprototype>
302 +       <funcdef>int <function>open</function></funcdef>
303 +       <paramdef>const char *<parameter>device_name</parameter></paramdef>
304 +       <paramdef>int <parameter>flags</parameter></paramdef>
305 +      </funcprototype>
306 +    </funcsynopsis>
307 +  </refsynopsisdiv>
309 +  <refsect1>
310 +    <title>Arguments</title>
312 +    <variablelist>
313 +      <varlistentry>
314 +       <term><parameter>device_name</parameter></term>
315 +       <listitem>
316 +         <para>Device to be opened.</para>
317 +       </listitem>
318 +      </varlistentry>
319 +      <varlistentry>
320 +       <term><parameter>flags</parameter></term>
321 +       <listitem>
322 +         <para>Open flags. Access mode must be either <constant>O_RDONLY</constant>
323 +         or <constant>O_RDWR</constant>. Other flags have no effect.</para>
324 +       </listitem>
325 +      </varlistentry>
326 +    </variablelist>
327 +  </refsect1>
328 +  <refsect1>
329 +    <title>Description</title>
330 +    <para>To open a media device applications call <function>open()</function>
331 +    with the desired device name. The function has no side effects; the device
332 +    configuration remain unchanged.</para>
333 +    <para>When the device is opened in read-only mode, attemps to modify its
334 +    configuration will result in an error, and <varname>errno</varname> will be
335 +    set to <errorcode>EBADF</errorcode>.</para>
336 +  </refsect1>
337 +  <refsect1>
338 +    <title>Return Value</title>
340 +    <para><function>open</function> returns the new file descriptor on success.
341 +    On error, -1 is returned, and <varname>errno</varname> is set appropriately.
342 +    Possible error codes are:</para>
344 +    <variablelist>
345 +      <varlistentry>
346 +       <term><errorcode>EACCES</errorcode></term>
347 +       <listitem>
348 +         <para>The requested access to the file is not allowed.</para>
349 +       </listitem>
350 +      </varlistentry>
351 +      <varlistentry>
352 +       <term><errorcode>EMFILE</errorcode></term>
353 +       <listitem>
354 +         <para>The  process  already  has  the  maximum number of files open.
355 +         </para>
356 +       </listitem>
357 +      </varlistentry>
358 +      <varlistentry>
359 +       <term><errorcode>ENFILE</errorcode></term>
360 +       <listitem>
361 +         <para>The system limit on the total number of open files has been
362 +         reached.</para>
363 +       </listitem>
364 +      </varlistentry>
365 +      <varlistentry>
366 +       <term><errorcode>ENOMEM</errorcode></term>
367 +       <listitem>
368 +         <para>Insufficient kernel memory was available.</para>
369 +       </listitem>
370 +      </varlistentry>
371 +      <varlistentry>
372 +       <term><errorcode>ENXIO</errorcode></term>
373 +       <listitem>
374 +         <para>No device corresponding to this device special file exists.
375 +         </para>
376 +       </listitem>
377 +      </varlistentry>
378 +    </variablelist>
379 +  </refsect1>
380 +</refentry>
381 diff --git a/Documentation/DocBook/v4l/media-ioc-device-info.xml b/Documentation/DocBook/v4l/media-ioc-device-info.xml
382 new file mode 100644
383 index 0000000..278a312
384 --- /dev/null
385 +++ b/Documentation/DocBook/v4l/media-ioc-device-info.xml
386 @@ -0,0 +1,132 @@
387 +<refentry id="media-ioc-device-info">
388 +  <refmeta>
389 +    <refentrytitle>ioctl MEDIA_IOC_DEVICE_INFO</refentrytitle>
390 +    &manvol;
391 +  </refmeta>
393 +  <refnamediv>
394 +    <refname>MEDIA_IOC_DEVICE_INFO</refname>
395 +    <refpurpose>Query device information</refpurpose>
396 +  </refnamediv>
398 +  <refsynopsisdiv>
399 +    <funcsynopsis>
400 +      <funcprototype>
401 +       <funcdef>int <function>ioctl</function></funcdef>
402 +       <paramdef>int <parameter>fd</parameter></paramdef>
403 +       <paramdef>int <parameter>request</parameter></paramdef>
404 +       <paramdef>struct media_device_info *<parameter>argp</parameter></paramdef>
405 +      </funcprototype>
406 +    </funcsynopsis>
407 +  </refsynopsisdiv>
409 +  <refsect1>
410 +    <title>Arguments</title>
412 +    <variablelist>
413 +      <varlistentry>
414 +       <term><parameter>fd</parameter></term>
415 +       <listitem>
416 +         <para>&fd;</para>
417 +       </listitem>
418 +      </varlistentry>
419 +      <varlistentry>
420 +       <term><parameter>request</parameter></term>
421 +       <listitem>
422 +         <para>MEDIA_IOC_DEVICE_INFO</para>
423 +       </listitem>
424 +      </varlistentry>
425 +      <varlistentry>
426 +       <term><parameter>argp</parameter></term>
427 +       <listitem>
428 +         <para></para>
429 +       </listitem>
430 +      </varlistentry>
431 +    </variablelist>
432 +  </refsect1>
434 +  <refsect1>
435 +    <title>Description</title>
437 +    <para>All media devices must support the <constant>MEDIA_IOC_DEVICE_INFO</constant>
438 +    ioctl. To query device information, applications call the ioctl with a
439 +    pointer to a &media-device-info;. The driver fills the structure and returns
440 +    the information to the application.
441 +    The ioctl never fails.</para>
443 +    <table pgwide="1" frame="none" id="media-device-info">
444 +      <title>struct <structname>media_device_info</structname></title>
445 +      <tgroup cols="3">
446 +       &cs-str;
447 +       <tbody valign="top">
448 +         <row>
449 +           <entry>char</entry>
450 +           <entry><structfield>driver</structfield>[16]</entry>
451 +           <entry><para>Name of the driver implementing the media API as a
452 +           NUL-terminated ASCII string. The driver version is stored in the
453 +           <structfield>driver_version</structfield> field.</para>
454 +           <para>Driver specific applications can use this information to
455 +           verify the driver identity. It is also useful to work around
456 +           known bugs, or to identify drivers in error reports.</para></entry>
457 +         </row>
458 +         <row>
459 +           <entry>char</entry>
460 +           <entry><structfield>model</structfield>[32]</entry>
461 +           <entry>Device model name as a NUL-terminated UTF-8 string. The
462 +           device version is stored in the <structfield>device_version</structfield>
463 +           field and is not be appended to the model name.</entry>
464 +         </row>
465 +         <row>
466 +           <entry>char</entry>
467 +           <entry><structfield>serial</structfield>[40]</entry>
468 +           <entry>Serial number as a NUL-terminated ASCII string.</entry>
469 +         </row>
470 +         <row>
471 +           <entry>char</entry>
472 +           <entry><structfield>bus_info</structfield>[32]</entry>
473 +           <entry>Location of the device in the system as a NUL-terminated
474 +           ASCII string. This includes the bus type name (PCI, USB, ...) and a
475 +           bus-specific identifier.</entry>
476 +         </row>
477 +         <row>
478 +           <entry>__u32</entry>
479 +           <entry><structfield>media_version</structfield></entry>
480 +           <entry>Media API version, formatted with the
481 +           <constant>KERNEL_VERSION()</constant> macro.</entry>
482 +         </row>
483 +         <row>
484 +           <entry>__u32</entry>
485 +           <entry><structfield>hw_revision</structfield></entry>
486 +           <entry>Hardware device revision in a driver-specific format.</entry>
487 +         </row>
488 +         <row>
489 +           <entry>__u32</entry>
490 +           <entry><structfield>media_version</structfield></entry>
491 +           <entry>Media device driver version, formatted with the
492 +           <constant>KERNEL_VERSION()</constant> macro. Together with the
493 +           <structfield>driver</structfield> field this identifies a particular
494 +           driver.</entry>
495 +         </row>
496 +         <row>
497 +           <entry>__u32</entry>
498 +           <entry><structfield>reserved</structfield>[31]</entry>
499 +           <entry>Reserved for future extensions. Drivers and applications must
500 +           set this array to zero.</entry>
501 +         </row>
502 +       </tbody>
503 +      </tgroup>
504 +    </table>
505 +    <para>The <structfield>serial</structfield> and <structfield>bus_info</structfield>
506 +    fields can be used to distinguish between multiple instances of otherwise
507 +    identical hardware. The serial number takes precedence when provided and can
508 +    be assumed to be unique. If the serial number is an empty string, the
509 +    <structfield>bus_info</structfield> field can be used instead. The
510 +    <structfield>bus_info</structfield> field is guaranteed to be unique, but
511 +    can vary across reboots or device unplug/replug.</para>
512 +  </refsect1>
514 +  <refsect1>
515 +    <title>Return value</title>
516 +    <para>This function doesn't return specific error codes.</para>
517 +  </refsect1>
518 +</refentry>
519 diff --git a/drivers/media/media-device.c b/drivers/media/media-device.c
520 index e4c2157..5c745be 100644
521 --- a/drivers/media/media-device.c
522 +++ b/drivers/media/media-device.c
523 @@ -22,13 +22,70 @@
524  
525  #include <linux/types.h>
526  #include <linux/ioctl.h>
527 +#include <linux/media.h>
528  
529  #include <media/media-device.h>
530  #include <media/media-devnode.h>
531  #include <media/media-entity.h>
532  
533 +/* -----------------------------------------------------------------------------
534 + * Userspace API
535 + */
537 +static int media_device_open(struct file *filp)
538 +{
539 +       return 0;
540 +}
542 +static int media_device_close(struct file *filp)
543 +{
544 +       return 0;
545 +}
547 +static int media_device_get_info(struct media_device *dev,
548 +                                struct media_device_info __user *__info)
549 +{
550 +       struct media_device_info info;
552 +       memset(&info, 0, sizeof(info));
554 +       strlcpy(info.driver, dev->dev->driver->name, sizeof(info.driver));
555 +       strlcpy(info.model, dev->model, sizeof(info.model));
556 +       strlcpy(info.serial, dev->serial, sizeof(info.serial));
557 +       strlcpy(info.bus_info, dev->bus_info, sizeof(info.bus_info));
559 +       info.media_version = MEDIA_API_VERSION;
560 +       info.hw_revision = dev->hw_revision;
561 +       info.driver_version = dev->driver_version;
563 +       return copy_to_user(__info, &info, sizeof(*__info));
564 +}
566 +static long media_device_ioctl(struct file *filp, unsigned int cmd,
567 +                              unsigned long arg)
568 +{
569 +       struct media_devnode *devnode = media_devnode_data(filp);
570 +       struct media_device *dev = to_media_device(devnode);
571 +       long ret;
573 +       switch (cmd) {
574 +       case MEDIA_IOC_DEVICE_INFO:
575 +               ret = media_device_get_info(dev,
576 +                               (struct media_device_info __user *)arg);
577 +               break;
579 +       default:
580 +               ret = -ENOIOCTLCMD;
581 +       }
583 +       return ret;
584 +}
586  static const struct media_file_operations media_device_fops = {
587         .owner = THIS_MODULE,
588 +       .open = media_device_open,
589 +       .ioctl = media_device_ioctl,
590 +       .release = media_device_close,
591  };
592  
593  /* -----------------------------------------------------------------------------
594 diff --git a/include/linux/Kbuild b/include/linux/Kbuild
595 index 97319a8..26e0a7f 100644
596 --- a/include/linux/Kbuild
597 +++ b/include/linux/Kbuild
598 @@ -228,6 +228,7 @@ header-y += magic.h
599  header-y += major.h
600  header-y += map_to_7segment.h
601  header-y += matroxfb.h
602 +header-y += media.h
603  header-y += mempolicy.h
604  header-y += meye.h
605  header-y += mii.h
606 diff --git a/include/linux/media.h b/include/linux/media.h
607 new file mode 100644
608 index 0000000..4c52f08
609 --- /dev/null
610 +++ b/include/linux/media.h
611 @@ -0,0 +1,45 @@
612 +/*
613 + * Multimedia device API
614 + *
615 + * Copyright (C) 2010 Nokia Corporation
616 + *
617 + * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
618 + *          Sakari Ailus <sakari.ailus@maxwell.research.nokia.com>
619 + *
620 + * This program is free software; you can redistribute it and/or modify
621 + * it under the terms of the GNU General Public License version 2 as
622 + * published by the Free Software Foundation.
623 + *
624 + * This program is distributed in the hope that it will be useful,
625 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
626 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
627 + * GNU General Public License for more details.
628 + *
629 + * You should have received a copy of the GNU General Public License
630 + * along with this program; if not, write to the Free Software
631 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
632 + */
634 +#ifndef __LINUX_MEDIA_H
635 +#define __LINUX_MEDIA_H
637 +#include <linux/ioctl.h>
638 +#include <linux/types.h>
639 +#include <linux/version.h>
641 +#define MEDIA_API_VERSION      KERNEL_VERSION(0, 1, 0)
643 +struct media_device_info {
644 +       char driver[16];
645 +       char model[32];
646 +       char serial[40];
647 +       char bus_info[32];
648 +       __u32 media_version;
649 +       __u32 hw_revision;
650 +       __u32 driver_version;
651 +       __u32 reserved[31];
652 +};
654 +#define MEDIA_IOC_DEVICE_INFO          _IOWR('M', 1, struct media_device_info)
656 +#endif /* __LINUX_MEDIA_H */
657 -- 
658 1.6.6.1