Commit 8762541f authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media

Pull second set of media updates from Mauro Carvalho Chehab:

 - radio API: add support to work with radio frequency bands

 - new AM/FM radio drivers: radio-shark, radio-shark2

 - new Remote Controller USB driver: iguanair

 - conversion of several drivers to the v4l2 core control framework

 - new board additions at existing drivers

 - the remaining (and vast majority of the patches) are due to
   drivers/DocBook fixes/cleanups.

* 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (154 commits)
  [media] radio-tea5777: use library for 64bits div
  [media] tlg2300: Declare MODULE_FIRMWARE usage
  [media] lgs8gxx: Declare MODULE_FIRMWARE usage
  [media] xc5000: Add MODULE_FIRMWARE statements
  [media] s2255drv: Add MODULE_FIRMWARE statement
  [media] dib8000: move dereference after check for NULL
  [media] Documentation: Update cardlists
  [media] bttv: add support for Aposonic W-DVR
  [media] cx25821: Remove bad strcpy to read-only char*
  [media] pms.c: remove duplicated include
  [media] smiapp-core.c: remove duplicated include
  [media] via-camera: pass correct format settings to sensor
  [media] rtl2832.c: minor cleanup
  [media] Add support for the IguanaWorks USB IR Transceiver
  [media] Minor cleanups for MCE USB
  [media] drivers/media/dvb/siano/smscoreapi.c: use list_for_each_entry
  [media] Use a named union in struct v4l2_ioctl_info
  [media] mceusb: Add Twisted Melon USB IDs
  [media] staging/media/solo6x10: use module_pci_driver macro
  [media] staging/media/dt3155v4l: use module_pci_driver macro
  ...

Conflicts:
	Documentation/feature-removal-schedule.txt
parents 6dbb35b0 adfe1560
...@@ -2460,7 +2460,7 @@ that used it. It was originally scheduled for removal in 2.6.35. ...@@ -2460,7 +2460,7 @@ that used it. It was originally scheduled for removal in 2.6.35.
</section> </section>
<section> <section>
<title>V4L2 in Linux 3.5</title> <title>V4L2 in Linux 3.6</title>
<orderedlist> <orderedlist>
<listitem> <listitem>
<para>Replaced <structfield>input</structfield> in <para>Replaced <structfield>input</structfield> in
...@@ -2471,6 +2471,24 @@ that used it. It was originally scheduled for removal in 2.6.35. ...@@ -2471,6 +2471,24 @@ that used it. It was originally scheduled for removal in 2.6.35.
</orderedlist> </orderedlist>
</section> </section>
<section>
<title>V4L2 in Linux 3.6</title>
<orderedlist>
<listitem>
<para>Added V4L2_CAP_VIDEO_M2M and V4L2_CAP_VIDEO_M2M_MPLANE capabilities.</para>
</listitem>
</orderedlist>
</section>
<section>
<title>V4L2 in Linux 3.6</title>
<orderedlist>
<listitem>
<para>Added support for frequency band enumerations: &VIDIOC-ENUM-FREQ-BANDS;.</para>
</listitem>
</orderedlist>
</section>
<section id="other"> <section id="other">
<title>Relation of V4L2 to other Linux multimedia APIs</title> <title>Relation of V4L2 to other Linux multimedia APIs</title>
...@@ -2600,6 +2618,9 @@ ioctls.</para> ...@@ -2600,6 +2618,9 @@ ioctls.</para>
<para><link linkend="v4l2-auto-focus-area"><constant> <para><link linkend="v4l2-auto-focus-area"><constant>
V4L2_CID_AUTO_FOCUS_AREA</constant></link> control.</para> V4L2_CID_AUTO_FOCUS_AREA</constant></link> control.</para>
</listitem> </listitem>
<listitem>
<para>Support for frequency band enumeration: &VIDIOC-ENUM-FREQ-BANDS; ioctl.</para>
</listitem>
</itemizedlist> </itemizedlist>
</section> </section>
......
...@@ -372,6 +372,11 @@ minimum value disables backlight compensation.</entry> ...@@ -372,6 +372,11 @@ minimum value disables backlight compensation.</entry>
Cr component, bits [15:8] as Cb component and bits [31:16] must be zero. Cr component, bits [15:8] as Cb component and bits [31:16] must be zero.
</entry> </entry>
</row> </row>
<row>
<entry><constant>V4L2_CID_AUTOBRIGHTNESS</constant></entry>
<entry>boolean</entry>
<entry>Enable Automatic Brightness.</entry>
</row>
<row> <row>
<entry><constant>V4L2_CID_ROTATE</constant></entry> <entry><constant>V4L2_CID_ROTATE</constant></entry>
<entry>integer</entry> <entry>integer</entry>
......
...@@ -140,6 +140,11 @@ structs, ioctls) must be noted in more detail in the history chapter ...@@ -140,6 +140,11 @@ structs, ioctls) must be noted in more detail in the history chapter
applications. --> applications. -->
<revision> <revision>
<revnumber>3.6</revnumber>
<date>2012-07-02</date>
<authorinitials>hv</authorinitials>
<revremark>Added VIDIOC_ENUM_FREQ_BANDS.
</revremark>
<revnumber>3.5</revnumber> <revnumber>3.5</revnumber>
<date>2012-05-07</date> <date>2012-05-07</date>
<authorinitials>sa, sn</authorinitials> <authorinitials>sa, sn</authorinitials>
...@@ -534,6 +539,7 @@ and discussions on the V4L mailing list.</revremark> ...@@ -534,6 +539,7 @@ and discussions on the V4L mailing list.</revremark>
&sub-enum-fmt; &sub-enum-fmt;
&sub-enum-framesizes; &sub-enum-framesizes;
&sub-enum-frameintervals; &sub-enum-frameintervals;
&sub-enum-freq-bands;
&sub-enuminput; &sub-enuminput;
&sub-enumoutput; &sub-enumoutput;
&sub-enumstd; &sub-enumstd;
......
...@@ -64,7 +64,7 @@ different sizes.</para> ...@@ -64,7 +64,7 @@ different sizes.</para>
<para>To allocate device buffers applications initialize relevant fields of <para>To allocate device buffers applications initialize relevant fields of
the <structname>v4l2_create_buffers</structname> structure. They set the the <structname>v4l2_create_buffers</structname> structure. They set the
<structfield>type</structfield> field in the <structfield>type</structfield> field in the
<structname>v4l2_format</structname> structure, embedded in this &v4l2-format; structure, embedded in this
structure, to the respective stream or buffer type. structure, to the respective stream or buffer type.
<structfield>count</structfield> must be set to the number of required buffers. <structfield>count</structfield> must be set to the number of required buffers.
<structfield>memory</structfield> specifies the required I/O method. The <structfield>memory</structfield> specifies the required I/O method. The
...@@ -114,7 +114,7 @@ information.</para> ...@@ -114,7 +114,7 @@ information.</para>
/></entry> /></entry>
</row> </row>
<row> <row>
<entry>struct&nbsp;v4l2_format</entry> <entry>&v4l2-format;</entry>
<entry><structfield>format</structfield></entry> <entry><structfield>format</structfield></entry>
<entry>Filled in by the application, preserved by the driver.</entry> <entry>Filled in by the application, preserved by the driver.</entry>
</row> </row>
......
...@@ -54,15 +54,9 @@ ...@@ -54,15 +54,9 @@
interface and may change in the future.</para> interface and may change in the future.</para>
</note> </note>
<para>To query the available timings, applications initialize the <para>To query the capabilities of the DV receiver/transmitter applications can call
<structfield>index</structfield> field and zero the reserved array of &v4l2-dv-timings-cap; this ioctl and the driver will fill in the structure. Note that drivers may return
and call the <constant>VIDIOC_DV_TIMINGS_CAP</constant> ioctl with a pointer to this different values after switching the video input or output.</para>
structure. Drivers fill the rest of the structure or return an
&EINVAL; when the index is out of bounds. To enumerate all supported DV timings,
applications shall begin at index zero, incrementing by one until the
driver returns <errorcode>EINVAL</errorcode>. Note that drivers may enumerate a
different set of DV timings after switching the video input or
output.</para>
<table pgwide="1" frame="none" id="v4l2-bt-timings-cap"> <table pgwide="1" frame="none" id="v4l2-bt-timings-cap">
<title>struct <structname>v4l2_bt_timings_cap</structname></title> <title>struct <structname>v4l2_bt_timings_cap</structname></title>
...@@ -115,7 +109,7 @@ output.</para> ...@@ -115,7 +109,7 @@ output.</para>
<row> <row>
<entry>__u32</entry> <entry>__u32</entry>
<entry><structfield>reserved</structfield>[16]</entry> <entry><structfield>reserved</structfield>[16]</entry>
<entry></entry> <entry>Reserved for future extensions. Drivers must set the array to zero.</entry>
</row> </row>
</tbody> </tbody>
</tgroup> </tgroup>
......
<refentry id="vidioc-enum-freq-bands">
<refmeta>
<refentrytitle>ioctl VIDIOC_ENUM_FREQ_BANDS</refentrytitle>
&manvol;
</refmeta>
<refnamediv>
<refname>VIDIOC_ENUM_FREQ_BANDS</refname>
<refpurpose>Enumerate supported frequency bands</refpurpose>
</refnamediv>
<refsynopsisdiv>
<funcsynopsis>
<funcprototype>
<funcdef>int <function>ioctl</function></funcdef>
<paramdef>int <parameter>fd</parameter></paramdef>
<paramdef>int <parameter>request</parameter></paramdef>
<paramdef>struct v4l2_frequency_band
*<parameter>argp</parameter></paramdef>
</funcprototype>
</funcsynopsis>
</refsynopsisdiv>
<refsect1>
<title>Arguments</title>
<variablelist>
<varlistentry>
<term><parameter>fd</parameter></term>
<listitem>
<para>&fd;</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>request</parameter></term>
<listitem>
<para>VIDIOC_ENUM_FREQ_BANDS</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>argp</parameter></term>
<listitem>
<para></para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1>
<title>Description</title>
<note>
<title>Experimental</title>
<para>This is an <link linkend="experimental"> experimental </link>
interface and may change in the future.</para>
</note>
<para>Enumerates the frequency bands that a tuner or modulator supports.
To do this applications initialize the <structfield>tuner</structfield>,
<structfield>type</structfield> and <structfield>index</structfield> fields,
and zero out the <structfield>reserved</structfield> array of a &v4l2-frequency-band; and
call the <constant>VIDIOC_ENUM_FREQ_BANDS</constant> ioctl with a pointer
to this structure.</para>
<para>This ioctl is supported if the <constant>V4L2_TUNER_CAP_FREQ_BANDS</constant> capability
of the corresponding tuner/modulator is set.</para>
<table pgwide="1" frame="none" id="v4l2-frequency-band">
<title>struct <structname>v4l2_frequency_band</structname></title>
<tgroup cols="3">
&cs-str;
<tbody valign="top">
<row>
<entry>__u32</entry>
<entry><structfield>tuner</structfield></entry>
<entry>The tuner or modulator index number. This is the
same value as in the &v4l2-input; <structfield>tuner</structfield>
field and the &v4l2-tuner; <structfield>index</structfield> field, or
the &v4l2-output; <structfield>modulator</structfield> field and the
&v4l2-modulator; <structfield>index</structfield> field.</entry>
</row>
<row>
<entry>__u32</entry>
<entry><structfield>type</structfield></entry>
<entry>The tuner type. This is the same value as in the
&v4l2-tuner; <structfield>type</structfield> field. The type must be set
to <constant>V4L2_TUNER_RADIO</constant> for <filename>/dev/radioX</filename>
device nodes, and to <constant>V4L2_TUNER_ANALOG_TV</constant>
for all others. Set this field to <constant>V4L2_TUNER_RADIO</constant> for
modulators (currently only radio modulators are supported).
See <xref linkend="v4l2-tuner-type" /></entry>
</row>
<row>
<entry>__u32</entry>
<entry><structfield>index</structfield></entry>
<entry>Identifies the frequency band, set by the application.</entry>
</row>
<row>
<entry>__u32</entry>
<entry><structfield>capability</structfield></entry>
<entry spanname="hspan">The tuner/modulator capability flags for
this frequency band, see <xref linkend="tuner-capability" />. The <constant>V4L2_TUNER_CAP_LOW</constant>
capability must be the same for all frequency bands of the selected tuner/modulator.
So either all bands have that capability set, or none of them have that capability.</entry>
</row>
<row>
<entry>__u32</entry>
<entry><structfield>rangelow</structfield></entry>
<entry spanname="hspan">The lowest tunable frequency in
units of 62.5 kHz, or if the <structfield>capability</structfield>
flag <constant>V4L2_TUNER_CAP_LOW</constant> is set, in units of 62.5
Hz, for this frequency band.</entry>
</row>
<row>
<entry>__u32</entry>
<entry><structfield>rangehigh</structfield></entry>
<entry spanname="hspan">The highest tunable frequency in
units of 62.5 kHz, or if the <structfield>capability</structfield>
flag <constant>V4L2_TUNER_CAP_LOW</constant> is set, in units of 62.5
Hz, for this frequency band.</entry>
</row>
<row>
<entry>__u32</entry>
<entry><structfield>modulation</structfield></entry>
<entry spanname="hspan">The supported modulation systems of this frequency band.
See <xref linkend="band-modulation" />. Note that currently only one
modulation system per frequency band is supported. More work will need to
be done if multiple modulation systems are possible. Contact the
linux-media mailing list (&v4l-ml;) if you need that functionality.</entry>
</row>
<row>
<entry>__u32</entry>
<entry><structfield>reserved</structfield>[9]</entry>
<entry>Reserved for future extensions. Applications and drivers
must set the array to zero.</entry>
</row>
</tbody>
</tgroup>
</table>
<table pgwide="1" frame="none" id="band-modulation">
<title>Band Modulation Systems</title>
<tgroup cols="3">
&cs-def;
<tbody valign="top">
<row>
<entry><constant>V4L2_BAND_MODULATION_VSB</constant></entry>
<entry>0x02</entry>
<entry>Vestigial Sideband modulation, used for analog TV.</entry>
</row>
<row>
<entry><constant>V4L2_BAND_MODULATION_FM</constant></entry>
<entry>0x04</entry>
<entry>Frequency Modulation, commonly used for analog radio.</entry>
</row>
<row>
<entry><constant>V4L2_BAND_MODULATION_AM</constant></entry>
<entry>0x08</entry>
<entry>Amplitude Modulation, commonly used for analog radio.</entry>
</row>
</tbody>
</tgroup>
</table>
</refsect1>
<refsect1>
&return-value;
<variablelist>
<varlistentry>
<term><errorcode>EINVAL</errorcode></term>
<listitem>
<para>The <structfield>tuner</structfield> or <structfield>index</structfield>
is out of bounds or the <structfield>type</structfield> field is wrong.</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
</refentry>
...@@ -98,11 +98,12 @@ the &v4l2-output; <structfield>modulator</structfield> field and the ...@@ -98,11 +98,12 @@ the &v4l2-output; <structfield>modulator</structfield> field and the
<entry>__u32</entry> <entry>__u32</entry>
<entry><structfield>type</structfield></entry> <entry><structfield>type</structfield></entry>
<entry>The tuner type. This is the same value as in the <entry>The tuner type. This is the same value as in the
&v4l2-tuner; <structfield>type</structfield> field. See The type must be set &v4l2-tuner; <structfield>type</structfield> field. The type must be set
to <constant>V4L2_TUNER_RADIO</constant> for <filename>/dev/radioX</filename> to <constant>V4L2_TUNER_RADIO</constant> for <filename>/dev/radioX</filename>
device nodes, and to <constant>V4L2_TUNER_ANALOG_TV</constant> device nodes, and to <constant>V4L2_TUNER_ANALOG_TV</constant>
for all others. The field is not applicable to modulators, &ie; ignored for all others. Set this field to <constant>V4L2_TUNER_RADIO</constant> for
by drivers. See <xref linkend="v4l2-tuner-type" /></entry> modulators (currently only radio modulators are supported).
See <xref linkend="v4l2-tuner-type" /></entry>
</row> </row>
<row> <row>
<entry>__u32</entry> <entry>__u32</entry>
......
...@@ -119,10 +119,14 @@ field is not quite clear.--></para></entry> ...@@ -119,10 +119,14 @@ field is not quite clear.--></para></entry>
<xref linkend="tuner-capability" />. Audio flags indicate the ability <xref linkend="tuner-capability" />. Audio flags indicate the ability
to decode audio subprograms. They will <emphasis>not</emphasis> to decode audio subprograms. They will <emphasis>not</emphasis>
change, for example with the current video standard.</para><para>When change, for example with the current video standard.</para><para>When
the structure refers to a radio tuner only the the structure refers to a radio tuner the
<constant>V4L2_TUNER_CAP_LOW</constant>, <constant>V4L2_TUNER_CAP_LANG1</constant>,
<constant>V4L2_TUNER_CAP_STEREO</constant> and <constant>V4L2_TUNER_CAP_LANG2</constant> and
<constant>V4L2_TUNER_CAP_RDS</constant> flags can be set.</para></entry> <constant>V4L2_TUNER_CAP_NORM</constant> flags can't be used.</para>
<para>If multiple frequency bands are supported, then
<structfield>capability</structfield> is the union of all
<structfield>capability></structfield> fields of each &v4l2-frequency-band;.
</para></entry>
</row> </row>
<row> <row>
<entry>__u32</entry> <entry>__u32</entry>
...@@ -130,7 +134,9 @@ the structure refers to a radio tuner only the ...@@ -130,7 +134,9 @@ the structure refers to a radio tuner only the
<entry spanname="hspan">The lowest tunable frequency in <entry spanname="hspan">The lowest tunable frequency in
units of 62.5 kHz, or if the <structfield>capability</structfield> units of 62.5 kHz, or if the <structfield>capability</structfield>
flag <constant>V4L2_TUNER_CAP_LOW</constant> is set, in units of 62.5 flag <constant>V4L2_TUNER_CAP_LOW</constant> is set, in units of 62.5
Hz.</entry> Hz. If multiple frequency bands are supported, then
<structfield>rangelow</structfield> is the lowest frequency
of all the frequency bands.</entry>
</row> </row>
<row> <row>
<entry>__u32</entry> <entry>__u32</entry>
...@@ -138,7 +144,9 @@ Hz.</entry> ...@@ -138,7 +144,9 @@ Hz.</entry>
<entry spanname="hspan">The highest tunable frequency in <entry spanname="hspan">The highest tunable frequency in
units of 62.5 kHz, or if the <structfield>capability</structfield> units of 62.5 kHz, or if the <structfield>capability</structfield>
flag <constant>V4L2_TUNER_CAP_LOW</constant> is set, in units of 62.5 flag <constant>V4L2_TUNER_CAP_LOW</constant> is set, in units of 62.5
Hz.</entry> Hz. If multiple frequency bands are supported, then
<structfield>rangehigh</structfield> is the highest frequency
of all the frequency bands.</entry>
</row> </row>
<row> <row>
<entry>__u32</entry> <entry>__u32</entry>
...@@ -340,6 +348,12 @@ radio tuners.</entry> ...@@ -340,6 +348,12 @@ radio tuners.</entry>
<entry>0x0200</entry> <entry>0x0200</entry>
<entry>The RDS data is parsed by the hardware and set via controls.</entry> <entry>The RDS data is parsed by the hardware and set via controls.</entry>
</row> </row>
<row>
<entry><constant>V4L2_TUNER_CAP_FREQ_BANDS</constant></entry>
<entry>0x0400</entry>
<entry>The &VIDIOC-ENUM-FREQ-BANDS; ioctl can be used to enumerate
the available frequency bands.</entry>
</row>
</tbody> </tbody>
</tgroup> </tgroup>
</table> </table>
......
...@@ -191,6 +191,19 @@ linkend="output">Video Output</link> interface.</entry> ...@@ -191,6 +191,19 @@ linkend="output">Video Output</link> interface.</entry>
<link linkend="planar-apis">multi-planar API</link> through the <link linkend="planar-apis">multi-planar API</link> through the
<link linkend="output">Video Output</link> interface.</entry> <link linkend="output">Video Output</link> interface.</entry>
</row> </row>
<row>
<entry><constant>V4L2_CAP_VIDEO_M2M</constant></entry>
<entry>0x00004000</entry>
<entry>The device supports the single-planar API through the
Video Memory-To-Memory interface.</entry>
</row>
<row>
<entry><constant>V4L2_CAP_VIDEO_M2M_MPLANE</constant></entry>
<entry>0x00008000</entry>
<entry>The device supports the
<link linkend="planar-apis">multi-planar API</link> through the
Video Memory-To-Memory interface.</entry>
</row>
<row> <row>
<entry><constant>V4L2_CAP_VIDEO_OVERLAY</constant></entry> <entry><constant>V4L2_CAP_VIDEO_OVERLAY</constant></entry>
<entry>0x00000004</entry> <entry>0x00000004</entry>
......
...@@ -52,11 +52,23 @@ ...@@ -52,11 +52,23 @@
<para>Start a hardware frequency seek from the current frequency. <para>Start a hardware frequency seek from the current frequency.
To do this applications initialize the <structfield>tuner</structfield>, To do this applications initialize the <structfield>tuner</structfield>,
<structfield>type</structfield>, <structfield>seek_upward</structfield>, <structfield>type</structfield>, <structfield>seek_upward</structfield>,
<structfield>spacing</structfield> and <structfield>wrap_around</structfield>, <structfield>spacing</structfield>,
<structfield>wrap_around</structfield> fields, and zero out the <structfield>rangelow</structfield> and <structfield>rangehigh</structfield>
<structfield>reserved</structfield> array of a &v4l2-hw-freq-seek; and fields, and zero out the <structfield>reserved</structfield> array of a
call the <constant>VIDIOC_S_HW_FREQ_SEEK</constant> ioctl with a pointer &v4l2-hw-freq-seek; and call the <constant>VIDIOC_S_HW_FREQ_SEEK</constant>
to this structure.</para> ioctl with a pointer to this structure.</para>
<para>The <structfield>rangelow</structfield> and
<structfield>rangehigh</structfield> fields can be set to a non-zero value to
tell the driver to search a specific band. If the &v4l2-tuner;
<structfield>capability</structfield> field has the
<constant>V4L2_TUNER_CAP_HWSEEK_PROG_LIM</constant> flag set, these values
must fall within one of the bands returned by &VIDIOC-ENUM-FREQ-BANDS;. If
the <constant>V4L2_TUNER_CAP_HWSEEK_PROG_LIM</constant> flag is not set,
then these values must exactly match those of one of the bands returned by
&VIDIOC-ENUM-FREQ-BANDS;. If the current frequency of the tuner does not fall
within the selected band it will be clamped to fit in the band before the
seek is started.</para>
<para>If an error is returned, then the original frequency will <para>If an error is returned, then the original frequency will
be restored.</para> be restored.</para>
...@@ -102,7 +114,27 @@ field and the &v4l2-tuner; <structfield>index</structfield> field.</entry> ...@@ -102,7 +114,27 @@ field and the &v4l2-tuner; <structfield>index</structfield> field.</entry>
</row> </row>
<row> <row>
<entry>__u32</entry> <entry>__u32</entry>
<entry><structfield>reserved</structfield>[7]</entry> <entry><structfield>rangelow</structfield></entry>
<entry>If non-zero, the lowest tunable frequency of the band to
search in units of 62.5 kHz, or if the &v4l2-tuner;
<structfield>capability</structfield> field has the
<constant>V4L2_TUNER_CAP_LOW</constant> flag set, in units of 62.5 Hz.
If <structfield>rangelow</structfield> is zero a reasonable default value
is used.</entry>
</row>
<row>
<entry>__u32</entry>
<entry><structfield>rangehigh</structfield></entry>
<entry>If non-zero, the highest tunable frequency of the band to
search in units of 62.5 kHz, or if the &v4l2-tuner;
<structfield>capability</structfield> field has the
<constant>V4L2_TUNER_CAP_LOW</constant> flag set, in units of 62.5 Hz.
If <structfield>rangehigh</structfield> is zero a reasonable default value
is used.</entry>
</row>
<row>
<entry>__u32</entry>
<entry><structfield>reserved</structfield>[5]</entry>
<entry>Reserved for future extensions. Applications <entry>Reserved for future extensions. Applications
must set the array to zero.</entry> must set the array to zero.</entry>
</row> </row>
...@@ -119,8 +151,10 @@ field and the &v4l2-tuner; <structfield>index</structfield> field.</entry> ...@@ -119,8 +151,10 @@ field and the &v4l2-tuner; <structfield>index</structfield> field.</entry>
<term><errorcode>EINVAL</errorcode></term> <term><errorcode>EINVAL</errorcode></term>
<listitem> <listitem>
<para>The <structfield>tuner</structfield> index is out of <para>The <structfield>tuner</structfield> index is out of
bounds, the wrap_around value is not supported or the value in the <structfield>type</structfield> field is bounds, the <structfield>wrap_around</structfield> value is not supported or
wrong.</para> one of the values in the <structfield>type</structfield>,
<structfield>rangelow</structfield> or <structfield>rangehigh</structfield>
fields is wrong.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
......
...@@ -618,3 +618,17 @@ Why: The regular V4L2 selections and the subdev selection API originally ...@@ -618,3 +618,17 @@ Why: The regular V4L2 selections and the subdev selection API originally
Who: Sylwester Nawrocki <sylvester.nawrocki@gmail.com> Who: Sylwester Nawrocki <sylvester.nawrocki@gmail.com>
---------------------------- ----------------------------
What: Using V4L2_CAP_VIDEO_CAPTURE and V4L2_CAP_VIDEO_OUTPUT flags
to indicate a V4L2 memory-to-memory device capability
When: 3.8
Why: New drivers should use new V4L2_CAP_VIDEO_M2M capability flag
to indicate a V4L2 video memory-to-memory (M2M) device and
applications can now identify a M2M video device by checking
for V4L2_CAP_VIDEO_M2M, with VIDIOC_QUERYCAP ioctl. Using ORed
V4L2_CAP_VIDEO_CAPTURE and V4L2_CAP_VIDEO_OUTPUT flags for M2M
devices is ambiguous and may lead, for example, to identifying
a M2M device as a video capture or output device.
Who: Sylwester Nawrocki <s.nawrocki@samsung.com>
----------------------------
...@@ -3,4 +3,4 @@ ...@@ -3,4 +3,4 @@
2 -> Hauppauge HVR850 (au0828) [2040:7240] 2 -> Hauppauge HVR850 (au0828) [2040:7240]
3 -> DViCO FusionHDTV USB (au0828) [0fe9:d620] 3 -> DViCO FusionHDTV USB (au0828) [0fe9:d620]
4 -> Hauppauge HVR950Q rev xxF8 (au0828) [2040:7201,2040:7211,2040:7281] 4 -> Hauppauge HVR950Q rev xxF8 (au0828) [2040:7201,2040:7211,2040:7281]
5 -> Hauppauge Woodbury (au0828) [2040:8200] 5 -> Hauppauge Woodbury (au0828) [05e1:0480,2040:8200]
...@@ -159,3 +159,4 @@ ...@@ -159,3 +159,4 @@
158 -> Geovision GV-800(S) (slave) [800b:763d,800c:763d,800d:763d] 158 -> Geovision GV-800(S) (slave) [800b:763d,800c:763d,800d:763d]
159 -> ProVideo PV183 [1830:1540,1831:1540,1832:1540,1833:1540,1834:1540,1835:1540,1836:1540,1837:1540] 159 -> ProVideo PV183 [1830:1540,1831:1540,1832:1540,1833:1540,1834:1540,1835:1540,1836:1540,1837:1540]
160 -> Tongwei Video Technology TD-3116 [f200:3116] 160 -> Tongwei Video Technology TD-3116 [f200:3116]
161 -> Aposonic W-DVR [0279:0228]
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
17 -> NetUP Dual DVB-S2 CI [1b55:2a2c] 17 -> NetUP Dual DVB-S2 CI [1b55:2a2c]
18 -> Hauppauge WinTV-HVR1270 [0070:2211] 18 -> Hauppauge WinTV-HVR1270 [0070:2211]
19 -> Hauppauge WinTV-HVR1275 [0070:2215,0070:221d,0070:22f2] 19 -> Hauppauge WinTV-HVR1275 [0070:2215,0070:221d,0070:22f2]
20 -> Hauppauge WinTV-HVR1255 [0070:2251,0070:2259,0070:22f1] 20 -> Hauppauge WinTV-HVR1255 [0070:2251,0070:22f1]
21 -> Hauppauge WinTV-HVR1210 [0070:2291,0070:2295,0070:2299,0070:229d,0070:22f0,0070:22f3,0070:22f4,0070:22f5] 21 -> Hauppauge WinTV-HVR1210 [0070:2291,0070:2295,0070:2299,0070:229d,0070:22f0,0070:22f3,0070:22f4,0070:22f5]
22 -> Mygica X8506 DMB-TH [14f1:8651] 22 -> Mygica X8506 DMB-TH [14f1:8651]
23 -> Magic-Pro ProHDTV Extreme 2 [14f1:8657] 23 -> Magic-Pro ProHDTV Extreme 2 [14f1:8657]
...@@ -33,3 +33,5 @@ ...@@ -33,3 +33,5 @@
32 -> MPX-885 32 -> MPX-885
33 -> Mygica X8507 [14f1:8502] 33 -> Mygica X8507 [14f1:8502]
34 -> TerraTec Cinergy T PCIe Dual [153b:117e] 34 -> TerraTec Cinergy T PCIe Dual [153b:117e]
35 -> TeVii S471 [d471:9022]
36 -> Hauppauge WinTV-HVR1255 [0070:2259]
...@@ -188,3 +188,4 @@ ...@@ -188,3 +188,4 @@
187 -> Beholder BeholdTV 503 FM [5ace:5030] 187 -> Beholder BeholdTV 503 FM [5ace:5030]
188 -> Sensoray 811/911 [6000:0811,6000:0911] 188 -> Sensoray 811/911 [6000:0811,6000:0911]
189 -> Kworld PC150-U [17de:a134] 189 -> Kworld PC150-U [17de:a134]
190 -> Asus My Cinema PS3-100 [1043:48cd]
...@@ -1928,6 +1928,7 @@ static const struct hid_device_id hid_ignore_list[] = { ...@@ -1928,6 +1928,7 @@ static const struct hid_device_id hid_ignore_list[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_GRETAGMACBETH, USB_DEVICE_ID_GRETAGMACBETH_HUEY) }, { HID_USB_DEVICE(USB_VENDOR_ID_GRETAGMACBETH, USB_DEVICE_ID_GRETAGMACBETH_HUEY) },
{ HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE) }, { HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE) },
{ HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB) }, { HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB) },
{ HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_RADIOSHARK) },
{ HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_90) }, { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_90) },
{ HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_100) }, { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_100) },
{ HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_101) }, { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_101) },
......
...@@ -333,6 +333,7 @@ ...@@ -333,6 +333,7 @@
#define USB_VENDOR_ID_GRIFFIN 0x077d #define USB_VENDOR_ID_GRIFFIN 0x077d
#define USB_DEVICE_ID_POWERMATE 0x0410 #define USB_DEVICE_ID_POWERMATE 0x0410
#define USB_DEVICE_ID_SOUNDKNOB 0x04AA #define USB_DEVICE_ID_SOUNDKNOB 0x04AA
#define USB_DEVICE_ID_RADIOSHARK 0x627a
#define USB_VENDOR_ID_GTCO 0x078c #define USB_VENDOR_ID_GTCO 0x078c
#define USB_DEVICE_ID_GTCO_90 0x0090 #define USB_DEVICE_ID_GTCO_90 0x0090
......
...@@ -756,7 +756,7 @@ static int check_firmware(struct dvb_frontend *fe, unsigned int type, ...@@ -756,7 +756,7 @@ static int check_firmware(struct dvb_frontend *fe, unsigned int type,
* No need to reload base firmware if it matches and if the tuner * No need to reload base firmware if it matches and if the tuner
* is not at sleep mode * is not at sleep mode
*/ */
if ((priv->state = XC2028_ACTIVE) && if ((priv->state == XC2028_ACTIVE) &&
(((BASE | new_fw.type) & BASE_TYPES) == (((BASE | new_fw.type) & BASE_TYPES) ==
(priv->cur_fw.type & BASE_TYPES))) { (priv->cur_fw.type & BASE_TYPES))) {
tuner_dbg("BASE firmware not changed.\n"); tuner_dbg("BASE firmware not changed.\n");
...@@ -978,7 +978,7 @@ static int xc2028_get_afc(struct dvb_frontend *fe, s32 *afc) ...@@ -978,7 +978,7 @@ static int xc2028_get_afc(struct dvb_frontend *fe, s32 *afc)
/* Get AFC */ /* Get AFC */
rc = xc2028_get_reg(priv, XREG_FREQ_ERROR, &afc_reg); rc = xc2028_get_reg(priv, XREG_FREQ_ERROR, &afc_reg);
if (rc < 0) if (rc < 0)
return rc; goto ret;
*afc = afc_reg * 15625; /* Hz */ *afc = afc_reg * 15625; /* Hz */
......
...@@ -210,13 +210,15 @@ struct xc5000_fw_cfg { ...@@ -210,13 +210,15 @@ struct xc5000_fw_cfg {
u16 size; u16 size;
}; };
#define XC5000A_FIRMWARE "dvb-fe-xc5000-1.6.114.fw"
static const struct xc5000_fw_cfg xc5000a_1_6_114 = { static const struct xc5000_fw_cfg xc5000a_1_6_114 = {
.name = "dvb-fe-xc5000-1.6.114.fw", .name = XC5000A_FIRMWARE,
.size = 12401, .size = 12401,
}; };
#define XC5000C_FIRMWARE "dvb-fe-xc5000c-41.024.5.fw"
static const struct xc5000_fw_cfg xc5000c_41_024_5 = { static const struct xc5000_fw_cfg xc5000c_41_024_5 = {
.name = "dvb-fe-xc5000c-41.024.5.fw", .name = XC5000C_FIRMWARE,
.size = 16497, .size = 16497,
}; };
...@@ -1259,3 +1261,5 @@ EXPORT_SYMBOL(xc5000_attach); ...@@ -1259,3 +1261,5 @@ EXPORT_SYMBOL(xc5000_attach);
MODULE_AUTHOR("Steven Toth"); MODULE_AUTHOR("Steven Toth");
MODULE_DESCRIPTION("Xceive xc5000 silicon tuner driver"); MODULE_DESCRIPTION("Xceive xc5000 silicon tuner driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_FIRMWARE(XC5000A_FIRMWARE);
MODULE_FIRMWARE(XC5000C_FIRMWARE);
...@@ -590,7 +590,7 @@ static int az6007_read_mac_addr(struct dvb_usb_device *d, u8 mac[6]) ...@@ -590,7 +590,7 @@ static int az6007_read_mac_addr(struct dvb_usb_device *d, u8 mac[6])
int ret; int ret;
ret = az6007_read(d, AZ6007_READ_DATA, 6, 0, st->data, 6); ret = az6007_read(d, AZ6007_READ_DATA, 6, 0, st->data, 6);
memcpy(mac, st->data, sizeof(mac)); memcpy(mac, st->data, 6);
if (ret > 0) if (ret > 0)
deb_info("%s: mac is %pM\n", __func__, mac); deb_info("%s: mac is %pM\n", __func__, mac);
......
...@@ -2680,12 +2680,14 @@ static int dib8000_tune(struct dvb_frontend *fe) ...@@ -2680,12 +2680,14 @@ static int dib8000_tune(struct dvb_frontend *fe)
{ {
struct dib8000_state *state = fe->demodulator_priv; struct dib8000_state *state = fe->demodulator_priv;
int ret = 0; int ret = 0;
u16 lock, value, mode = fft_to_mode(state); u16 lock, value, mode;
// we are already tuned - just resuming from suspend // we are already tuned - just resuming from suspend
if (state == NULL) if (state == NULL)
return -EINVAL; return -EINVAL;
mode = fft_to_mode(state);
dib8000_set_bandwidth(fe, state->fe[0]->dtv_property_cache.bandwidth_hz / 1000); dib8000_set_bandwidth(fe, state->fe[0]->dtv_property_cache.bandwidth_hz / 1000);
dib8000_set_channel(state, 0, 0); dib8000_set_channel(state, 0, 0);
......
...@@ -40,6 +40,8 @@ ...@@ -40,6 +40,8 @@
static int debug; static int debug;
static int fake_signal_str = 1; static int fake_signal_str = 1;
#define LGS8GXX_FIRMWARE "lgs8g75.fw"
module_param(debug, int, 0644); module_param(debug, int, 0644);
MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off)."); MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
...@@ -592,7 +594,7 @@ static int lgs8g75_init_data(struct lgs8gxx_state *priv) ...@@ -592,7 +594,7 @@ static int lgs8g75_init_data(struct lgs8gxx_state *priv)
int rc; int rc;
int i; int i;
rc = request_firmware(&fw, "lgs8g75.fw", &priv->i2c->dev); rc = request_firmware(&fw, LGS8GXX_FIRMWARE, &priv->i2c->dev);
if (rc) if (rc)
return rc; return rc;
...@@ -1070,3 +1072,4 @@ EXPORT_SYMBOL(lgs8gxx_attach); ...@@ -1070,3 +1072,4 @@ EXPORT_SYMBOL(lgs8gxx_attach);
MODULE_DESCRIPTION("Legend Silicon LGS8913/LGS8GXX DMB-TH demodulator driver"); MODULE_DESCRIPTION("Legend Silicon LGS8913/LGS8GXX DMB-TH demodulator driver");
MODULE_AUTHOR("David T. L. Wong <davidtlwong@gmail.com>"); MODULE_AUTHOR("David T. L. Wong <davidtlwong@gmail.com>");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_FIRMWARE(LGS8GXX_FIRMWARE);
...@@ -589,7 +589,7 @@ static int rtl2832_set_frontend(struct dvb_frontend *fe) ...@@ -589,7 +589,7 @@ static int rtl2832_set_frontend(struct dvb_frontend *fe)
return -EINVAL; return -EINVAL;
} }
for (j = 0; j < sizeof(bw_params[j]); j++) { for (j = 0; j < sizeof(bw_params[0]); j++) {
ret = rtl2832_wr_regs(priv, 0x1c+j, 1, &bw_params[i][j], 1); ret = rtl2832_wr_regs(priv, 0x1c+j, 1, &bw_params[i][j], 1);
if (ret) if (ret)
goto err; goto err;
......
...@@ -276,16 +276,13 @@ static void smscore_notify_clients(struct smscore_device_t *coredev) ...@@ -276,16 +276,13 @@ static void smscore_notify_clients(struct smscore_device_t *coredev)
static int smscore_notify_callbacks(struct smscore_device_t *coredev, static int smscore_notify_callbacks(struct smscore_device_t *coredev,
struct device *device, int arrival) struct device *device, int arrival)
{ {
struct list_head *next, *first; struct smscore_device_notifyee_t *elem;
int rc = 0; int rc = 0;
/* note: must be called under g_deviceslock */ /* note: must be called under g_deviceslock */
first = &g_smscore_notifyees; list_for_each_entry(elem, &g_smscore_notifyees, entry) {
rc = elem->hotplug(coredev, device, arrival);
for (next = first->next; next != first; next = next->next) {
rc = ((struct smscore_device_notifyee_t *) next)->
hotplug(coredev, device, arrival);
if (rc < 0) if (rc < 0)
break; break;
} }
...@@ -940,29 +937,25 @@ static struct ...@@ -940,29 +937,25 @@ static struct
smscore_client_t *smscore_find_client(struct smscore_device_t *coredev, smscore_client_t *smscore_find_client(struct smscore_device_t *coredev,
int data_type, int id) int data_type, int id)
{ {
struct smscore_client_t *client = NULL; struct list_head *first;
struct list_head *next, *first; struct smscore_client_t *client;
unsigned long flags; unsigned long flags;
struct list_head *firstid, *nextid; struct list_head *firstid;
struct smscore_idlist_t *client_id;
spin_lock_irqsave(&coredev->clientslock, flags); spin_lock_irqsave(&coredev->clientslock, flags);
first = &coredev->clients; first = &coredev->clients;
for (next = first->next; list_for_each_entry(client, first, entry) {
(next != first) && !client; firstid = &client->idlist;
next = next->next) { list_for_each_entry(client_id, firstid, entry) {
firstid = &((struct smscore_client_t *)next)->idlist; if ((client_id->id == id) &&
for (nextid = firstid->next; (client_id->data_type == data_type ||
nextid != firstid; (client_id->data_type == 0)))
nextid = nextid->next) { goto found;
if ((((struct smscore_idlist_t *)nextid)->id == id) &&
(((struct smscore_idlist_t *)nextid)->data_type == data_type ||
(((struct smscore_idlist_t *)nextid)->data_type == 0))) {
client = (struct smscore_client_t *) next;
break;
}
} }
} }
client = NULL;
found:
spin_unlock_irqrestore(&coredev->clientslock, flags); spin_unlock_irqrestore(&coredev->clientslock, flags);
return client; return client;
} }
......
...@@ -57,6 +57,39 @@ config RADIO_MAXIRADIO ...@@ -57,6 +57,39 @@ config RADIO_MAXIRADIO
To compile this driver as a module, choose M here: the To compile this driver as a module, choose M here: the
module will be called radio-maxiradio. module will be called radio-maxiradio.
config RADIO_SHARK
tristate "Griffin radioSHARK USB radio receiver"
depends on USB && SND
---help---
Choose Y here if you have this radio receiver.
There are 2 versions of this device, this driver is for version 1,
which is white.
In order to control your radio card, you will need to use programs
that are compatible with the Video For Linux API. Information on
this API and pointers to "v4l" programs may be found at
<file:Documentation/video4linux/API.html>.
To compile this driver as a module, choose M here: the
module will be called radio-shark.
config RADIO_SHARK2
tristate "Griffin radioSHARK2 USB radio receiver"
depends on USB
---help---
Choose Y here if you have this radio receiver.
There are 2 versions of this device, this driver is for version 2,
which is black.
In order to control your radio card, you will need to use programs
that are compatible with the Video For Linux API. Information on
this API and pointers to "v4l" programs may be found at
<file:Documentation/video4linux/API.html>.
To compile this driver as a module, choose M here: the
module will be called radio-shark2.
config I2C_SI4713 config I2C_SI4713
tristate "I2C driver for Silicon Labs Si4713 device" tristate "I2C driver for Silicon Labs Si4713 device"
......
...@@ -11,6 +11,8 @@ obj-$(CONFIG_RADIO_CADET) += radio-cadet.o ...@@ -11,6 +11,8 @@ obj-$(CONFIG_RADIO_CADET) += radio-cadet.o
obj-$(CONFIG_RADIO_TYPHOON) += radio-typhoon.o obj-$(CONFIG_RADIO_TYPHOON) += radio-typhoon.o
obj-$(CONFIG_RADIO_TERRATEC) += radio-terratec.o obj-$(CONFIG_RADIO_TERRATEC) += radio-terratec.o
obj-$(CONFIG_RADIO_MAXIRADIO) += radio-maxiradio.o obj-$(CONFIG_RADIO_MAXIRADIO) += radio-maxiradio.o
obj-$(CONFIG_RADIO_SHARK) += radio-shark.o
obj-$(CONFIG_RADIO_SHARK2) += shark2.o
obj-$(CONFIG_RADIO_RTRACK) += radio-aimslab.o obj-$(CONFIG_RADIO_RTRACK) += radio-aimslab.o
obj-$(CONFIG_RADIO_ZOLTRIX) += radio-zoltrix.o obj-$(CONFIG_RADIO_ZOLTRIX) += radio-zoltrix.o
obj-$(CONFIG_RADIO_GEMTEK) += radio-gemtek.o obj-$(CONFIG_RADIO_GEMTEK) += radio-gemtek.o
...@@ -29,4 +31,6 @@ obj-$(CONFIG_RADIO_TIMBERDALE) += radio-timb.o ...@@ -29,4 +31,6 @@ obj-$(CONFIG_RADIO_TIMBERDALE) += radio-timb.o
obj-$(CONFIG_RADIO_WL1273) += radio-wl1273.o obj-$(CONFIG_RADIO_WL1273) += radio-wl1273.o
obj-$(CONFIG_RADIO_WL128X) += wl128x/ obj-$(CONFIG_RADIO_WL128X) += wl128x/
shark2-objs := radio-shark2.o radio-tea5777.o
ccflags-y += -Isound ccflags-y += -Isound
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
#ifndef __RADIO_TEA5777_H
#define __RADIO_TEA5777_H
/*
* v4l2 driver for TEA5777 Philips AM/FM radio tuner chips
*
* Copyright (c) 2012 Hans de Goede <hdegoede@redhat.com>
*
* Based on the ALSA driver for TEA5757/5759 Philips AM/FM radio tuner chips:
*
* Copyright (c) 2004 Jaroslav Kysela <perex@perex.cz>
* Copyright (c) 2012 Hans de Goede <hdegoede@redhat.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include <linux/videodev2.h>
#include <media/v4l2-ctrls.h>
#include <media/v4l2-dev.h>
#include <media/v4l2-device.h>
#define TEA575X_FMIF 10700
#define TEA575X_AMIF 450
struct radio_tea5777;
struct radio_tea5777_ops {
/*
* Write the 6 bytes large write register of the tea5777
*
* val represents the 6 write registers, with byte 1 from the
* datasheet being the most significant byte (so byte 5 of the u64),
* and byte 6 from the datasheet being the least significant byte.
*
* returns 0 on success.
*/
int (*write_reg)(struct radio_tea5777 *tea, u64 val);
/*
* Read the 3 bytes large read register of the tea5777
*
* The read value gets returned in val, akin to write_reg, byte 1 from
* the datasheet is stored as the most significant byte (so byte 2 of
* the u32), and byte 3 from the datasheet gets stored as the least
* significant byte (iow byte 0 of the u32).
*
* returns 0 on success.
*/
int (*read_reg)(struct radio_tea5777 *tea, u32 *val);
};
struct radio_tea5777 {
struct v4l2_device *v4l2_dev;
struct v4l2_file_operations fops;
struct video_device vd; /* video device */
bool has_am; /* Device can tune to AM freqs */
bool write_before_read; /* must write before read quirk */
bool needs_write; /* for write before read quirk */
u32 freq; /* current frequency */
u32 seek_rangelow; /* current hwseek limits */
u32 seek_rangehigh;
u32 read_reg;
u64 write_reg;
struct mutex mutex;
struct radio_tea5777_ops *ops;
void *private_data;
u8 card[32];
u8 bus_info[32];
struct v4l2_ctrl_handler ctrl_handler;
};
int radio_tea5777_init(struct radio_tea5777 *tea, struct module *owner);
void radio_tea5777_exit(struct radio_tea5777 *tea);
#endif /* __RADIO_TEA5777_H */
...@@ -350,7 +350,9 @@ static int __devinit si470x_i2c_probe(struct i2c_client *client, ...@@ -350,7 +350,9 @@ static int __devinit si470x_i2c_probe(struct i2c_client *client,
} }
radio->client = client; radio->client = client;
radio->band = 1; /* Default to 76 - 108 MHz */
mutex_init(&radio->lock); mutex_init(&radio->lock);
init_completion(&radio->completion);
/* video device initialization */ /* video device initialization */
radio->videodev = si470x_viddev_template; radio->videodev = si470x_viddev_template;
...@@ -406,10 +408,6 @@ static int __devinit si470x_i2c_probe(struct i2c_client *client, ...@@ -406,10 +408,6 @@ static int __devinit si470x_i2c_probe(struct i2c_client *client,
radio->rd_index = 0; radio->rd_index = 0;
init_waitqueue_head(&radio->read_queue); init_waitqueue_head(&radio->read_queue);
/* mark Seek/Tune Complete Interrupt enabled */
radio->stci_enabled = true;
init_completion(&radio->completion);
retval = request_threaded_irq(client->irq, NULL, si470x_i2c_interrupt, retval = request_threaded_irq(client->irq, NULL, si470x_i2c_interrupt,
IRQF_TRIGGER_FALLING, DRIVER_NAME, radio); IRQF_TRIGGER_FALLING, DRIVER_NAME, radio);
if (retval) { if (retval) {
......
...@@ -143,7 +143,7 @@ MODULE_PARM_DESC(max_rds_errors, "RDS maximum block errors: *1*"); ...@@ -143,7 +143,7 @@ MODULE_PARM_DESC(max_rds_errors, "RDS maximum block errors: *1*");
* Software/Hardware Versions from Scratch Page * Software/Hardware Versions from Scratch Page
**************************************************************************/ **************************************************************************/
#define RADIO_SW_VERSION_NOT_BOOTLOADABLE 6 #define RADIO_SW_VERSION_NOT_BOOTLOADABLE 6
#define RADIO_SW_VERSION 7 #define RADIO_SW_VERSION 1
#define RADIO_HW_VERSION 1 #define RADIO_HW_VERSION 1
...@@ -399,12 +399,19 @@ static void si470x_int_in_callback(struct urb *urb) ...@@ -399,12 +399,19 @@ static void si470x_int_in_callback(struct urb *urb)
} }
} }
if ((radio->registers[SYSCONFIG1] & SYSCONFIG1_RDS) == 0) /* Sometimes the device returns len 0 packets */
if (urb->actual_length != RDS_REPORT_SIZE)
goto resubmit; goto resubmit;
if (urb->actual_length > 0) { radio->registers[STATUSRSSI] =
get_unaligned_be16(&radio->int_in_buffer[1]);
if (radio->registers[STATUSRSSI] & STATUSRSSI_STC)
complete(&radio->completion);
if ((radio->registers[SYSCONFIG1] & SYSCONFIG1_RDS)) {
/* Update RDS registers with URB data */ /* Update RDS registers with URB data */
for (regnr = 0; regnr < RDS_REGISTER_NUM; regnr++) for (regnr = 1; regnr < RDS_REGISTER_NUM; regnr++)
radio->registers[STATUSRSSI + regnr] = radio->registers[STATUSRSSI + regnr] =
get_unaligned_be16(&radio->int_in_buffer[ get_unaligned_be16(&radio->int_in_buffer[
regnr * RADIO_REGISTER_SIZE + 1]); regnr * RADIO_REGISTER_SIZE + 1]);
...@@ -480,6 +487,7 @@ static void si470x_int_in_callback(struct urb *urb) ...@@ -480,6 +487,7 @@ static void si470x_int_in_callback(struct urb *urb)
radio->int_in_running = 0; radio->int_in_running = 0;
} }
} }
radio->status_rssi_auto_update = radio->int_in_running;
} }
...@@ -534,13 +542,6 @@ static int si470x_start_usb(struct si470x_device *radio) ...@@ -534,13 +542,6 @@ static int si470x_start_usb(struct si470x_device *radio)
{ {
int retval; int retval;
/* start radio */
retval = si470x_start(radio);
if (retval < 0)
return retval;
v4l2_ctrl_handler_setup(&radio->hdl);
/* initialize interrupt urb */ /* initialize interrupt urb */
usb_fill_int_urb(radio->int_in_urb, radio->usbdev, usb_fill_int_urb(radio->int_in_urb, radio->usbdev,
usb_rcvintpipe(radio->usbdev, usb_rcvintpipe(radio->usbdev,
...@@ -560,6 +561,15 @@ static int si470x_start_usb(struct si470x_device *radio) ...@@ -560,6 +561,15 @@ static int si470x_start_usb(struct si470x_device *radio)
"submitting int urb failed (%d)\n", retval); "submitting int urb failed (%d)\n", retval);
radio->int_in_running = 0; radio->int_in_running = 0;
} }
radio->status_rssi_auto_update = radio->int_in_running;
/* start radio */
retval = si470x_start(radio);
if (retval < 0)
return retval;
v4l2_ctrl_handler_setup(&radio->hdl);
return retval; return retval;
} }
...@@ -587,7 +597,9 @@ static int si470x_usb_driver_probe(struct usb_interface *intf, ...@@ -587,7 +597,9 @@ static int si470x_usb_driver_probe(struct usb_interface *intf,
} }
radio->usbdev = interface_to_usbdev(intf); radio->usbdev = interface_to_usbdev(intf);
radio->intf = intf; radio->intf = intf;
radio->band = 1; /* Default to 76 - 108 MHz */
mutex_init(&radio->lock); mutex_init(&radio->lock);
init_completion(&radio->completion);
iface_desc = intf->cur_altsetting; iface_desc = intf->cur_altsetting;
...@@ -698,9 +710,6 @@ static int si470x_usb_driver_probe(struct usb_interface *intf, ...@@ -698,9 +710,6 @@ static int si470x_usb_driver_probe(struct usb_interface *intf,
"linux-media@vger.kernel.org\n"); "linux-media@vger.kernel.org\n");
} }
/* set initial frequency */
si470x_set_freq(radio, 87.5 * FREQ_MUL); /* available in all regions */
/* set led to connect state */ /* set led to connect state */
si470x_set_led_state(radio, BLINK_GREEN_LED); si470x_set_led_state(radio, BLINK_GREEN_LED);
...@@ -723,6 +732,9 @@ static int si470x_usb_driver_probe(struct usb_interface *intf, ...@@ -723,6 +732,9 @@ static int si470x_usb_driver_probe(struct usb_interface *intf,
if (retval < 0) if (retval < 0)
goto err_all; goto err_all;
/* set initial frequency */
si470x_set_freq(radio, 87.5 * FREQ_MUL); /* available in all regions */
/* register video device */ /* register video device */
retval = video_register_device(&radio->videodev, VFL_TYPE_RADIO, retval = video_register_device(&radio->videodev, VFL_TYPE_RADIO,
radio_nr); radio_nr);
...@@ -781,11 +793,16 @@ static int si470x_usb_driver_suspend(struct usb_interface *intf, ...@@ -781,11 +793,16 @@ static int si470x_usb_driver_suspend(struct usb_interface *intf,
static int si470x_usb_driver_resume(struct usb_interface *intf) static int si470x_usb_driver_resume(struct usb_interface *intf)
{ {
struct si470x_device *radio = usb_get_intfdata(intf); struct si470x_device *radio = usb_get_intfdata(intf);
int ret;
dev_info(&intf->dev, "resuming now...\n"); dev_info(&intf->dev, "resuming now...\n");
/* start radio */ /* start radio */
return si470x_start_usb(radio); ret = si470x_start_usb(radio);
if (ret == 0)
v4l2_ctrl_handler_setup(&radio->hdl);
return ret;
} }
......
...@@ -87,7 +87,7 @@ ...@@ -87,7 +87,7 @@
#define SYSCONFIG2 5 /* System Configuration 2 */ #define SYSCONFIG2 5 /* System Configuration 2 */
#define SYSCONFIG2_SEEKTH 0xff00 /* bits 15..08: RSSI Seek Threshold */ #define SYSCONFIG2_SEEKTH 0xff00 /* bits 15..08: RSSI Seek Threshold */
#define SYSCONFIG2_BAND 0x0080 /* bits 07..06: Band Select */ #define SYSCONFIG2_BAND 0x00c0 /* bits 07..06: Band Select */
#define SYSCONFIG2_SPACE 0x0030 /* bits 05..04: Channel Spacing */ #define SYSCONFIG2_SPACE 0x0030 /* bits 05..04: Channel Spacing */
#define SYSCONFIG2_VOLUME 0x000f /* bits 03..00: Volume */ #define SYSCONFIG2_VOLUME 0x000f /* bits 03..00: Volume */
...@@ -147,6 +147,7 @@ struct si470x_device { ...@@ -147,6 +147,7 @@ struct si470x_device {
struct v4l2_device v4l2_dev; struct v4l2_device v4l2_dev;
struct video_device videodev; struct video_device videodev;
struct v4l2_ctrl_handler hdl; struct v4l2_ctrl_handler hdl;
int band;
/* Silabs internal registers (0..15) */ /* Silabs internal registers (0..15) */
unsigned short registers[RADIO_REGISTER_NUM]; unsigned short registers[RADIO_REGISTER_NUM];
...@@ -160,7 +161,7 @@ struct si470x_device { ...@@ -160,7 +161,7 @@ struct si470x_device {
unsigned int wr_index; unsigned int wr_index;
struct completion completion; struct completion completion;
bool stci_enabled; /* Seek/Tune Complete Interrupt */ bool status_rssi_auto_update; /* Does RSSI get updated automatic? */
#if defined(CONFIG_USB_SI470X) || defined(CONFIG_USB_SI470X_MODULE) #if defined(CONFIG_USB_SI470X) || defined(CONFIG_USB_SI470X_MODULE)
/* reference to USB and video device */ /* reference to USB and video device */
...@@ -189,7 +190,7 @@ struct si470x_device { ...@@ -189,7 +190,7 @@ struct si470x_device {
* Firmware Versions * Firmware Versions
**************************************************************************/ **************************************************************************/
#define RADIO_FW_VERSION 15 #define RADIO_FW_VERSION 12
......
...@@ -259,6 +259,17 @@ config IR_WINBOND_CIR ...@@ -259,6 +259,17 @@ config IR_WINBOND_CIR
To compile this driver as a module, choose M here: the module will To compile this driver as a module, choose M here: the module will
be called winbond_cir. be called winbond_cir.
config IR_IGUANA
tristate "IguanaWorks USB IR Transceiver"
depends on RC_CORE
select USB
---help---
Say Y here if you want to use the IgaunaWorks USB IR Transceiver.
Both infrared receive and send are supported.
To compile this driver as a module, choose M here: the module will
be called iguanair.
config RC_LOOPBACK config RC_LOOPBACK
tristate "Remote Control Loopback Driver" tristate "Remote Control Loopback Driver"
depends on RC_CORE depends on RC_CORE
......
...@@ -27,3 +27,4 @@ obj-$(CONFIG_IR_STREAMZAP) += streamzap.o ...@@ -27,3 +27,4 @@ obj-$(CONFIG_IR_STREAMZAP) += streamzap.o
obj-$(CONFIG_IR_WINBOND_CIR) += winbond-cir.o obj-$(CONFIG_IR_WINBOND_CIR) += winbond-cir.o
obj-$(CONFIG_RC_LOOPBACK) += rc-loopback.o obj-$(CONFIG_RC_LOOPBACK) += rc-loopback.o
obj-$(CONFIG_IR_GPIO_CIR) += gpio-ir-recv.o obj-$(CONFIG_IR_GPIO_CIR) += gpio-ir-recv.o
obj-$(CONFIG_IR_IGUANA) += iguanair.o
...@@ -147,7 +147,8 @@ static bool mouse = true; ...@@ -147,7 +147,8 @@ static bool mouse = true;
module_param(mouse, bool, 0444); module_param(mouse, bool, 0444);
MODULE_PARM_DESC(mouse, "Enable mouse device, default = yes"); MODULE_PARM_DESC(mouse, "Enable mouse device, default = yes");
#define dbginfo(dev, format, arg...) do { if (debug) dev_info(dev , format , ## arg); } while (0) #define dbginfo(dev, format, arg...) \
do { if (debug) dev_info(dev , format , ## arg); } while (0)
#undef err #undef err
#define err(format, arg...) printk(KERN_ERR format , ## arg) #define err(format, arg...) printk(KERN_ERR format , ## arg)
...@@ -191,17 +192,41 @@ static const char *get_medion_keymap(struct usb_interface *interface) ...@@ -191,17 +192,41 @@ static const char *get_medion_keymap(struct usb_interface *interface)
return RC_MAP_MEDION_X10; return RC_MAP_MEDION_X10;
} }
static const struct ati_receiver_type type_ati = { .default_keymap = RC_MAP_ATI_X10 }; static const struct ati_receiver_type type_ati = {
static const struct ati_receiver_type type_medion = { .get_default_keymap = get_medion_keymap }; .default_keymap = RC_MAP_ATI_X10
static const struct ati_receiver_type type_firefly = { .default_keymap = RC_MAP_SNAPSTREAM_FIREFLY }; };
static const struct ati_receiver_type type_medion = {
.get_default_keymap = get_medion_keymap
};
static const struct ati_receiver_type type_firefly = {
.default_keymap = RC_MAP_SNAPSTREAM_FIREFLY
};
static struct usb_device_id ati_remote_table[] = { static struct usb_device_id ati_remote_table[] = {
{ USB_DEVICE(ATI_REMOTE_VENDOR_ID, LOLA_REMOTE_PRODUCT_ID), .driver_info = (unsigned long)&type_ati }, {
{ USB_DEVICE(ATI_REMOTE_VENDOR_ID, LOLA2_REMOTE_PRODUCT_ID), .driver_info = (unsigned long)&type_ati }, USB_DEVICE(ATI_REMOTE_VENDOR_ID, LOLA_REMOTE_PRODUCT_ID),
{ USB_DEVICE(ATI_REMOTE_VENDOR_ID, ATI_REMOTE_PRODUCT_ID), .driver_info = (unsigned long)&type_ati }, .driver_info = (unsigned long)&type_ati
{ USB_DEVICE(ATI_REMOTE_VENDOR_ID, NVIDIA_REMOTE_PRODUCT_ID), .driver_info = (unsigned long)&type_ati }, },
{ USB_DEVICE(ATI_REMOTE_VENDOR_ID, MEDION_REMOTE_PRODUCT_ID), .driver_info = (unsigned long)&type_medion }, {
{ USB_DEVICE(ATI_REMOTE_VENDOR_ID, FIREFLY_REMOTE_PRODUCT_ID), .driver_info = (unsigned long)&type_firefly }, USB_DEVICE(ATI_REMOTE_VENDOR_ID, LOLA2_REMOTE_PRODUCT_ID),
.driver_info = (unsigned long)&type_ati
},
{
USB_DEVICE(ATI_REMOTE_VENDOR_ID, ATI_REMOTE_PRODUCT_ID),
.driver_info = (unsigned long)&type_ati
},
{
USB_DEVICE(ATI_REMOTE_VENDOR_ID, NVIDIA_REMOTE_PRODUCT_ID),
.driver_info = (unsigned long)&type_ati
},
{
USB_DEVICE(ATI_REMOTE_VENDOR_ID, MEDION_REMOTE_PRODUCT_ID),
.driver_info = (unsigned long)&type_medion
},
{
USB_DEVICE(ATI_REMOTE_VENDOR_ID, FIREFLY_REMOTE_PRODUCT_ID),
.driver_info = (unsigned long)&type_firefly
},
{} /* Terminating entry */ {} /* Terminating entry */
}; };
...@@ -296,25 +321,8 @@ static const struct { ...@@ -296,25 +321,8 @@ static const struct {
{KIND_END, 0x00, EV_MAX + 1, 0, 0} {KIND_END, 0x00, EV_MAX + 1, 0, 0}
}; };
/* Local function prototypes */
static int ati_remote_sendpacket (struct ati_remote *ati_remote, u16 cmd, unsigned char *data);
static void ati_remote_irq_out (struct urb *urb);
static void ati_remote_irq_in (struct urb *urb);
static void ati_remote_input_report (struct urb *urb);
static int ati_remote_initialize (struct ati_remote *ati_remote);
static int ati_remote_probe (struct usb_interface *interface, const struct usb_device_id *id);
static void ati_remote_disconnect (struct usb_interface *interface);
/* usb specific object to register with the usb subsystem */
static struct usb_driver ati_remote_driver = {
.name = "ati_remote",
.probe = ati_remote_probe,
.disconnect = ati_remote_disconnect,
.id_table = ati_remote_table,
};
/* /*
* ati_remote_dump_input * ati_remote_dump_input
*/ */
static void ati_remote_dump(struct device *dev, unsigned char *data, static void ati_remote_dump(struct device *dev, unsigned char *data,
unsigned int len) unsigned int len)
...@@ -326,12 +334,14 @@ static void ati_remote_dump(struct device *dev, unsigned char *data, ...@@ -326,12 +334,14 @@ static void ati_remote_dump(struct device *dev, unsigned char *data,
dev_warn(dev, "Weird key %02x %02x %02x %02x\n", dev_warn(dev, "Weird key %02x %02x %02x %02x\n",
data[0], data[1], data[2], data[3]); data[0], data[1], data[2], data[3]);
else else
dev_warn(dev, "Weird data, len=%d %02x %02x %02x %02x %02x %02x ...\n", dev_warn(dev,
len, data[0], data[1], data[2], data[3], data[4], data[5]); "Weird data, len=%d %02x %02x %02x %02x %02x %02x ...\n",
len, data[0], data[1], data[2], data[3], data[4],
data[5]);
} }
/* /*
* ati_remote_open * ati_remote_open
*/ */
static int ati_remote_open(struct ati_remote *ati_remote) static int ati_remote_open(struct ati_remote *ati_remote)
{ {
...@@ -355,7 +365,7 @@ out: mutex_unlock(&ati_remote->open_mutex); ...@@ -355,7 +365,7 @@ out: mutex_unlock(&ati_remote->open_mutex);
} }
/* /*
* ati_remote_close * ati_remote_close
*/ */
static void ati_remote_close(struct ati_remote *ati_remote) static void ati_remote_close(struct ati_remote *ati_remote)
{ {
...@@ -390,7 +400,7 @@ static void ati_remote_rc_close(struct rc_dev *rdev) ...@@ -390,7 +400,7 @@ static void ati_remote_rc_close(struct rc_dev *rdev)
} }
/* /*
* ati_remote_irq_out * ati_remote_irq_out
*/ */
static void ati_remote_irq_out(struct urb *urb) static void ati_remote_irq_out(struct urb *urb)
{ {
...@@ -408,11 +418,12 @@ static void ati_remote_irq_out(struct urb *urb) ...@@ -408,11 +418,12 @@ static void ati_remote_irq_out(struct urb *urb)
} }
/* /*
* ati_remote_sendpacket * ati_remote_sendpacket
* *
* Used to send device initialization strings * Used to send device initialization strings
*/ */
static int ati_remote_sendpacket(struct ati_remote *ati_remote, u16 cmd, unsigned char *data) static int ati_remote_sendpacket(struct ati_remote *ati_remote, u16 cmd,
unsigned char *data)
{ {
int retval = 0; int retval = 0;
...@@ -441,7 +452,7 @@ static int ati_remote_sendpacket(struct ati_remote *ati_remote, u16 cmd, unsigne ...@@ -441,7 +452,7 @@ static int ati_remote_sendpacket(struct ati_remote *ati_remote, u16 cmd, unsigne
} }
/* /*
* ati_remote_compute_accel * ati_remote_compute_accel
* *
* Implements acceleration curve for directional control pad * Implements acceleration curve for directional control pad
* If elapsed time since last event is > 1/4 second, user "stopped", * If elapsed time since last event is > 1/4 second, user "stopped",
...@@ -478,7 +489,7 @@ static int ati_remote_compute_accel(struct ati_remote *ati_remote) ...@@ -478,7 +489,7 @@ static int ati_remote_compute_accel(struct ati_remote *ati_remote)
} }
/* /*
* ati_remote_report_input * ati_remote_report_input
*/ */
static void ati_remote_input_report(struct urb *urb) static void ati_remote_input_report(struct urb *urb)
{ {
...@@ -518,7 +529,8 @@ static void ati_remote_input_report(struct urb *urb) ...@@ -518,7 +529,8 @@ static void ati_remote_input_report(struct urb *urb)
remote_num = (data[3] >> 4) & 0x0f; remote_num = (data[3] >> 4) & 0x0f;
if (channel_mask & (1 << (remote_num + 1))) { if (channel_mask & (1 << (remote_num + 1))) {
dbginfo(&ati_remote->interface->dev, dbginfo(&ati_remote->interface->dev,
"Masked input from channel 0x%02x: data %02x,%02x, mask= 0x%02lx\n", "Masked input from channel 0x%02x: data %02x,%02x, "
"mask= 0x%02lx\n",
remote_num, data[1], data[2], channel_mask); remote_num, data[1], data[2], channel_mask);
return; return;
} }
...@@ -546,7 +558,9 @@ static void ati_remote_input_report(struct urb *urb) ...@@ -546,7 +558,9 @@ static void ati_remote_input_report(struct urb *urb)
if (wheel_keycode == KEY_RESERVED) { if (wheel_keycode == KEY_RESERVED) {
/* scrollwheel was not mapped, assume mouse */ /* scrollwheel was not mapped, assume mouse */
/* Look up event code index in the mouse translation table. */ /* Look up event code index in the mouse translation
* table.
*/
for (i = 0; ati_remote_tbl[i].kind != KIND_END; i++) { for (i = 0; ati_remote_tbl[i].kind != KIND_END; i++) {
if (scancode == ati_remote_tbl[i].data) { if (scancode == ati_remote_tbl[i].data) {
index = i; index = i;
...@@ -630,9 +644,9 @@ static void ati_remote_input_report(struct urb *urb) ...@@ -630,9 +644,9 @@ static void ati_remote_input_report(struct urb *urb)
} else { } else {
/* /*
* Other event kinds are from the directional control pad, and have an * Other event kinds are from the directional control pad, and
* acceleration factor applied to them. Without this acceleration, the * have an acceleration factor applied to them. Without this
* control pad is mostly unusable. * acceleration, the control pad is mostly unusable.
*/ */
acc = ati_remote_compute_accel(ati_remote); acc = ati_remote_compute_accel(ati_remote);
...@@ -659,7 +673,8 @@ static void ati_remote_input_report(struct urb *urb) ...@@ -659,7 +673,8 @@ static void ati_remote_input_report(struct urb *urb)
input_report_rel(dev, REL_Y, acc); input_report_rel(dev, REL_Y, acc);
break; break;
default: default:
dev_dbg(&ati_remote->interface->dev, "ati_remote kind=%d\n", dev_dbg(&ati_remote->interface->dev,
"ati_remote kind=%d\n",
ati_remote_tbl[index].kind); ati_remote_tbl[index].kind);
} }
input_sync(dev); input_sync(dev);
...@@ -670,7 +685,7 @@ static void ati_remote_input_report(struct urb *urb) ...@@ -670,7 +685,7 @@ static void ati_remote_input_report(struct urb *urb)
} }
/* /*
* ati_remote_irq_in * ati_remote_irq_in
*/ */
static void ati_remote_irq_in(struct urb *urb) static void ati_remote_irq_in(struct urb *urb)
{ {
...@@ -684,22 +699,25 @@ static void ati_remote_irq_in(struct urb *urb) ...@@ -684,22 +699,25 @@ static void ati_remote_irq_in(struct urb *urb)
case -ECONNRESET: /* unlink */ case -ECONNRESET: /* unlink */
case -ENOENT: case -ENOENT:
case -ESHUTDOWN: case -ESHUTDOWN:
dev_dbg(&ati_remote->interface->dev, "%s: urb error status, unlink? \n", dev_dbg(&ati_remote->interface->dev,
"%s: urb error status, unlink?\n",
__func__); __func__);
return; return;
default: /* error */ default: /* error */
dev_dbg(&ati_remote->interface->dev, "%s: Nonzero urb status %d\n", dev_dbg(&ati_remote->interface->dev,
"%s: Nonzero urb status %d\n",
__func__, urb->status); __func__, urb->status);
} }
retval = usb_submit_urb(urb, GFP_ATOMIC); retval = usb_submit_urb(urb, GFP_ATOMIC);
if (retval) if (retval)
dev_err(&ati_remote->interface->dev, "%s: usb_submit_urb()=%d\n", dev_err(&ati_remote->interface->dev,
"%s: usb_submit_urb()=%d\n",
__func__, retval); __func__, retval);
} }
/* /*
* ati_remote_alloc_buffers * ati_remote_alloc_buffers
*/ */
static int ati_remote_alloc_buffers(struct usb_device *udev, static int ati_remote_alloc_buffers(struct usb_device *udev,
struct ati_remote *ati_remote) struct ati_remote *ati_remote)
...@@ -726,7 +744,7 @@ static int ati_remote_alloc_buffers(struct usb_device *udev, ...@@ -726,7 +744,7 @@ static int ati_remote_alloc_buffers(struct usb_device *udev,
} }
/* /*
* ati_remote_free_buffers * ati_remote_free_buffers
*/ */
static void ati_remote_free_buffers(struct ati_remote *ati_remote) static void ati_remote_free_buffers(struct ati_remote *ati_remote)
{ {
...@@ -825,9 +843,10 @@ static int ati_remote_initialize(struct ati_remote *ati_remote) ...@@ -825,9 +843,10 @@ static int ati_remote_initialize(struct ati_remote *ati_remote)
} }
/* /*
* ati_remote_probe * ati_remote_probe
*/ */
static int ati_remote_probe(struct usb_interface *interface, const struct usb_device_id *id) static int ati_remote_probe(struct usb_interface *interface,
const struct usb_device_id *id)
{ {
struct usb_device *udev = interface_to_usbdev(interface); struct usb_device *udev = interface_to_usbdev(interface);
struct usb_host_interface *iface_host = interface->cur_altsetting; struct usb_host_interface *iface_host = interface->cur_altsetting;
...@@ -949,7 +968,7 @@ static int ati_remote_probe(struct usb_interface *interface, const struct usb_de ...@@ -949,7 +968,7 @@ static int ati_remote_probe(struct usb_interface *interface, const struct usb_de
} }
/* /*
* ati_remote_disconnect * ati_remote_disconnect
*/ */
static void ati_remote_disconnect(struct usb_interface *interface) static void ati_remote_disconnect(struct usb_interface *interface)
{ {
...@@ -971,6 +990,14 @@ static void ati_remote_disconnect(struct usb_interface *interface) ...@@ -971,6 +990,14 @@ static void ati_remote_disconnect(struct usb_interface *interface)
kfree(ati_remote); kfree(ati_remote);
} }
/* usb specific object to register with the usb subsystem */
static struct usb_driver ati_remote_driver = {
.name = "ati_remote",
.probe = ati_remote_probe,
.disconnect = ati_remote_disconnect,
.id_table = ati_remote_table,
};
module_usb_driver(ati_remote_driver); module_usb_driver(ati_remote_driver);
MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_AUTHOR(DRIVER_AUTHOR);
......
This diff is collapsed.
...@@ -199,6 +199,7 @@ static bool debug; ...@@ -199,6 +199,7 @@ static bool debug;
#define VENDOR_REALTEK 0x0bda #define VENDOR_REALTEK 0x0bda
#define VENDOR_TIVO 0x105a #define VENDOR_TIVO 0x105a
#define VENDOR_CONEXANT 0x0572 #define VENDOR_CONEXANT 0x0572
#define VENDOR_TWISTEDMELON 0x2596
enum mceusb_model_type { enum mceusb_model_type {
MCE_GEN2 = 0, /* Most boards */ MCE_GEN2 = 0, /* Most boards */
...@@ -391,6 +392,12 @@ static struct usb_device_id mceusb_dev_table[] = { ...@@ -391,6 +392,12 @@ static struct usb_device_id mceusb_dev_table[] = {
/* Conexant Hybrid TV RDU253S Polaris */ /* Conexant Hybrid TV RDU253S Polaris */
{ USB_DEVICE(VENDOR_CONEXANT, 0x58a5), { USB_DEVICE(VENDOR_CONEXANT, 0x58a5),
.driver_info = CX_HYBRID_TV }, .driver_info = CX_HYBRID_TV },
/* Twisted Melon Inc. - Manta Mini Receiver */
{ USB_DEVICE(VENDOR_TWISTEDMELON, 0x8008) },
/* Twisted Melon Inc. - Manta Pico Receiver */
{ USB_DEVICE(VENDOR_TWISTEDMELON, 0x8016) },
/* Twisted Melon Inc. - Manta Transceiver */
{ USB_DEVICE(VENDOR_TWISTEDMELON, 0x8042) },
/* Terminating entry */ /* Terminating entry */
{ } { }
}; };
...@@ -410,14 +417,12 @@ struct mceusb_dev { ...@@ -410,14 +417,12 @@ struct mceusb_dev {
/* usb */ /* usb */
struct usb_device *usbdev; struct usb_device *usbdev;
struct urb *urb_in; struct urb *urb_in;
struct usb_endpoint_descriptor *usb_ep_in;
struct usb_endpoint_descriptor *usb_ep_out; struct usb_endpoint_descriptor *usb_ep_out;
/* buffers and dma */ /* buffers and dma */
unsigned char *buf_in; unsigned char *buf_in;
unsigned int len_in; unsigned int len_in;
dma_addr_t dma_in; dma_addr_t dma_in;
dma_addr_t dma_out;
enum { enum {
CMD_HEADER = 0, CMD_HEADER = 0,
...@@ -686,7 +691,7 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, char *buf, ...@@ -686,7 +691,7 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, char *buf,
dev_info(dev, "Raw IR data, %d pulse/space samples\n", ir->rem); dev_info(dev, "Raw IR data, %d pulse/space samples\n", ir->rem);
} }
static void mce_async_callback(struct urb *urb, struct pt_regs *regs) static void mce_async_callback(struct urb *urb)
{ {
struct mceusb_dev *ir; struct mceusb_dev *ir;
int len; int len;
...@@ -733,7 +738,7 @@ static void mce_request_packet(struct mceusb_dev *ir, unsigned char *data, ...@@ -733,7 +738,7 @@ static void mce_request_packet(struct mceusb_dev *ir, unsigned char *data,
pipe = usb_sndintpipe(ir->usbdev, pipe = usb_sndintpipe(ir->usbdev,
ir->usb_ep_out->bEndpointAddress); ir->usb_ep_out->bEndpointAddress);
usb_fill_int_urb(async_urb, ir->usbdev, pipe, usb_fill_int_urb(async_urb, ir->usbdev, pipe,
async_buf, size, (usb_complete_t)mce_async_callback, async_buf, size, mce_async_callback,
ir, ir->usb_ep_out->bInterval); ir, ir->usb_ep_out->bInterval);
memcpy(async_buf, data, size); memcpy(async_buf, data, size);
...@@ -1031,7 +1036,7 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len) ...@@ -1031,7 +1036,7 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len)
ir_raw_event_handle(ir->rc); ir_raw_event_handle(ir->rc);
} }
static void mceusb_dev_recv(struct urb *urb, struct pt_regs *regs) static void mceusb_dev_recv(struct urb *urb)
{ {
struct mceusb_dev *ir; struct mceusb_dev *ir;
int buf_len; int buf_len;
...@@ -1331,7 +1336,6 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf, ...@@ -1331,7 +1336,6 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
ir->model = model; ir->model = model;
/* Saving usb interface data for use by the transmitter routine */ /* Saving usb interface data for use by the transmitter routine */
ir->usb_ep_in = ep_in;
ir->usb_ep_out = ep_out; ir->usb_ep_out = ep_out;
if (dev->descriptor.iManufacturer if (dev->descriptor.iManufacturer
...@@ -1349,8 +1353,8 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf, ...@@ -1349,8 +1353,8 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
goto rc_dev_fail; goto rc_dev_fail;
/* wire up inbound data handler */ /* wire up inbound data handler */
usb_fill_int_urb(ir->urb_in, dev, pipe, ir->buf_in, usb_fill_int_urb(ir->urb_in, dev, pipe, ir->buf_in, maxp,
maxp, (usb_complete_t) mceusb_dev_recv, ir, ep_in->bInterval); mceusb_dev_recv, ir, ep_in->bInterval);
ir->urb_in->transfer_dma = ir->dma_in; ir->urb_in->transfer_dma = ir->dma_in;
ir->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; ir->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
......
...@@ -775,10 +775,11 @@ static ssize_t show_protocols(struct device *device, ...@@ -775,10 +775,11 @@ static ssize_t show_protocols(struct device *device,
if (dev->driver_type == RC_DRIVER_SCANCODE) { if (dev->driver_type == RC_DRIVER_SCANCODE) {
enabled = dev->rc_map.rc_type; enabled = dev->rc_map.rc_type;
allowed = dev->allowed_protos; allowed = dev->allowed_protos;
} else { } else if (dev->raw) {
enabled = dev->raw->enabled_protocols; enabled = dev->raw->enabled_protocols;
allowed = ir_raw_get_allowed_protocols(); allowed = ir_raw_get_allowed_protocols();
} } else
return -ENODEV;
IR_dprintk(1, "allowed - 0x%llx, enabled - 0x%llx\n", IR_dprintk(1, "allowed - 0x%llx, enabled - 0x%llx\n",
(long long)allowed, (long long)allowed,
......
This diff is collapsed.
...@@ -345,7 +345,7 @@ static struct CARD { ...@@ -345,7 +345,7 @@ static struct CARD {
{ 0x15401836, BTTV_BOARD_PV183, "Provideo PV183-7" }, { 0x15401836, BTTV_BOARD_PV183, "Provideo PV183-7" },
{ 0x15401837, BTTV_BOARD_PV183, "Provideo PV183-8" }, { 0x15401837, BTTV_BOARD_PV183, "Provideo PV183-8" },
{ 0x3116f200, BTTV_BOARD_TVT_TD3116, "Tongwei Video Technology TD-3116" }, { 0x3116f200, BTTV_BOARD_TVT_TD3116, "Tongwei Video Technology TD-3116" },
{ 0x02280279, BTTV_BOARD_APOSONIC_WDVR, "Aposonic W-DVR" },
{ 0, -1, NULL } { 0, -1, NULL }
}; };
...@@ -2818,6 +2818,14 @@ struct tvcard bttv_tvcards[] = { ...@@ -2818,6 +2818,14 @@ struct tvcard bttv_tvcards[] = {
.pll = PLL_28, .pll = PLL_28,
.tuner_type = TUNER_ABSENT, .tuner_type = TUNER_ABSENT,
}, },
[BTTV_BOARD_APOSONIC_WDVR] = {
.name = "Aposonic W-DVR",
.video_inputs = 4,
.svhs = NO_SVHS,
.muxsel = MUXSEL(2, 3, 1, 0),
.tuner_type = TUNER_ABSENT,
},
}; };
static const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards); static const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards);
......
...@@ -184,7 +184,7 @@ ...@@ -184,7 +184,7 @@
#define BTTV_BOARD_GEOVISION_GV800S_SL 0x9e #define BTTV_BOARD_GEOVISION_GV800S_SL 0x9e
#define BTTV_BOARD_PV183 0x9f #define BTTV_BOARD_PV183 0x9f
#define BTTV_BOARD_TVT_TD3116 0xa0 #define BTTV_BOARD_TVT_TD3116 0xa0
#define BTTV_BOARD_APOSONIC_WDVR 0xa1
/* more card-specific defines */ /* more card-specific defines */
#define PT2254_L_CHANNEL 0x10 #define PT2254_L_CHANNEL 0x10
......
...@@ -499,16 +499,12 @@ int cx231xx_i2c_register(struct cx231xx_i2c *bus) ...@@ -499,16 +499,12 @@ int cx231xx_i2c_register(struct cx231xx_i2c *bus)
BUG_ON(!dev->cx231xx_send_usb_command); BUG_ON(!dev->cx231xx_send_usb_command);
memcpy(&bus->i2c_adap, &cx231xx_adap_template, sizeof(bus->i2c_adap)); bus->i2c_adap = cx231xx_adap_template;
memcpy(&bus->i2c_algo, &cx231xx_algo, sizeof(bus->i2c_algo)); bus->i2c_client = cx231xx_client_template;
memcpy(&bus->i2c_client, &cx231xx_client_template,
sizeof(bus->i2c_client));
bus->i2c_adap.dev.parent = &dev->udev->dev; bus->i2c_adap.dev.parent = &dev->udev->dev;
strlcpy(bus->i2c_adap.name, bus->dev->name, sizeof(bus->i2c_adap.name)); strlcpy(bus->i2c_adap.name, bus->dev->name, sizeof(bus->i2c_adap.name));
bus->i2c_algo.data = bus;
bus->i2c_adap.algo_data = bus; bus->i2c_adap.algo_data = bus;
i2c_set_adapdata(&bus->i2c_adap, &dev->v4l2_dev); i2c_set_adapdata(&bus->i2c_adap, &dev->v4l2_dev);
i2c_add_adapter(&bus->i2c_adap); i2c_add_adapter(&bus->i2c_adap);
......
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/ioctl.h> #include <linux/ioctl.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/i2c-algo-bit.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/mutex.h> #include <linux/mutex.h>
...@@ -481,7 +480,6 @@ struct cx231xx_i2c { ...@@ -481,7 +480,6 @@ struct cx231xx_i2c {
/* i2c i/o */ /* i2c i/o */
struct i2c_adapter i2c_adap; struct i2c_adapter i2c_adap;
struct i2c_algo_bit_data i2c_algo;
struct i2c_client i2c_client; struct i2c_client i2c_client;
u32 i2c_rc; u32 i2c_rc;
......
...@@ -316,19 +316,13 @@ int cx23885_i2c_register(struct cx23885_i2c *bus) ...@@ -316,19 +316,13 @@ int cx23885_i2c_register(struct cx23885_i2c *bus)
dprintk(1, "%s(bus = %d)\n", __func__, bus->nr); dprintk(1, "%s(bus = %d)\n", __func__, bus->nr);
memcpy(&bus->i2c_adap, &cx23885_i2c_adap_template, bus->i2c_adap = cx23885_i2c_adap_template;
sizeof(bus->i2c_adap)); bus->i2c_client = cx23885_i2c_client_template;
memcpy(&bus->i2c_algo, &cx23885_i2c_algo_template,
sizeof(bus->i2c_algo));
memcpy(&bus->i2c_client, &cx23885_i2c_client_template,
sizeof(bus->i2c_client));
bus->i2c_adap.dev.parent = &dev->pci->dev; bus->i2c_adap.dev.parent = &dev->pci->dev;
strlcpy(bus->i2c_adap.name, bus->dev->name, strlcpy(bus->i2c_adap.name, bus->dev->name,
sizeof(bus->i2c_adap.name)); sizeof(bus->i2c_adap.name));
bus->i2c_algo.data = bus;
bus->i2c_adap.algo_data = bus; bus->i2c_adap.algo_data = bus;
i2c_set_adapdata(&bus->i2c_adap, &dev->v4l2_dev); i2c_set_adapdata(&bus->i2c_adap, &dev->v4l2_dev);
i2c_add_adapter(&bus->i2c_adap); i2c_add_adapter(&bus->i2c_adap);
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/i2c-algo-bit.h>
#include <linux/kdev_t.h> #include <linux/kdev_t.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -247,7 +246,6 @@ struct cx23885_i2c { ...@@ -247,7 +246,6 @@ struct cx23885_i2c {
/* i2c i/o */ /* i2c i/o */
struct i2c_adapter i2c_adap; struct i2c_adapter i2c_adap;
struct i2c_algo_bit_data i2c_algo;
struct i2c_client i2c_client; struct i2c_client i2c_client;
u32 i2c_rc; u32 i2c_rc;
......
...@@ -305,18 +305,12 @@ int cx25821_i2c_register(struct cx25821_i2c *bus) ...@@ -305,18 +305,12 @@ int cx25821_i2c_register(struct cx25821_i2c *bus)
dprintk(1, "%s(bus = %d)\n", __func__, bus->nr); dprintk(1, "%s(bus = %d)\n", __func__, bus->nr);
memcpy(&bus->i2c_adap, &cx25821_i2c_adap_template, bus->i2c_adap = cx25821_i2c_adap_template;
sizeof(bus->i2c_adap)); bus->i2c_client = cx25821_i2c_client_template;
memcpy(&bus->i2c_algo, &cx25821_i2c_algo_template,
sizeof(bus->i2c_algo));
memcpy(&bus->i2c_client, &cx25821_i2c_client_template,
sizeof(bus->i2c_client));
bus->i2c_adap.dev.parent = &dev->pci->dev; bus->i2c_adap.dev.parent = &dev->pci->dev;
strlcpy(bus->i2c_adap.name, bus->dev->name, sizeof(bus->i2c_adap.name)); strlcpy(bus->i2c_adap.name, bus->dev->name, sizeof(bus->i2c_adap.name));
bus->i2c_algo.data = bus;
bus->i2c_adap.algo_data = bus; bus->i2c_adap.algo_data = bus;
i2c_set_adapdata(&bus->i2c_adap, &dev->v4l2_dev); i2c_set_adapdata(&bus->i2c_adap, &dev->v4l2_dev);
i2c_add_adapter(&bus->i2c_adap); i2c_add_adapter(&bus->i2c_adap);
......
...@@ -499,7 +499,7 @@ static void medusa_set_decoderduration(struct cx25821_dev *dev, int decoder, ...@@ -499,7 +499,7 @@ static void medusa_set_decoderduration(struct cx25821_dev *dev, int decoder,
mutex_lock(&dev->lock); mutex_lock(&dev->lock);
/* no support */ /* no support */
if (decoder < VDEC_A && decoder > VDEC_H) { if (decoder < VDEC_A || decoder > VDEC_H) {
mutex_unlock(&dev->lock); mutex_unlock(&dev->lock);
return; return;
} }
......
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/i2c-algo-bit.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/sched.h> #include <linux/sched.h>
...@@ -213,7 +212,6 @@ struct cx25821_i2c { ...@@ -213,7 +212,6 @@ struct cx25821_i2c {
/* i2c i/o */ /* i2c i/o */
struct i2c_adapter i2c_adap; struct i2c_adapter i2c_adap;
struct i2c_algo_bit_data i2c_algo;
struct i2c_client i2c_client; struct i2c_client i2c_client;
u32 i2c_rc; u32 i2c_rc;
......
config DISPLAY_DAVINCI_DM646X_EVM config VIDEO_DAVINCI_VPIF_DISPLAY
tristate "DM646x EVM Video Display" tristate "DM646x/DA850/OMAPL138 EVM Video Display"
depends on VIDEO_DEV && MACH_DAVINCI_DM6467_EVM depends on VIDEO_DEV && (MACH_DAVINCI_DM6467_EVM || MACH_DAVINCI_DA850_EVM)
select VIDEOBUF_DMA_CONTIG select VIDEOBUF2_DMA_CONTIG
select VIDEO_DAVINCI_VPIF select VIDEO_DAVINCI_VPIF
select VIDEO_ADV7343 select VIDEO_ADV7343 if VIDEO_HELPER_CHIPS_AUTO
select VIDEO_THS7303 select VIDEO_THS7303 if VIDEO_HELPER_CHIPS_AUTO
help help
Support for DM6467 based display device. Enables Davinci VPIF module used for display devices.
This module is common for following DM6467/DA850/OMAPL138
based display devices.
To compile this driver as a module, choose M here: the To compile this driver as a module, choose M here: the
module will be called vpif_display. module will be called vpif_display.
config CAPTURE_DAVINCI_DM646X_EVM config VIDEO_DAVINCI_VPIF_CAPTURE
tristate "DM646x EVM Video Capture" tristate "DM646x/DA850/OMAPL138 EVM Video Capture"
depends on VIDEO_DEV && MACH_DAVINCI_DM6467_EVM depends on VIDEO_DEV && (MACH_DAVINCI_DM6467_EVM || MACH_DAVINCI_DA850_EVM)
select VIDEOBUF_DMA_CONTIG select VIDEOBUF2_DMA_CONTIG
select VIDEO_DAVINCI_VPIF select VIDEO_DAVINCI_VPIF
help help
Support for DM6467 based capture device. Enables Davinci VPIF module used for captur devices.
This module is common for following DM6467/DA850/OMAPL138
based capture devices.
To compile this driver as a module, choose M here: the To compile this driver as a module, choose M here: the
module will be called vpif_capture. module will be called vpif_capture.
config VIDEO_DAVINCI_VPIF config VIDEO_DAVINCI_VPIF
tristate "DaVinci VPIF Driver" tristate "DaVinci VPIF Driver"
depends on DISPLAY_DAVINCI_DM646X_EVM depends on VIDEO_DAVINCI_VPIF_DISPLAY || VIDEO_DAVINCI_VPIF_CAPTURE
help help
Support for DaVinci VPIF Driver. Support for DaVinci VPIF Driver.
......
...@@ -5,10 +5,10 @@ ...@@ -5,10 +5,10 @@
# VPIF # VPIF
obj-$(CONFIG_VIDEO_DAVINCI_VPIF) += vpif.o obj-$(CONFIG_VIDEO_DAVINCI_VPIF) += vpif.o
#DM646x EVM Display driver #VPIF Display driver
obj-$(CONFIG_DISPLAY_DAVINCI_DM646X_EVM) += vpif_display.o obj-$(CONFIG_VIDEO_DAVINCI_VPIF_DISPLAY) += vpif_display.o
#DM646x EVM Capture driver #VPIF Capture driver
obj-$(CONFIG_CAPTURE_DAVINCI_DM646X_EVM) += vpif_capture.o obj-$(CONFIG_VIDEO_DAVINCI_VPIF_CAPTURE) += vpif_capture.o
# Capture: DM6446 and DM355 # Capture: DM6446 and DM355
obj-$(CONFIG_VIDEO_VPSS_SYSTEM) += vpss.o obj-$(CONFIG_VIDEO_VPSS_SYSTEM) += vpss.o
......
...@@ -1083,7 +1083,7 @@ vpbe_display_s_dv_preset(struct file *file, void *priv, ...@@ -1083,7 +1083,7 @@ vpbe_display_s_dv_preset(struct file *file, void *priv,
} }
/* Set the given standard in the encoder */ /* Set the given standard in the encoder */
if (NULL != vpbe_dev->ops.s_dv_preset) if (!vpbe_dev->ops.s_dv_preset)
return -EINVAL; return -EINVAL;
ret = vpbe_dev->ops.s_dv_preset(vpbe_dev, preset); ret = vpbe_dev->ops.s_dv_preset(vpbe_dev, preset);
...@@ -1517,6 +1517,8 @@ static int vpbe_display_g_register(struct file *file, void *priv, ...@@ -1517,6 +1517,8 @@ static int vpbe_display_g_register(struct file *file, void *priv,
struct v4l2_dbg_register *reg) struct v4l2_dbg_register *reg)
{ {
struct v4l2_dbg_match *match = &reg->match; struct v4l2_dbg_match *match = &reg->match;
struct vpbe_fh *fh = file->private_data;
struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev;
if (match->type >= 2) { if (match->type >= 2) {
v4l2_subdev_call(vpbe_dev->venc, v4l2_subdev_call(vpbe_dev->venc,
......
/* /*
* vpif - DM646x Video Port Interface driver * vpif - Video Port Interface driver
* VPIF is a receiver and transmitter for video data. It has two channels(0, 1) * VPIF is a receiver and transmitter for video data. It has two channels(0, 1)
* that receiveing video byte stream and two channels(2, 3) for video output. * that receiveing video byte stream and two channels(2, 3) for video output.
* The hardware supports SDTV, HDTV formats, raw data capture. * The hardware supports SDTV, HDTV formats, raw data capture.
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/clk.h>
#include <linux/err.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include "vpif.h" #include "vpif.h"
...@@ -40,6 +42,7 @@ static struct resource *res; ...@@ -40,6 +42,7 @@ static struct resource *res;
spinlock_t vpif_lock; spinlock_t vpif_lock;
void __iomem *vpif_base; void __iomem *vpif_base;
struct clk *vpif_clk;
/** /**
* ch_params: video standard configuration parameters for vpif * ch_params: video standard configuration parameters for vpif
...@@ -346,7 +349,7 @@ static void config_vpif_params(struct vpif_params *vpifparams, ...@@ -346,7 +349,7 @@ static void config_vpif_params(struct vpif_params *vpifparams,
value = regr(reg); value = regr(reg);
/* Set data width */ /* Set data width */
value &= ((~(unsigned int)(0x3)) << value &= ~(0x3u <<
VPIF_CH_DATA_WIDTH_BIT); VPIF_CH_DATA_WIDTH_BIT);
value |= ((vpifparams->params.data_sz) << value |= ((vpifparams->params.data_sz) <<
VPIF_CH_DATA_WIDTH_BIT); VPIF_CH_DATA_WIDTH_BIT);
...@@ -434,10 +437,19 @@ static int __init vpif_probe(struct platform_device *pdev) ...@@ -434,10 +437,19 @@ static int __init vpif_probe(struct platform_device *pdev)
goto fail; goto fail;
} }
vpif_clk = clk_get(&pdev->dev, "vpif");
if (IS_ERR(vpif_clk)) {
status = PTR_ERR(vpif_clk);
goto clk_fail;
}
clk_enable(vpif_clk);
spin_lock_init(&vpif_lock); spin_lock_init(&vpif_lock);
dev_info(&pdev->dev, "vpif probe success\n"); dev_info(&pdev->dev, "vpif probe success\n");
return 0; return 0;
clk_fail:
iounmap(vpif_base);
fail: fail:
release_mem_region(res->start, res_len); release_mem_region(res->start, res_len);
return status; return status;
...@@ -445,15 +457,44 @@ static int __init vpif_probe(struct platform_device *pdev) ...@@ -445,15 +457,44 @@ static int __init vpif_probe(struct platform_device *pdev)
static int __devexit vpif_remove(struct platform_device *pdev) static int __devexit vpif_remove(struct platform_device *pdev)
{ {
if (vpif_clk) {
clk_disable(vpif_clk);
clk_put(vpif_clk);
}
iounmap(vpif_base); iounmap(vpif_base);
release_mem_region(res->start, res_len); release_mem_region(res->start, res_len);
return 0; return 0;
} }
#ifdef CONFIG_PM
static int vpif_suspend(struct device *dev)
{
clk_disable(vpif_clk);
return 0;
}
static int vpif_resume(struct device *dev)
{
clk_enable(vpif_clk);
return 0;
}
static const struct dev_pm_ops vpif_pm = {
.suspend = vpif_suspend,
.resume = vpif_resume,
};
#define vpif_pm_ops (&vpif_pm)
#else
#define vpif_pm_ops NULL
#endif
static struct platform_driver vpif_driver = { static struct platform_driver vpif_driver = {
.driver = { .driver = {
.name = "vpif", .name = "vpif",
.owner = THIS_MODULE, .owner = THIS_MODULE,
.pm = vpif_pm_ops,
}, },
.remove = __devexit_p(vpif_remove), .remove = __devexit_p(vpif_remove),
.probe = vpif_probe, .probe = vpif_probe,
......
...@@ -211,6 +211,12 @@ static inline void vpif_clr_bit(u32 reg, u32 bit) ...@@ -211,6 +211,12 @@ static inline void vpif_clr_bit(u32 reg, u32 bit)
#define VPIF_CH3_INT_CTRL_SHIFT (6) #define VPIF_CH3_INT_CTRL_SHIFT (6)
#define VPIF_CH_INT_CTRL_SHIFT (6) #define VPIF_CH_INT_CTRL_SHIFT (6)
#define VPIF_CH2_CLIP_ANC_EN 14
#define VPIF_CH2_CLIP_ACTIVE_EN 13
#define VPIF_CH3_CLIP_ANC_EN 14
#define VPIF_CH3_CLIP_ACTIVE_EN 13
/* enabled interrupt on both the fields on vpid_ch0_ctrl register */ /* enabled interrupt on both the fields on vpid_ch0_ctrl register */
#define channel0_intr_assert() (regw((regr(VPIF_CH0_CTRL)|\ #define channel0_intr_assert() (regw((regr(VPIF_CH0_CTRL)|\
(VPIF_INT_BOTH << VPIF_CH0_INT_CTRL_SHIFT)), VPIF_CH0_CTRL)) (VPIF_INT_BOTH << VPIF_CH0_INT_CTRL_SHIFT)), VPIF_CH0_CTRL))
...@@ -515,6 +521,30 @@ static inline void channel3_raw_enable(int enable, u8 index) ...@@ -515,6 +521,30 @@ static inline void channel3_raw_enable(int enable, u8 index)
vpif_clr_bit(VPIF_CH3_CTRL, mask); vpif_clr_bit(VPIF_CH3_CTRL, mask);
} }
/* function to enable clipping (for both active and blanking regions) on ch 2 */
static inline void channel2_clipping_enable(int enable)
{
if (enable) {
vpif_set_bit(VPIF_CH2_CTRL, VPIF_CH2_CLIP_ANC_EN);
vpif_set_bit(VPIF_CH2_CTRL, VPIF_CH2_CLIP_ACTIVE_EN);
} else {
vpif_clr_bit(VPIF_CH2_CTRL, VPIF_CH2_CLIP_ANC_EN);
vpif_clr_bit(VPIF_CH2_CTRL, VPIF_CH2_CLIP_ACTIVE_EN);
}
}
/* function to enable clipping (for both active and blanking regions) on ch 2 */
static inline void channel3_clipping_enable(int enable)
{
if (enable) {
vpif_set_bit(VPIF_CH3_CTRL, VPIF_CH3_CLIP_ANC_EN);
vpif_set_bit(VPIF_CH3_CTRL, VPIF_CH3_CLIP_ACTIVE_EN);
} else {
vpif_clr_bit(VPIF_CH3_CTRL, VPIF_CH3_CLIP_ANC_EN);
vpif_clr_bit(VPIF_CH3_CTRL, VPIF_CH3_CLIP_ACTIVE_EN);
}
}
/* inline function to set buffer addresses in case of Y/C non mux mode */ /* inline function to set buffer addresses in case of Y/C non mux mode */
static inline void ch2_set_videobuf_addr_yc_nmux(unsigned long top_strt_luma, static inline void ch2_set_videobuf_addr_yc_nmux(unsigned long top_strt_luma,
unsigned long btm_strt_luma, unsigned long btm_strt_luma,
...@@ -569,6 +599,21 @@ static inline void ch3_set_vbi_addr(unsigned long top_strt_luma, ...@@ -569,6 +599,21 @@ static inline void ch3_set_vbi_addr(unsigned long top_strt_luma,
regw(btm_strt_luma, VPIF_CH3_BTM_STRT_ADD_VANC); regw(btm_strt_luma, VPIF_CH3_BTM_STRT_ADD_VANC);
} }
static inline int vpif_intr_status(int channel)
{
int status = 0;
int mask;
if (channel < 0 || channel > 3)
return 0;
mask = 1 << channel;
status = regr(VPIF_STATUS) & mask;
regw(status, VPIF_STATUS_CLR);
return status;
}
#define VPIF_MAX_NAME (30) #define VPIF_MAX_NAME (30)
/* This structure will store size parameters as per the mode selected by user */ /* This structure will store size parameters as per the mode selected by user */
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -299,6 +299,7 @@ static struct usb_driver sd_driver = { ...@@ -299,6 +299,7 @@ static struct usb_driver sd_driver = {
#ifdef CONFIG_PM #ifdef CONFIG_PM
.suspend = gspca_suspend, .suspend = gspca_suspend,
.resume = gspca_resume, .resume = gspca_resume,
.reset_resume = gspca_resume,
#endif #endif
}; };
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment