mirror of https://gitee.com/openkylin/linux.git
media updates for v3.19-rc1
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJUhxhbAAoJEAhfPr2O5OEV4JwP/2I7D2KGz5tdNGDAh1H8+swR hoj3tX7HLhwBmF6XIUlMYbk5L/ClDace6kcjT6OjwJ9SktrrKks6ZSsYsBjCIyOC yS7xNQArUKzWk4vV+uJVAvtF8V57LLFul8dhHk0JJwAxrkWnPvDdfJNs4PhUAkgn 1i0PPshNo5Ow/+4YMiOjEDR+q9TMSUUzaq5zkPF7AFCnykuJ1wUJwUE0qjTfGi+4 gl1yMye0TEawTYSM8h/+Lh7wosNFZYcXg85r04A6a8h6GLgg0h6KSOJjyPITmQ+j hLdtyiYs8a6XT+Y8o416zxpbSozo7KXCUTtet/N5g+lgQMqZqSd9WxE52SOY+kfd UVeob0VfWR0xdDzaJp5rLQ/MQ16RTHaHppgUidFxxGe9D5f9JM/88I0OfwNzl4uO cv2cyeNktHH6bcjfOGqxSVmZWgAm6q6qU7MN07PoN+5TcUlYTAOi1WLE5K+7HGgw CxzOZ61oxi/OO1FapaVoipq6ycjltTql2kbcARvmrRrbge0ocAqHxHqFyUbDDhNw Wn/O6VzLfpW0vGTacC6+xcUSpIhwajJ80UJAOqJP8sw0Xtmian5Lcs6gVzxwkOdU 36Po4RRGFqsG6Sq3HR+toNwKt/nHNEFkJwYcNFHdvBiXTEYYkMe6MccUxxb3i/iI KxB1s51zVy9t3PqjP+3J =i7gx -----END PGP SIGNATURE----- Merge tag 'media/v3.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media Pull media updates from Mauro Carvalho Chehab: - Two new dvb frontend drivers: mn88472 and mn88473 - A new driver for some PCIe DVBSky cards - A new remote controller driver: meson-ir - One LIRC staging driver got rewritten and promoted to mainstream: igorplugusb - A new tuner driver (m88rs6000t) - The old omap2 media driver got removed from staging. This driver uses an old DMA API and it is likely broken on recent kernels. Nobody cared enough to fix it - Media bus format moved to a separate header, as DRM will also use the definitions there - mem2mem_testdev were renamed to vim2m, in order to use the same naming convention taken by the other virtual test driver (vivid) - Added a new driver for coda SoC (coda-jpeg) - The cx88 driver got converted to use videobuf2 core - Make DMABUF export buffer to work with DMA Scatter/Gather and Vmalloc cores - Lots of other fixes, improvements and cleanups on the drivers. * tag 'media/v3.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (384 commits) [media] mn88473: One function call less in mn88473_init() after error [media] mn88473: Remove uneeded check before release_firmware() [media] lirc_zilog: Deletion of unnecessary checks before vfree() [media] MAINTAINERS: Add myself as img-ir maintainer [media] img-ir: Don't set driver's module owner [media] img-ir: Depend on METAG or MIPS or COMPILE_TEST [media] img-ir/hw: Drop [un]register_decoder declarations [media] img-ir/hw: Fix potential deadlock stopping timer [media] img-ir/hw: Always read data to clear buffer [media] redrat3: ensure dma is setup properly [media] ddbridge: remove unneeded check before dvb_unregister_device() [media] si2157: One function call less in si2157_init() after error [media] tuners: remove uneeded checks before release_firmware() [media] arm: omap2: rx51-peripherals: fix build warning [media] stv090x: add an extra protetion against buffer overflow [media] stv090x: Remove an unreachable code [media] stv090x: Some whitespace cleanups [media] em28xx: checkpatch cleanup: whitespaces/new lines cleanups [media] si2168: add support for firmware files in new format [media] si2168: debug printout for firmware version ...
This commit is contained in:
commit
2183a58803
|
@ -120,8 +120,8 @@ struct dtv_properties {
|
|||
</para>
|
||||
<informaltable><tgroup cols="1"><tbody><row><entry
|
||||
align="char">
|
||||
<para>This ioctl call sets one or more frontend properties. This call only
|
||||
requires read-only access to the device.</para>
|
||||
<para>This ioctl call sets one or more frontend properties. This call
|
||||
requires read/write access to the device.</para>
|
||||
</entry>
|
||||
</row></tbody></tgroup></informaltable>
|
||||
<para>SYNOPSIS
|
||||
|
|
|
@ -178,6 +178,75 @@ Signal - NTSC for Studio Applications"</title>
|
|||
1125-Line High-Definition Production"</title>
|
||||
</biblioentry>
|
||||
|
||||
<biblioentry id="srgb">
|
||||
<abbrev>sRGB</abbrev>
|
||||
<authorgroup>
|
||||
<corpauthor>International Electrotechnical Commission
|
||||
(<ulink url="http://www.iec.ch">http://www.iec.ch</ulink>)</corpauthor>
|
||||
</authorgroup>
|
||||
<title>IEC 61966-2-1 ed1.0 "Multimedia systems and equipment - Colour measurement
|
||||
and management - Part 2-1: Colour management - Default RGB colour space - sRGB"</title>
|
||||
</biblioentry>
|
||||
|
||||
<biblioentry id="sycc">
|
||||
<abbrev>sYCC</abbrev>
|
||||
<authorgroup>
|
||||
<corpauthor>International Electrotechnical Commission
|
||||
(<ulink url="http://www.iec.ch">http://www.iec.ch</ulink>)</corpauthor>
|
||||
</authorgroup>
|
||||
<title>IEC 61966-2-1-am1 ed1.0 "Amendment 1 - Multimedia systems and equipment - Colour measurement
|
||||
and management - Part 2-1: Colour management - Default RGB colour space - sRGB"</title>
|
||||
</biblioentry>
|
||||
|
||||
<biblioentry id="xvycc">
|
||||
<abbrev>xvYCC</abbrev>
|
||||
<authorgroup>
|
||||
<corpauthor>International Electrotechnical Commission
|
||||
(<ulink url="http://www.iec.ch">http://www.iec.ch</ulink>)</corpauthor>
|
||||
</authorgroup>
|
||||
<title>IEC 61966-2-4 ed1.0 "Multimedia systems and equipment - Colour measurement
|
||||
and management - Part 2-4: Colour management - Extended-gamut YCC colour space for video
|
||||
applications - xvYCC"</title>
|
||||
</biblioentry>
|
||||
|
||||
<biblioentry id="adobergb">
|
||||
<abbrev>AdobeRGB</abbrev>
|
||||
<authorgroup>
|
||||
<corpauthor>Adobe Systems Incorporated (<ulink url="http://www.adobe.com">http://www.adobe.com</ulink>)</corpauthor>
|
||||
</authorgroup>
|
||||
<title>Adobe© RGB (1998) Color Image Encoding Version 2005-05</title>
|
||||
</biblioentry>
|
||||
|
||||
<biblioentry id="oprgb">
|
||||
<abbrev>opRGB</abbrev>
|
||||
<authorgroup>
|
||||
<corpauthor>International Electrotechnical Commission
|
||||
(<ulink url="http://www.iec.ch">http://www.iec.ch</ulink>)</corpauthor>
|
||||
</authorgroup>
|
||||
<title>IEC 61966-2-5 "Multimedia systems and equipment - Colour measurement
|
||||
and management - Part 2-5: Colour management - Optional RGB colour space - opRGB"</title>
|
||||
</biblioentry>
|
||||
|
||||
<biblioentry id="itu2020">
|
||||
<abbrev>ITU BT.2020</abbrev>
|
||||
<authorgroup>
|
||||
<corpauthor>International Telecommunication Union (<ulink
|
||||
url="http://www.itu.ch">http://www.itu.ch</ulink>)</corpauthor>
|
||||
</authorgroup>
|
||||
<title>ITU-R Recommendation BT.2020 (08/2012) "Parameter values for ultra-high
|
||||
definition television systems for production and international programme exchange"
|
||||
</title>
|
||||
</biblioentry>
|
||||
|
||||
<biblioentry id="tech3213">
|
||||
<abbrev>EBU Tech 3213</abbrev>
|
||||
<authorgroup>
|
||||
<corpauthor>European Broadcast Union (<ulink
|
||||
url="http://www.ebu.ch">http://www.ebu.ch</ulink>)</corpauthor>
|
||||
</authorgroup>
|
||||
<title>E.B.U. Standard for Chromaticity Tolerances for Studio Monitors"</title>
|
||||
</biblioentry>
|
||||
|
||||
<biblioentry id="iec62106">
|
||||
<abbrev>IEC 62106</abbrev>
|
||||
<authorgroup>
|
||||
|
@ -266,4 +335,20 @@ in the frequency range from 87,5 to 108,0 MHz</title>
|
|||
<subtitle>Version 1, Revision 2</subtitle>
|
||||
</biblioentry>
|
||||
|
||||
<biblioentry id="poynton">
|
||||
<abbrev>poynton</abbrev>
|
||||
<authorgroup>
|
||||
<corpauthor>Charles Poynton</corpauthor>
|
||||
</authorgroup>
|
||||
<title>Digital Video and HDTV, Algorithms and Interfaces</title>
|
||||
</biblioentry>
|
||||
|
||||
<biblioentry id="colimg">
|
||||
<abbrev>colimg</abbrev>
|
||||
<authorgroup>
|
||||
<corpauthor>Erik Reinhard et al.</corpauthor>
|
||||
</authorgroup>
|
||||
<title>Color Imaging: Fundamentals and Applications</title>
|
||||
</biblioentry>
|
||||
|
||||
</bibliography>
|
||||
|
|
|
@ -195,53 +195,59 @@
|
|||
<title>Sample Pipeline Configuration</title>
|
||||
<tgroup cols="3">
|
||||
<colspec colname="what"/>
|
||||
<colspec colname="sensor-0" />
|
||||
<colspec colname="frontend-0" />
|
||||
<colspec colname="frontend-1" />
|
||||
<colspec colname="scaler-0" />
|
||||
<colspec colname="scaler-1" />
|
||||
<colspec colname="sensor-0 format" />
|
||||
<colspec colname="frontend-0 format" />
|
||||
<colspec colname="frontend-1 format" />
|
||||
<colspec colname="scaler-0 format" />
|
||||
<colspec colname="scaler-0 compose" />
|
||||
<colspec colname="scaler-1 format" />
|
||||
<thead>
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry>Sensor/0</entry>
|
||||
<entry>Frontend/0</entry>
|
||||
<entry>Frontend/1</entry>
|
||||
<entry>Scaler/0</entry>
|
||||
<entry>Scaler/1</entry>
|
||||
<entry>Sensor/0 format</entry>
|
||||
<entry>Frontend/0 format</entry>
|
||||
<entry>Frontend/1 format</entry>
|
||||
<entry>Scaler/0 format</entry>
|
||||
<entry>Scaler/0 compose selection rectangle</entry>
|
||||
<entry>Scaler/1 format</entry>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
<entry>Initial state</entry>
|
||||
<entry>2048x1536</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>2048x1536/SGRBG8_1X8</entry>
|
||||
<entry>(default)</entry>
|
||||
<entry>(default)</entry>
|
||||
<entry>(default)</entry>
|
||||
<entry>(default)</entry>
|
||||
<entry>(default)</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>Configure frontend input</entry>
|
||||
<entry>2048x1536</entry>
|
||||
<entry><emphasis>2048x1536</emphasis></entry>
|
||||
<entry><emphasis>2046x1534</emphasis></entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>Configure frontend sink format</entry>
|
||||
<entry>2048x1536/SGRBG8_1X8</entry>
|
||||
<entry><emphasis>2048x1536/SGRBG8_1X8</emphasis></entry>
|
||||
<entry><emphasis>2046x1534/SGRBG8_1X8</emphasis></entry>
|
||||
<entry>(default)</entry>
|
||||
<entry>(default)</entry>
|
||||
<entry>(default)</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>Configure scaler input</entry>
|
||||
<entry>2048x1536</entry>
|
||||
<entry>2048x1536</entry>
|
||||
<entry>2046x1534</entry>
|
||||
<entry><emphasis>2046x1534</emphasis></entry>
|
||||
<entry><emphasis>2046x1534</emphasis></entry>
|
||||
<entry>Configure scaler sink format</entry>
|
||||
<entry>2048x1536/SGRBG8_1X8</entry>
|
||||
<entry>2048x1536/SGRBG8_1X8</entry>
|
||||
<entry>2046x1534/SGRBG8_1X8</entry>
|
||||
<entry><emphasis>2046x1534/SGRBG8_1X8</emphasis></entry>
|
||||
<entry><emphasis>0,0/2046x1534</emphasis></entry>
|
||||
<entry><emphasis>2046x1534/SGRBG8_1X8</emphasis></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>Configure scaler output</entry>
|
||||
<entry>2048x1536</entry>
|
||||
<entry>2048x1536</entry>
|
||||
<entry>2046x1534</entry>
|
||||
<entry>2046x1534</entry>
|
||||
<entry><emphasis>1280x960</emphasis></entry>
|
||||
<entry>Configure scaler sink compose selection</entry>
|
||||
<entry>2048x1536/SGRBG8_1X8</entry>
|
||||
<entry>2048x1536/SGRBG8_1X8</entry>
|
||||
<entry>2046x1534/SGRBG8_1X8</entry>
|
||||
<entry>2046x1534/SGRBG8_1X8</entry>
|
||||
<entry><emphasis>0,0/1280x960</emphasis></entry>
|
||||
<entry><emphasis>1280x960/SGRBG8_1X8</emphasis></entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
|
@ -249,19 +255,30 @@
|
|||
|
||||
<para>
|
||||
<orderedlist>
|
||||
<listitem><para>Initial state. The sensor output is set to its native 3MP
|
||||
resolution. Resolutions on the host frontend and scaler input and output
|
||||
pads are undefined.</para></listitem>
|
||||
<listitem><para>The application configures the frontend input pad resolution to
|
||||
2048x1536. The driver propagates the format to the frontend output pad.
|
||||
Note that the propagated output format can be different, as in this case,
|
||||
than the input format, as the hardware might need to crop pixels (for
|
||||
instance when converting a Bayer filter pattern to RGB or YUV).</para></listitem>
|
||||
<listitem><para>The application configures the scaler input pad resolution to
|
||||
2046x1534 to match the frontend output resolution. The driver propagates
|
||||
the format to the scaler output pad.</para></listitem>
|
||||
<listitem><para>The application configures the scaler output pad resolution to
|
||||
1280x960.</para></listitem>
|
||||
<listitem><para>Initial state. The sensor source pad format is
|
||||
set to its native 3MP size and V4L2_MBUS_FMT_SGRBG8_1X8
|
||||
media bus code. Formats on the host frontend and scaler sink
|
||||
and source pads have the default values, as well as the
|
||||
compose rectangle on the scaler's sink pad.</para></listitem>
|
||||
|
||||
<listitem><para>The application configures the frontend sink
|
||||
pad format's size to 2048x1536 and its media bus code to
|
||||
V4L2_MBUS_FMT_SGRBG_1X8. The driver propagates the format to
|
||||
the frontend source pad.</para></listitem>
|
||||
|
||||
<listitem><para>The application configures the scaler sink pad
|
||||
format's size to 2046x1534 and the media bus code to
|
||||
V4L2_MBUS_FMT_SGRBG_1X8 to match the frontend source size and
|
||||
media bus code. The media bus code on the sink pad is set to
|
||||
V4L2_MBUS_FMT_SGRBG_1X8. The driver propagates the size to the
|
||||
compose selection rectangle on the scaler's sink pad, and the
|
||||
format to the scaler source pad.</para></listitem>
|
||||
|
||||
<listitem><para>The application configures the size of the compose
|
||||
selection rectangle of the scaler's sink pad 1280x960. The driver
|
||||
propagates the size to the scaler's source pad
|
||||
format.</para></listitem>
|
||||
|
||||
</orderedlist>
|
||||
</para>
|
||||
|
||||
|
|
|
@ -1422,7 +1422,10 @@ one of the <constant>V4L2_FIELD_NONE</constant>,
|
|||
<constant>V4L2_FIELD_BOTTOM</constant>, or
|
||||
<constant>V4L2_FIELD_INTERLACED</constant> formats is acceptable.
|
||||
Drivers choose depending on hardware capabilities or e. g. the
|
||||
requested image size, and return the actual field order. &v4l2-buffer;
|
||||
requested image size, and return the actual field order. Drivers must
|
||||
never return <constant>V4L2_FIELD_ANY</constant>. If multiple
|
||||
field orders are possible the driver must choose one of the possible
|
||||
field orders during &VIDIOC-S-FMT; or &VIDIOC-TRY-FMT;. &v4l2-buffer;
|
||||
<structfield>field</structfield> can never be
|
||||
<constant>V4L2_FIELD_ANY</constant>.</entry>
|
||||
</row>
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -62,6 +62,22 @@
|
|||
<entry>Yes</entry>
|
||||
<entry>Yes</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_SEL_TGT_NATIVE_SIZE</constant></entry>
|
||||
<entry>0x0003</entry>
|
||||
<entry>The native size of the device, e.g. a sensor's
|
||||
pixel array. <structfield>left</structfield> and
|
||||
<structfield>top</structfield> fields are zero for this
|
||||
target. Setting the native size will generally only make
|
||||
sense for memory to memory devices where the software can
|
||||
create a canvas of a given size in which for example a
|
||||
video frame can be composed. In that case
|
||||
V4L2_SEL_TGT_NATIVE_SIZE can be used to configure the size
|
||||
of that canvas.
|
||||
</entry>
|
||||
<entry>Yes</entry>
|
||||
<entry>Yes</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_SEL_TGT_COMPOSE</constant></entry>
|
||||
<entry>0x0100</entry>
|
||||
|
|
|
@ -86,7 +86,7 @@
|
|||
green and 5-bit blue values padded on the high bit, transferred as 2 8-bit
|
||||
samples per pixel with the most significant bits (padding, red and half of
|
||||
the green value) transferred first will be named
|
||||
<constant>V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE</constant>.
|
||||
<constant>MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE</constant>.
|
||||
</para>
|
||||
|
||||
<para>The following tables list existing packed RGB formats.</para>
|
||||
|
@ -176,8 +176,8 @@
|
|||
</row>
|
||||
</thead>
|
||||
<tbody valign="top">
|
||||
<row id="V4L2-MBUS-FMT-RGB444-2X8-PADHI-BE">
|
||||
<entry>V4L2_MBUS_FMT_RGB444_2X8_PADHI_BE</entry>
|
||||
<row id="MEDIA-BUS-FMT-RGB444-2X8-PADHI-BE">
|
||||
<entry>MEDIA_BUS_FMT_RGB444_2X8_PADHI_BE</entry>
|
||||
<entry>0x1001</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-24;
|
||||
|
@ -204,8 +204,8 @@
|
|||
<entry>b<subscript>1</subscript></entry>
|
||||
<entry>b<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-RGB444-2X8-PADHI-LE">
|
||||
<entry>V4L2_MBUS_FMT_RGB444_2X8_PADHI_LE</entry>
|
||||
<row id="MEDIA-BUS-FMT-RGB444-2X8-PADHI-LE">
|
||||
<entry>MEDIA_BUS_FMT_RGB444_2X8_PADHI_LE</entry>
|
||||
<entry>0x1002</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-24;
|
||||
|
@ -232,8 +232,8 @@
|
|||
<entry>r<subscript>1</subscript></entry>
|
||||
<entry>r<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-RGB555-2X8-PADHI-BE">
|
||||
<entry>V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE</entry>
|
||||
<row id="MEDIA-BUS-FMT-RGB555-2X8-PADHI-BE">
|
||||
<entry>MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE</entry>
|
||||
<entry>0x1003</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-24;
|
||||
|
@ -260,8 +260,8 @@
|
|||
<entry>b<subscript>1</subscript></entry>
|
||||
<entry>b<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-RGB555-2X8-PADHI-LE">
|
||||
<entry>V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE</entry>
|
||||
<row id="MEDIA-BUS-FMT-RGB555-2X8-PADHI-LE">
|
||||
<entry>MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE</entry>
|
||||
<entry>0x1004</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-24;
|
||||
|
@ -288,8 +288,8 @@
|
|||
<entry>g<subscript>4</subscript></entry>
|
||||
<entry>g<subscript>3</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-BGR565-2X8-BE">
|
||||
<entry>V4L2_MBUS_FMT_BGR565_2X8_BE</entry>
|
||||
<row id="MEDIA-BUS-FMT-BGR565-2X8-BE">
|
||||
<entry>MEDIA_BUS_FMT_BGR565_2X8_BE</entry>
|
||||
<entry>0x1005</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-24;
|
||||
|
@ -316,8 +316,8 @@
|
|||
<entry>r<subscript>1</subscript></entry>
|
||||
<entry>r<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-BGR565-2X8-LE">
|
||||
<entry>V4L2_MBUS_FMT_BGR565_2X8_LE</entry>
|
||||
<row id="MEDIA-BUS-FMT-BGR565-2X8-LE">
|
||||
<entry>MEDIA_BUS_FMT_BGR565_2X8_LE</entry>
|
||||
<entry>0x1006</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-24;
|
||||
|
@ -344,8 +344,8 @@
|
|||
<entry>g<subscript>4</subscript></entry>
|
||||
<entry>g<subscript>3</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-RGB565-2X8-BE">
|
||||
<entry>V4L2_MBUS_FMT_RGB565_2X8_BE</entry>
|
||||
<row id="MEDIA-BUS-FMT-RGB565-2X8-BE">
|
||||
<entry>MEDIA_BUS_FMT_RGB565_2X8_BE</entry>
|
||||
<entry>0x1007</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-24;
|
||||
|
@ -372,8 +372,8 @@
|
|||
<entry>b<subscript>1</subscript></entry>
|
||||
<entry>b<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-RGB565-2X8-LE">
|
||||
<entry>V4L2_MBUS_FMT_RGB565_2X8_LE</entry>
|
||||
<row id="MEDIA-BUS-FMT-RGB565-2X8-LE">
|
||||
<entry>MEDIA_BUS_FMT_RGB565_2X8_LE</entry>
|
||||
<entry>0x1008</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-24;
|
||||
|
@ -400,8 +400,8 @@
|
|||
<entry>g<subscript>4</subscript></entry>
|
||||
<entry>g<subscript>3</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-RGB666-1X18">
|
||||
<entry>V4L2_MBUS_FMT_RGB666_1X18</entry>
|
||||
<row id="MEDIA-BUS-FMT-RGB666-1X18">
|
||||
<entry>MEDIA_BUS_FMT_RGB666_1X18</entry>
|
||||
<entry>0x1009</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-14;
|
||||
|
@ -424,8 +424,8 @@
|
|||
<entry>b<subscript>1</subscript></entry>
|
||||
<entry>b<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-RGB888-1X24">
|
||||
<entry>V4L2_MBUS_FMT_RGB888_1X24</entry>
|
||||
<row id="MEDIA-BUS-FMT-RGB888-1X24">
|
||||
<entry>MEDIA_BUS_FMT_RGB888_1X24</entry>
|
||||
<entry>0x100a</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-8;
|
||||
|
@ -454,8 +454,8 @@
|
|||
<entry>b<subscript>1</subscript></entry>
|
||||
<entry>b<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-RGB888-2X12-BE">
|
||||
<entry>V4L2_MBUS_FMT_RGB888_2X12_BE</entry>
|
||||
<row id="MEDIA-BUS-FMT-RGB888-2X12-BE">
|
||||
<entry>MEDIA_BUS_FMT_RGB888_2X12_BE</entry>
|
||||
<entry>0x100b</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-20;
|
||||
|
@ -490,8 +490,8 @@
|
|||
<entry>b<subscript>1</subscript></entry>
|
||||
<entry>b<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-RGB888-2X12-LE">
|
||||
<entry>V4L2_MBUS_FMT_RGB888_2X12_LE</entry>
|
||||
<row id="MEDIA-BUS-FMT-RGB888-2X12-LE">
|
||||
<entry>MEDIA_BUS_FMT_RGB888_2X12_LE</entry>
|
||||
<entry>0x100c</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-20;
|
||||
|
@ -526,8 +526,8 @@
|
|||
<entry>g<subscript>5</subscript></entry>
|
||||
<entry>g<subscript>4</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-ARGB888-1X32">
|
||||
<entry>V4L2_MBUS_FMT_ARGB888_1X32</entry>
|
||||
<row id="MEDIA-BUS-FMT-ARGB888-1X32">
|
||||
<entry>MEDIA_BUS_FMT_ARGB888_1X32</entry>
|
||||
<entry>0x100d</entry>
|
||||
<entry></entry>
|
||||
<entry>a<subscript>7</subscript></entry>
|
||||
|
@ -600,7 +600,7 @@
|
|||
<para>For instance, a format with uncompressed 10-bit Bayer components
|
||||
arranged in a red, green, green, blue pattern transferred as 2 8-bit
|
||||
samples per pixel with the least significant bits transferred first will
|
||||
be named <constant>V4L2_MBUS_FMT_SRGGB10_2X8_PADHI_LE</constant>.
|
||||
be named <constant>MEDIA_BUS_FMT_SRGGB10_2X8_PADHI_LE</constant>.
|
||||
</para>
|
||||
|
||||
<figure id="bayer-patterns">
|
||||
|
@ -663,8 +663,8 @@
|
|||
</row>
|
||||
</thead>
|
||||
<tbody valign="top">
|
||||
<row id="V4L2-MBUS-FMT-SBGGR8-1X8">
|
||||
<entry>V4L2_MBUS_FMT_SBGGR8_1X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-SBGGR8-1X8">
|
||||
<entry>MEDIA_BUS_FMT_SBGGR8_1X8</entry>
|
||||
<entry>0x3001</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -680,8 +680,8 @@
|
|||
<entry>b<subscript>1</subscript></entry>
|
||||
<entry>b<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SGBRG8-1X8">
|
||||
<entry>V4L2_MBUS_FMT_SGBRG8_1X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-SGBRG8-1X8">
|
||||
<entry>MEDIA_BUS_FMT_SGBRG8_1X8</entry>
|
||||
<entry>0x3013</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -697,8 +697,8 @@
|
|||
<entry>g<subscript>1</subscript></entry>
|
||||
<entry>g<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SGRBG8-1X8">
|
||||
<entry>V4L2_MBUS_FMT_SGRBG8_1X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-SGRBG8-1X8">
|
||||
<entry>MEDIA_BUS_FMT_SGRBG8_1X8</entry>
|
||||
<entry>0x3002</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -714,8 +714,8 @@
|
|||
<entry>g<subscript>1</subscript></entry>
|
||||
<entry>g<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SRGGB8-1X8">
|
||||
<entry>V4L2_MBUS_FMT_SRGGB8_1X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-SRGGB8-1X8">
|
||||
<entry>MEDIA_BUS_FMT_SRGGB8_1X8</entry>
|
||||
<entry>0x3014</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -731,8 +731,8 @@
|
|||
<entry>r<subscript>1</subscript></entry>
|
||||
<entry>r<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SBGGR10-ALAW8-1X8">
|
||||
<entry>V4L2_MBUS_FMT_SBGGR10_ALAW8_1X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-SBGGR10-ALAW8-1X8">
|
||||
<entry>MEDIA_BUS_FMT_SBGGR10_ALAW8_1X8</entry>
|
||||
<entry>0x3015</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -748,8 +748,8 @@
|
|||
<entry>b<subscript>1</subscript></entry>
|
||||
<entry>b<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SGBRG10-ALAW8-1X8">
|
||||
<entry>V4L2_MBUS_FMT_SGBRG10_ALAW8_1X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-SGBRG10-ALAW8-1X8">
|
||||
<entry>MEDIA_BUS_FMT_SGBRG10_ALAW8_1X8</entry>
|
||||
<entry>0x3016</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -765,8 +765,8 @@
|
|||
<entry>g<subscript>1</subscript></entry>
|
||||
<entry>g<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SGRBG10-ALAW8-1X8">
|
||||
<entry>V4L2_MBUS_FMT_SGRBG10_ALAW8_1X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-SGRBG10-ALAW8-1X8">
|
||||
<entry>MEDIA_BUS_FMT_SGRBG10_ALAW8_1X8</entry>
|
||||
<entry>0x3017</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -782,8 +782,8 @@
|
|||
<entry>g<subscript>1</subscript></entry>
|
||||
<entry>g<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SRGGB10-ALAW8-1X8">
|
||||
<entry>V4L2_MBUS_FMT_SRGGB10_ALAW8_1X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-SRGGB10-ALAW8-1X8">
|
||||
<entry>MEDIA_BUS_FMT_SRGGB10_ALAW8_1X8</entry>
|
||||
<entry>0x3018</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -799,8 +799,8 @@
|
|||
<entry>r<subscript>1</subscript></entry>
|
||||
<entry>r<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SBGGR10-DPCM8-1X8">
|
||||
<entry>V4L2_MBUS_FMT_SBGGR10_DPCM8_1X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-SBGGR10-DPCM8-1X8">
|
||||
<entry>MEDIA_BUS_FMT_SBGGR10_DPCM8_1X8</entry>
|
||||
<entry>0x300b</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -816,8 +816,8 @@
|
|||
<entry>b<subscript>1</subscript></entry>
|
||||
<entry>b<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SGBRG10-DPCM8-1X8">
|
||||
<entry>V4L2_MBUS_FMT_SGBRG10_DPCM8_1X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-SGBRG10-DPCM8-1X8">
|
||||
<entry>MEDIA_BUS_FMT_SGBRG10_DPCM8_1X8</entry>
|
||||
<entry>0x300c</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -833,8 +833,8 @@
|
|||
<entry>g<subscript>1</subscript></entry>
|
||||
<entry>g<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SGRBG10-DPCM8-1X8">
|
||||
<entry>V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-SGRBG10-DPCM8-1X8">
|
||||
<entry>MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8</entry>
|
||||
<entry>0x3009</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -850,8 +850,8 @@
|
|||
<entry>g<subscript>1</subscript></entry>
|
||||
<entry>g<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SRGGB10-DPCM8-1X8">
|
||||
<entry>V4L2_MBUS_FMT_SRGGB10_DPCM8_1X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-SRGGB10-DPCM8-1X8">
|
||||
<entry>MEDIA_BUS_FMT_SRGGB10_DPCM8_1X8</entry>
|
||||
<entry>0x300d</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -867,8 +867,8 @@
|
|||
<entry>r<subscript>1</subscript></entry>
|
||||
<entry>r<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SBGGR10-2X8-PADHI-BE">
|
||||
<entry>V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_BE</entry>
|
||||
<row id="MEDIA-BUS-FMT-SBGGR10-2X8-PADHI-BE">
|
||||
<entry>MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_BE</entry>
|
||||
<entry>0x3003</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -901,8 +901,8 @@
|
|||
<entry>b<subscript>1</subscript></entry>
|
||||
<entry>b<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SBGGR10-2X8-PADHI-LE">
|
||||
<entry>V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE</entry>
|
||||
<row id="MEDIA-BUS-FMT-SBGGR10-2X8-PADHI-LE">
|
||||
<entry>MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE</entry>
|
||||
<entry>0x3004</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -935,8 +935,8 @@
|
|||
<entry>b<subscript>9</subscript></entry>
|
||||
<entry>b<subscript>8</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SBGGR10-2X8-PADLO-BE">
|
||||
<entry>V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_BE</entry>
|
||||
<row id="MEDIA-BUS-FMT-SBGGR10-2X8-PADLO-BE">
|
||||
<entry>MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_BE</entry>
|
||||
<entry>0x3005</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -969,8 +969,8 @@
|
|||
<entry>0</entry>
|
||||
<entry>0</entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SBGGR10-2X8-PADLO-LE">
|
||||
<entry>V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_LE</entry>
|
||||
<row id="MEDIA-BUS-FMT-SBGGR10-2X8-PADLO-LE">
|
||||
<entry>MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_LE</entry>
|
||||
<entry>0x3006</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -1003,8 +1003,8 @@
|
|||
<entry>b<subscript>3</subscript></entry>
|
||||
<entry>b<subscript>2</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SBGGR10-1X10">
|
||||
<entry>V4L2_MBUS_FMT_SBGGR10_1X10</entry>
|
||||
<row id="MEDIA-BUS-FMT-SBGGR10-1X10">
|
||||
<entry>MEDIA_BUS_FMT_SBGGR10_1X10</entry>
|
||||
<entry>0x3007</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -1020,8 +1020,8 @@
|
|||
<entry>b<subscript>1</subscript></entry>
|
||||
<entry>b<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SGBRG10-1X10">
|
||||
<entry>V4L2_MBUS_FMT_SGBRG10_1X10</entry>
|
||||
<row id="MEDIA-BUS-FMT-SGBRG10-1X10">
|
||||
<entry>MEDIA_BUS_FMT_SGBRG10_1X10</entry>
|
||||
<entry>0x300e</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -1037,8 +1037,8 @@
|
|||
<entry>g<subscript>1</subscript></entry>
|
||||
<entry>g<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SGRBG10-1X10">
|
||||
<entry>V4L2_MBUS_FMT_SGRBG10_1X10</entry>
|
||||
<row id="MEDIA-BUS-FMT-SGRBG10-1X10">
|
||||
<entry>MEDIA_BUS_FMT_SGRBG10_1X10</entry>
|
||||
<entry>0x300a</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -1054,8 +1054,8 @@
|
|||
<entry>g<subscript>1</subscript></entry>
|
||||
<entry>g<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SRGGB10-1X10">
|
||||
<entry>V4L2_MBUS_FMT_SRGGB10_1X10</entry>
|
||||
<row id="MEDIA-BUS-FMT-SRGGB10-1X10">
|
||||
<entry>MEDIA_BUS_FMT_SRGGB10_1X10</entry>
|
||||
<entry>0x300f</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -1071,8 +1071,8 @@
|
|||
<entry>r<subscript>1</subscript></entry>
|
||||
<entry>r<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SBGGR12-1X12">
|
||||
<entry>V4L2_MBUS_FMT_SBGGR12_1X12</entry>
|
||||
<row id="MEDIA-BUS-FMT-SBGGR12-1X12">
|
||||
<entry>MEDIA_BUS_FMT_SBGGR12_1X12</entry>
|
||||
<entry>0x3008</entry>
|
||||
<entry></entry>
|
||||
<entry>b<subscript>11</subscript></entry>
|
||||
|
@ -1088,8 +1088,8 @@
|
|||
<entry>b<subscript>1</subscript></entry>
|
||||
<entry>b<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SGBRG12-1X12">
|
||||
<entry>V4L2_MBUS_FMT_SGBRG12_1X12</entry>
|
||||
<row id="MEDIA-BUS-FMT-SGBRG12-1X12">
|
||||
<entry>MEDIA_BUS_FMT_SGBRG12_1X12</entry>
|
||||
<entry>0x3010</entry>
|
||||
<entry></entry>
|
||||
<entry>g<subscript>11</subscript></entry>
|
||||
|
@ -1105,8 +1105,8 @@
|
|||
<entry>g<subscript>1</subscript></entry>
|
||||
<entry>g<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SGRBG12-1X12">
|
||||
<entry>V4L2_MBUS_FMT_SGRBG12_1X12</entry>
|
||||
<row id="MEDIA-BUS-FMT-SGRBG12-1X12">
|
||||
<entry>MEDIA_BUS_FMT_SGRBG12_1X12</entry>
|
||||
<entry>0x3011</entry>
|
||||
<entry></entry>
|
||||
<entry>g<subscript>11</subscript></entry>
|
||||
|
@ -1122,8 +1122,8 @@
|
|||
<entry>g<subscript>1</subscript></entry>
|
||||
<entry>g<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SRGGB12-1X12">
|
||||
<entry>V4L2_MBUS_FMT_SRGGB12_1X12</entry>
|
||||
<row id="MEDIA-BUS-FMT-SRGGB12-1X12">
|
||||
<entry>MEDIA_BUS_FMT_SRGGB12_1X12</entry>
|
||||
<entry>0x3012</entry>
|
||||
<entry></entry>
|
||||
<entry>r<subscript>11</subscript></entry>
|
||||
|
@ -1175,7 +1175,7 @@
|
|||
|
||||
<para>For instance, a format where pixels are encoded as 8-bit YUV values
|
||||
downsampled to 4:2:2 and transferred as 2 8-bit bus samples per pixel in the
|
||||
U, Y, V, Y order will be named <constant>V4L2_MBUS_FMT_UYVY8_2X8</constant>.
|
||||
U, Y, V, Y order will be named <constant>MEDIA_BUS_FMT_UYVY8_2X8</constant>.
|
||||
</para>
|
||||
|
||||
<para><xref linkend="v4l2-mbus-pixelcode-yuv8"/> lists existing packed YUV
|
||||
|
@ -1280,8 +1280,8 @@
|
|||
</row>
|
||||
</thead>
|
||||
<tbody valign="top">
|
||||
<row id="V4L2-MBUS-FMT-Y8-1X8">
|
||||
<entry>V4L2_MBUS_FMT_Y8_1X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-Y8-1X8">
|
||||
<entry>MEDIA_BUS_FMT_Y8_1X8</entry>
|
||||
<entry>0x2001</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-24;
|
||||
|
@ -1294,8 +1294,8 @@
|
|||
<entry>y<subscript>1</subscript></entry>
|
||||
<entry>y<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-UV8-1X8">
|
||||
<entry>V4L2_MBUS_FMT_UV8_1X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-UV8-1X8">
|
||||
<entry>MEDIA_BUS_FMT_UV8_1X8</entry>
|
||||
<entry>0x2015</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-24;
|
||||
|
@ -1322,8 +1322,8 @@
|
|||
<entry>v<subscript>1</subscript></entry>
|
||||
<entry>v<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-UYVY8-1_5X8">
|
||||
<entry>V4L2_MBUS_FMT_UYVY8_1_5X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-UYVY8-1_5X8">
|
||||
<entry>MEDIA_BUS_FMT_UYVY8_1_5X8</entry>
|
||||
<entry>0x2002</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-24;
|
||||
|
@ -1406,8 +1406,8 @@
|
|||
<entry>y<subscript>1</subscript></entry>
|
||||
<entry>y<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-VYUY8-1_5X8">
|
||||
<entry>V4L2_MBUS_FMT_VYUY8_1_5X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-VYUY8-1_5X8">
|
||||
<entry>MEDIA_BUS_FMT_VYUY8_1_5X8</entry>
|
||||
<entry>0x2003</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-24;
|
||||
|
@ -1490,8 +1490,8 @@
|
|||
<entry>y<subscript>1</subscript></entry>
|
||||
<entry>y<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-YUYV8-1_5X8">
|
||||
<entry>V4L2_MBUS_FMT_YUYV8_1_5X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-YUYV8-1_5X8">
|
||||
<entry>MEDIA_BUS_FMT_YUYV8_1_5X8</entry>
|
||||
<entry>0x2004</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-24;
|
||||
|
@ -1574,8 +1574,8 @@
|
|||
<entry>v<subscript>1</subscript></entry>
|
||||
<entry>v<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-YVYU8-1_5X8">
|
||||
<entry>V4L2_MBUS_FMT_YVYU8_1_5X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-YVYU8-1_5X8">
|
||||
<entry>MEDIA_BUS_FMT_YVYU8_1_5X8</entry>
|
||||
<entry>0x2005</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-24;
|
||||
|
@ -1658,8 +1658,8 @@
|
|||
<entry>u<subscript>1</subscript></entry>
|
||||
<entry>u<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-UYVY8-2X8">
|
||||
<entry>V4L2_MBUS_FMT_UYVY8_2X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-UYVY8-2X8">
|
||||
<entry>MEDIA_BUS_FMT_UYVY8_2X8</entry>
|
||||
<entry>0x2006</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-24;
|
||||
|
@ -1714,8 +1714,8 @@
|
|||
<entry>y<subscript>1</subscript></entry>
|
||||
<entry>y<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-VYUY8-2X8">
|
||||
<entry>V4L2_MBUS_FMT_VYUY8_2X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-VYUY8-2X8">
|
||||
<entry>MEDIA_BUS_FMT_VYUY8_2X8</entry>
|
||||
<entry>0x2007</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-24;
|
||||
|
@ -1770,8 +1770,8 @@
|
|||
<entry>y<subscript>1</subscript></entry>
|
||||
<entry>y<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-YUYV8-2X8">
|
||||
<entry>V4L2_MBUS_FMT_YUYV8_2X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-YUYV8-2X8">
|
||||
<entry>MEDIA_BUS_FMT_YUYV8_2X8</entry>
|
||||
<entry>0x2008</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-24;
|
||||
|
@ -1826,8 +1826,8 @@
|
|||
<entry>v<subscript>1</subscript></entry>
|
||||
<entry>v<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-YVYU8-2X8">
|
||||
<entry>V4L2_MBUS_FMT_YVYU8_2X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-YVYU8-2X8">
|
||||
<entry>MEDIA_BUS_FMT_YVYU8_2X8</entry>
|
||||
<entry>0x2009</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-24;
|
||||
|
@ -1882,8 +1882,8 @@
|
|||
<entry>u<subscript>1</subscript></entry>
|
||||
<entry>u<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-Y10-1X10">
|
||||
<entry>V4L2_MBUS_FMT_Y10_1X10</entry>
|
||||
<row id="MEDIA-BUS-FMT-Y10-1X10">
|
||||
<entry>MEDIA_BUS_FMT_Y10_1X10</entry>
|
||||
<entry>0x200a</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-22;
|
||||
|
@ -1898,8 +1898,8 @@
|
|||
<entry>y<subscript>1</subscript></entry>
|
||||
<entry>y<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-UYVY10-2X10">
|
||||
<entry>V4L2_MBUS_FMT_UYVY10_2X10</entry>
|
||||
<row id="MEDIA-BUS-FMT-UYVY10-2X10">
|
||||
<entry>MEDIA_BUS_FMT_UYVY10_2X10</entry>
|
||||
<entry>0x2018</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-22;
|
||||
|
@ -1962,8 +1962,8 @@
|
|||
<entry>y<subscript>1</subscript></entry>
|
||||
<entry>y<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-VYUY10-2X10">
|
||||
<entry>V4L2_MBUS_FMT_VYUY10_2X10</entry>
|
||||
<row id="MEDIA-BUS-FMT-VYUY10-2X10">
|
||||
<entry>MEDIA_BUS_FMT_VYUY10_2X10</entry>
|
||||
<entry>0x2019</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-22;
|
||||
|
@ -2026,8 +2026,8 @@
|
|||
<entry>y<subscript>1</subscript></entry>
|
||||
<entry>y<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-YUYV10-2X10">
|
||||
<entry>V4L2_MBUS_FMT_YUYV10_2X10</entry>
|
||||
<row id="MEDIA-BUS-FMT-YUYV10-2X10">
|
||||
<entry>MEDIA_BUS_FMT_YUYV10_2X10</entry>
|
||||
<entry>0x200b</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-22;
|
||||
|
@ -2090,8 +2090,8 @@
|
|||
<entry>v<subscript>1</subscript></entry>
|
||||
<entry>v<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-YVYU10-2X10">
|
||||
<entry>V4L2_MBUS_FMT_YVYU10_2X10</entry>
|
||||
<row id="MEDIA-BUS-FMT-YVYU10-2X10">
|
||||
<entry>MEDIA_BUS_FMT_YVYU10_2X10</entry>
|
||||
<entry>0x200c</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-22;
|
||||
|
@ -2154,8 +2154,8 @@
|
|||
<entry>u<subscript>1</subscript></entry>
|
||||
<entry>u<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-Y12-1X12">
|
||||
<entry>V4L2_MBUS_FMT_Y12_1X12</entry>
|
||||
<row id="MEDIA-BUS-FMT-Y12-1X12">
|
||||
<entry>MEDIA_BUS_FMT_Y12_1X12</entry>
|
||||
<entry>0x2013</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-20;
|
||||
|
@ -2172,8 +2172,8 @@
|
|||
<entry>y<subscript>1</subscript></entry>
|
||||
<entry>y<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-UYVY8-1X16">
|
||||
<entry>V4L2_MBUS_FMT_UYVY8_1X16</entry>
|
||||
<row id="MEDIA-BUS-FMT-UYVY8-1X16">
|
||||
<entry>MEDIA_BUS_FMT_UYVY8_1X16</entry>
|
||||
<entry>0x200f</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-16;
|
||||
|
@ -2216,8 +2216,8 @@
|
|||
<entry>y<subscript>1</subscript></entry>
|
||||
<entry>y<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-VYUY8-1X16">
|
||||
<entry>V4L2_MBUS_FMT_VYUY8_1X16</entry>
|
||||
<row id="MEDIA-BUS-FMT-VYUY8-1X16">
|
||||
<entry>MEDIA_BUS_FMT_VYUY8_1X16</entry>
|
||||
<entry>0x2010</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-16;
|
||||
|
@ -2260,8 +2260,8 @@
|
|||
<entry>y<subscript>1</subscript></entry>
|
||||
<entry>y<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-YUYV8-1X16">
|
||||
<entry>V4L2_MBUS_FMT_YUYV8_1X16</entry>
|
||||
<row id="MEDIA-BUS-FMT-YUYV8-1X16">
|
||||
<entry>MEDIA_BUS_FMT_YUYV8_1X16</entry>
|
||||
<entry>0x2011</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-16;
|
||||
|
@ -2304,8 +2304,8 @@
|
|||
<entry>v<subscript>1</subscript></entry>
|
||||
<entry>v<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-YVYU8-1X16">
|
||||
<entry>V4L2_MBUS_FMT_YVYU8_1X16</entry>
|
||||
<row id="MEDIA-BUS-FMT-YVYU8-1X16">
|
||||
<entry>MEDIA_BUS_FMT_YVYU8_1X16</entry>
|
||||
<entry>0x2012</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-16;
|
||||
|
@ -2348,8 +2348,8 @@
|
|||
<entry>u<subscript>1</subscript></entry>
|
||||
<entry>u<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-YDYUYDYV8-1X16">
|
||||
<entry>V4L2_MBUS_FMT_YDYUYDYV8_1X16</entry>
|
||||
<row id="MEDIA-BUS-FMT-YDYUYDYV8-1X16">
|
||||
<entry>MEDIA_BUS_FMT_YDYUYDYV8_1X16</entry>
|
||||
<entry>0x2014</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-16;
|
||||
|
@ -2436,8 +2436,8 @@
|
|||
<entry>v<subscript>1</subscript></entry>
|
||||
<entry>v<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-UYVY10-1X20">
|
||||
<entry>V4L2_MBUS_FMT_UYVY10_1X20</entry>
|
||||
<row id="MEDIA-BUS-FMT-UYVY10-1X20">
|
||||
<entry>MEDIA_BUS_FMT_UYVY10_1X20</entry>
|
||||
<entry>0x201a</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-12;
|
||||
|
@ -2488,8 +2488,8 @@
|
|||
<entry>y<subscript>1</subscript></entry>
|
||||
<entry>y<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-VYUY10-1X20">
|
||||
<entry>V4L2_MBUS_FMT_VYUY10_1X20</entry>
|
||||
<row id="MEDIA-BUS-FMT-VYUY10-1X20">
|
||||
<entry>MEDIA_BUS_FMT_VYUY10_1X20</entry>
|
||||
<entry>0x201b</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-12;
|
||||
|
@ -2540,8 +2540,8 @@
|
|||
<entry>y<subscript>1</subscript></entry>
|
||||
<entry>y<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-YUYV10-1X20">
|
||||
<entry>V4L2_MBUS_FMT_YUYV10_1X20</entry>
|
||||
<row id="MEDIA-BUS-FMT-YUYV10-1X20">
|
||||
<entry>MEDIA_BUS_FMT_YUYV10_1X20</entry>
|
||||
<entry>0x200d</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-12;
|
||||
|
@ -2592,8 +2592,8 @@
|
|||
<entry>v<subscript>1</subscript></entry>
|
||||
<entry>v<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-YVYU10-1X20">
|
||||
<entry>V4L2_MBUS_FMT_YVYU10_1X20</entry>
|
||||
<row id="MEDIA-BUS-FMT-YVYU10-1X20">
|
||||
<entry>MEDIA_BUS_FMT_YVYU10_1X20</entry>
|
||||
<entry>0x200e</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-12;
|
||||
|
@ -2644,8 +2644,8 @@
|
|||
<entry>u<subscript>1</subscript></entry>
|
||||
<entry>u<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-YUV10-1X30">
|
||||
<entry>V4L2_MBUS_FMT_YUV10_1X30</entry>
|
||||
<row id="MEDIA-BUS-FMT-YUV10-1X30">
|
||||
<entry>MEDIA_BUS_FMT_YUV10_1X30</entry>
|
||||
<entry>0x2016</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
|
@ -2681,8 +2681,8 @@
|
|||
<entry>v<subscript>1</subscript></entry>
|
||||
<entry>v<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-AYUV8-1X32">
|
||||
<entry>V4L2_MBUS_FMT_AYUV8_1X32</entry>
|
||||
<row id="MEDIA-BUS-FMT-AYUV8-1X32">
|
||||
<entry>MEDIA_BUS_FMT_AYUV8_1X32</entry>
|
||||
<entry>0x2017</entry>
|
||||
<entry></entry>
|
||||
<entry>a<subscript>7</subscript></entry>
|
||||
|
@ -2718,8 +2718,8 @@
|
|||
<entry>v<subscript>1</subscript></entry>
|
||||
<entry>v<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-UYVY12-2X12">
|
||||
<entry>V4L2_MBUS_FMT_UYVY12_2X12</entry>
|
||||
<row id="MEDIA-BUS-FMT-UYVY12-2X12">
|
||||
<entry>MEDIA_BUS_FMT_UYVY12_2X12</entry>
|
||||
<entry>0x201c</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-20;
|
||||
|
@ -2790,8 +2790,8 @@
|
|||
<entry>y<subscript>1</subscript></entry>
|
||||
<entry>y<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-VYUY12-2X12">
|
||||
<entry>V4L2_MBUS_FMT_VYUY12_2X12</entry>
|
||||
<row id="MEDIA-BUS-FMT-VYUY12-2X12">
|
||||
<entry>MEDIA_BUS_FMT_VYUY12_2X12</entry>
|
||||
<entry>0x201d</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-20;
|
||||
|
@ -2862,8 +2862,8 @@
|
|||
<entry>y<subscript>1</subscript></entry>
|
||||
<entry>y<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-YUYV12-2X12">
|
||||
<entry>V4L2_MBUS_FMT_YUYV12_2X12</entry>
|
||||
<row id="MEDIA-BUS-FMT-YUYV12-2X12">
|
||||
<entry>MEDIA_BUS_FMT_YUYV12_2X12</entry>
|
||||
<entry>0x201e</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-20;
|
||||
|
@ -2934,8 +2934,8 @@
|
|||
<entry>v<subscript>1</subscript></entry>
|
||||
<entry>v<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-YVYU12-2X12">
|
||||
<entry>V4L2_MBUS_FMT_YVYU12_2X12</entry>
|
||||
<row id="MEDIA-BUS-FMT-YVYU12-2X12">
|
||||
<entry>MEDIA_BUS_FMT_YVYU12_2X12</entry>
|
||||
<entry>0x201f</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-20;
|
||||
|
@ -3006,8 +3006,8 @@
|
|||
<entry>u<subscript>1</subscript></entry>
|
||||
<entry>u<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-UYVY12-1X24">
|
||||
<entry>V4L2_MBUS_FMT_UYVY12_1X24</entry>
|
||||
<row id="MEDIA-BUS-FMT-UYVY12-1X24">
|
||||
<entry>MEDIA_BUS_FMT_UYVY12_1X24</entry>
|
||||
<entry>0x2020</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-8;
|
||||
|
@ -3066,8 +3066,8 @@
|
|||
<entry>y<subscript>1</subscript></entry>
|
||||
<entry>y<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-VYUY12-1X24">
|
||||
<entry>V4L2_MBUS_FMT_VYUY12_1X24</entry>
|
||||
<row id="MEDIA-BUS-FMT-VYUY12-1X24">
|
||||
<entry>MEDIA_BUS_FMT_VYUY12_1X24</entry>
|
||||
<entry>0x2021</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-8;
|
||||
|
@ -3126,8 +3126,8 @@
|
|||
<entry>y<subscript>1</subscript></entry>
|
||||
<entry>y<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-YUYV12-1X24">
|
||||
<entry>V4L2_MBUS_FMT_YUYV12_1X24</entry>
|
||||
<row id="MEDIA-BUS-FMT-YUYV12-1X24">
|
||||
<entry>MEDIA_BUS_FMT_YUYV12_1X24</entry>
|
||||
<entry>0x2022</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-8;
|
||||
|
@ -3186,8 +3186,8 @@
|
|||
<entry>v<subscript>1</subscript></entry>
|
||||
<entry>v<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-YVYU12-1X24">
|
||||
<entry>V4L2_MBUS_FMT_YVYU12_1X24</entry>
|
||||
<row id="MEDIA-BUS-FMT-YVYU12-1X24">
|
||||
<entry>MEDIA_BUS_FMT_YVYU12_1X24</entry>
|
||||
<entry>0x2023</entry>
|
||||
<entry></entry>
|
||||
&dash-ent-8;
|
||||
|
@ -3366,8 +3366,8 @@
|
|||
</row>
|
||||
</thead>
|
||||
<tbody valign="top">
|
||||
<row id="V4L2-MBUS-FMT-AHSV8888-1X32">
|
||||
<entry>V4L2_MBUS_FMT_AHSV8888_1X32</entry>
|
||||
<row id="MEDIA-BUS-FMT-AHSV8888-1X32">
|
||||
<entry>MEDIA_BUS_FMT_AHSV8888_1X32</entry>
|
||||
<entry>0x6001</entry>
|
||||
<entry></entry>
|
||||
<entry>a<subscript>7</subscript></entry>
|
||||
|
@ -3422,7 +3422,7 @@
|
|||
</para>
|
||||
|
||||
<para>For instance, for a JPEG baseline process and an 8-bit bus width
|
||||
the format will be named <constant>V4L2_MBUS_FMT_JPEG_1X8</constant>.
|
||||
the format will be named <constant>MEDIA_BUS_FMT_JPEG_1X8</constant>.
|
||||
</para>
|
||||
|
||||
<para>The following table lists existing JPEG compressed formats.</para>
|
||||
|
@ -3441,8 +3441,8 @@
|
|||
</row>
|
||||
</thead>
|
||||
<tbody valign="top">
|
||||
<row id="V4L2-MBUS-FMT-JPEG-1X8">
|
||||
<entry>V4L2_MBUS_FMT_JPEG_1X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-JPEG-1X8">
|
||||
<entry>MEDIA_BUS_FMT_JPEG_1X8</entry>
|
||||
<entry>0x4001</entry>
|
||||
<entry>Besides of its usage for the parallel bus this format is
|
||||
recommended for transmission of JPEG data over MIPI CSI bus
|
||||
|
@ -3484,8 +3484,8 @@ interface and may change in the future.</para>
|
|||
</row>
|
||||
</thead>
|
||||
<tbody valign="top">
|
||||
<row id="V4L2-MBUS-FMT-S5C-UYVY-JPEG-1X8">
|
||||
<entry>V4L2_MBUS_FMT_S5C_UYVY_JPEG_1X8</entry>
|
||||
<row id="MEDIA-BUS-FMT-S5C-UYVY-JPEG-1X8">
|
||||
<entry>MEDIA_BUS_FMT_S5C_UYVY_JPEG_1X8</entry>
|
||||
<entry>0x5001</entry>
|
||||
<entry>
|
||||
Interleaved raw UYVY and JPEG image format with embedded
|
||||
|
|
|
@ -287,6 +287,14 @@ input/output interface to linux-media@vger.kernel.org on 19 Oct 2009.
|
|||
<entry>0x00000004</entry>
|
||||
<entry>This input supports setting the TV standard by using VIDIOC_S_STD.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_IN_CAP_NATIVE_SIZE</constant></entry>
|
||||
<entry>0x00000008</entry>
|
||||
<entry>This input supports setting the native size using
|
||||
the <constant>V4L2_SEL_TGT_NATIVE_SIZE</constant>
|
||||
selection target, see <xref
|
||||
linkend="v4l2-selections-common"/>.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
|
|
|
@ -172,6 +172,14 @@ input/output interface to linux-media@vger.kernel.org on 19 Oct 2009.
|
|||
<entry>0x00000004</entry>
|
||||
<entry>This output supports setting the TV standard by using VIDIOC_S_STD.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_OUT_CAP_NATIVE_SIZE</constant></entry>
|
||||
<entry>0x00000008</entry>
|
||||
<entry>This output supports setting the native size using
|
||||
the <constant>V4L2_SEL_TGT_NATIVE_SIZE</constant>
|
||||
selection target, see <xref
|
||||
linkend="v4l2-selections-common"/>.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
* Amlogic Meson IR remote control receiver
|
||||
|
||||
Required properties:
|
||||
- compatible : should be "amlogic,meson6-ir"
|
||||
- reg : physical base address and length of the device registers
|
||||
- interrupts : a single specifier for the interrupt from the device
|
||||
|
||||
Example:
|
||||
|
||||
ir-receiver@c8100480 {
|
||||
compatible= "amlogic,meson6-ir";
|
||||
reg = <0xc8100480 0x20>;
|
||||
interrupts = <0 15 1>;
|
||||
};
|
|
@ -0,0 +1,30 @@
|
|||
* Silicon Labs FM Radio transmitter
|
||||
|
||||
The Silicon Labs Si4713 is an FM radio transmitter with receive power scan
|
||||
supporting 76-108 MHz. It includes an RDS encoder and has both, a stereo-analog
|
||||
and a digital interface, which supports I2S, left-justified and a custom
|
||||
DSP-mode format. It is programmable through an I2C interface.
|
||||
|
||||
Required Properties:
|
||||
- compatible: Should contain "silabs,si4713"
|
||||
- reg: the I2C address of the device
|
||||
|
||||
Optional Properties:
|
||||
- interrupts-extended: Interrupt specifier for the chips interrupt
|
||||
- reset-gpios: GPIO specifier for the chips reset line
|
||||
- vdd-supply: phandle for Vdd regulator
|
||||
- vio-supply: phandle for Vio regulator
|
||||
|
||||
Example:
|
||||
|
||||
&i2c2 {
|
||||
fmtx: si4713@63 {
|
||||
compatible = "silabs,si4713";
|
||||
reg = <0x63>;
|
||||
|
||||
interrupts-extended = <&gpio2 21 IRQ_TYPE_EDGE_FALLING>; /* 53 */
|
||||
reset-gpios = <&gpio6 3 GPIO_ACTIVE_HIGH>; /* 163 */
|
||||
vio-supply = <&vio>;
|
||||
vdd-supply = <&vaux1>;
|
||||
};
|
||||
};
|
|
@ -43,3 +43,5 @@
|
|||
42 -> Leadtek Winfast PxPVR2200 [107d:6f21]
|
||||
43 -> Hauppauge ImpactVCB-e [0070:7133]
|
||||
44 -> DViCO FusionHDTV DVB-T Dual Express2 [18ac:db98]
|
||||
45 -> DVBSky T9580 [4254:9580]
|
||||
46 -> DVBSky T980C [4254:980c]
|
||||
|
|
|
@ -93,3 +93,4 @@
|
|||
92 -> PCTV DVB-S2 Stick (461e) (em28178)
|
||||
93 -> KWorld USB ATSC TV Stick UB435-Q V3 (em2874) [1b80:e34c]
|
||||
94 -> PCTV tripleStick (292e) (em28178)
|
||||
95 -> Leadtek VC100 (em2861) [0413:6f07]
|
||||
|
|
|
@ -191,3 +191,4 @@
|
|||
190 -> Asus My Cinema PS3-100 [1043:48cd]
|
||||
191 -> Hawell HW-9004V1
|
||||
192 -> AverMedia AverTV Satellite Hybrid+FM A706 [1461:2055]
|
||||
193 -> WIS Voyager or compatible [1905:7007]
|
||||
|
|
|
@ -151,7 +151,7 @@ they are transferred over a media bus. Soc-camera provides support to
|
|||
conveniently manage these formats. A table of standard transformations is
|
||||
maintained by soc-camera core, which describes, what FOURCC pixel format will
|
||||
be obtained, if a media-bus pixel format is stored in memory according to
|
||||
certain rules. E.g. if V4L2_MBUS_FMT_YUYV8_2X8 data is sampled with 8 bits per
|
||||
certain rules. E.g. if MEDIA_BUS_FMT_YUYV8_2X8 data is sampled with 8 bits per
|
||||
sample and stored in memory in the little-endian order with no gaps between
|
||||
bytes, data in memory will represent the V4L2_PIX_FMT_YUYV FOURCC format. These
|
||||
standard transformations will be used by soc-camera or by camera host drivers to
|
||||
|
|
41
MAINTAINERS
41
MAINTAINERS
|
@ -850,6 +850,7 @@ ARM/Amlogic MesonX SoC support
|
|||
M: Carlo Caione <carlo@caione.org>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: drivers/media/rc/meson-ir.c
|
||||
N: meson[x68]
|
||||
|
||||
ARM/ATMEL AT91RM9200 AND AT91SAM ARM ARCHITECTURES
|
||||
|
@ -2512,6 +2513,13 @@ F: fs/coda/
|
|||
F: include/linux/coda*.h
|
||||
F: include/uapi/linux/coda*.h
|
||||
|
||||
CODA V4L2 MEM2MEM DRIVER
|
||||
M: Philipp Zabel <p.zabel@pengutronix.de>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/media/coda.txt
|
||||
F: drivers/media/platform/coda/
|
||||
|
||||
COMMON CLK FRAMEWORK
|
||||
M: Mike Turquette <mturquette@linaro.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
|
@ -4746,6 +4754,12 @@ F: net/mac802154/
|
|||
F: drivers/net/ieee802154/
|
||||
F: Documentation/networking/ieee802154.txt
|
||||
|
||||
IGORPLUG-USB IR RECEIVER
|
||||
M: Sean Young <sean@mess.org>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/media/rc/igorplugusb.c
|
||||
|
||||
IGUANAWORKS USB IR TRANSCEIVER
|
||||
M: Sean Young <sean@mess.org>
|
||||
L: linux-media@vger.kernel.org
|
||||
|
@ -4803,6 +4817,11 @@ L: linux-security-module@vger.kernel.org
|
|||
S: Supported
|
||||
F: security/integrity/ima/
|
||||
|
||||
IMGTEC IR DECODER DRIVER
|
||||
M: James Hogan <james.hogan@imgtec.com>
|
||||
S: Maintained
|
||||
F: drivers/media/rc/img-ir/
|
||||
|
||||
IMS TWINTURBO FRAMEBUFFER DRIVER
|
||||
L: linux-fbdev@vger.kernel.org
|
||||
S: Orphan
|
||||
|
@ -6151,6 +6170,28 @@ S: Supported
|
|||
F: include/linux/mlx5/
|
||||
F: drivers/infiniband/hw/mlx5/
|
||||
|
||||
MN88472 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/staging/media/mn88472/
|
||||
F: drivers/media/dvb-frontends/mn88472.h
|
||||
|
||||
MN88473 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/staging/media/mn88473/
|
||||
F: drivers/media/dvb-frontends/mn88473.h
|
||||
|
||||
MODULE SUPPORT
|
||||
M: Rusty Russell <rusty@rustcorp.com.au>
|
||||
S: Maintained
|
||||
|
|
|
@ -143,5 +143,12 @@ i2c_B: i2c@c11087c0 {
|
|||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
ir_receiver: ir-receiver@c8100480 {
|
||||
compatible= "amlogic,meson6-ir";
|
||||
reg = <0xc8100480 0x20>;
|
||||
interrupts = <0 15 1>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
}; /* end of / */
|
||||
|
|
|
@ -294,7 +294,7 @@ static struct vpbe_output dm355evm_vpbe_outputs[] = {
|
|||
.default_mode = "ntsc",
|
||||
.num_modes = ARRAY_SIZE(dm355evm_enc_preset_timing),
|
||||
.modes = dm355evm_enc_preset_timing,
|
||||
.if_params = V4L2_MBUS_FMT_FIXED,
|
||||
.if_params = MEDIA_BUS_FMT_FIXED,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -485,7 +485,7 @@ static struct vpbe_output dm365evm_vpbe_outputs[] = {
|
|||
.default_mode = "ntsc",
|
||||
.num_modes = ARRAY_SIZE(dm365evm_enc_std_timing),
|
||||
.modes = dm365evm_enc_std_timing,
|
||||
.if_params = V4L2_MBUS_FMT_FIXED,
|
||||
.if_params = MEDIA_BUS_FMT_FIXED,
|
||||
},
|
||||
{
|
||||
.output = {
|
||||
|
@ -498,7 +498,7 @@ static struct vpbe_output dm365evm_vpbe_outputs[] = {
|
|||
.default_mode = "480p59_94",
|
||||
.num_modes = ARRAY_SIZE(dm365evm_enc_preset_timing),
|
||||
.modes = dm365evm_enc_preset_timing,
|
||||
.if_params = V4L2_MBUS_FMT_FIXED,
|
||||
.if_params = MEDIA_BUS_FMT_FIXED,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -785,14 +785,13 @@ static struct resource dm355_v4l2_disp_resources[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static int dm355_vpbe_setup_pinmux(enum v4l2_mbus_pixelcode if_type,
|
||||
int field)
|
||||
static int dm355_vpbe_setup_pinmux(u32 if_type, int field)
|
||||
{
|
||||
switch (if_type) {
|
||||
case V4L2_MBUS_FMT_SGRBG8_1X8:
|
||||
case MEDIA_BUS_FMT_SGRBG8_1X8:
|
||||
davinci_cfg_reg(DM355_VOUT_FIELD_G70);
|
||||
break;
|
||||
case V4L2_MBUS_FMT_YUYV10_1X20:
|
||||
case MEDIA_BUS_FMT_YUYV10_1X20:
|
||||
if (field)
|
||||
davinci_cfg_reg(DM355_VOUT_FIELD);
|
||||
else
|
||||
|
|
|
@ -1306,16 +1306,15 @@ static struct resource dm365_v4l2_disp_resources[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static int dm365_vpbe_setup_pinmux(enum v4l2_mbus_pixelcode if_type,
|
||||
int field)
|
||||
static int dm365_vpbe_setup_pinmux(u32 if_type, int field)
|
||||
{
|
||||
switch (if_type) {
|
||||
case V4L2_MBUS_FMT_SGRBG8_1X8:
|
||||
case MEDIA_BUS_FMT_SGRBG8_1X8:
|
||||
davinci_cfg_reg(DM365_VOUT_FIELD_G81);
|
||||
davinci_cfg_reg(DM365_VOUT_COUTL_EN);
|
||||
davinci_cfg_reg(DM365_VOUT_COUTH_EN);
|
||||
break;
|
||||
case V4L2_MBUS_FMT_YUYV10_1X20:
|
||||
case MEDIA_BUS_FMT_YUYV10_1X20:
|
||||
if (field)
|
||||
davinci_cfg_reg(DM365_VOUT_FIELD);
|
||||
else
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <linux/regulator/machine.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/gpio/machine.h>
|
||||
#include <linux/omap-gpmc.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/power/isp1704_charger.h>
|
||||
|
@ -38,7 +39,6 @@
|
|||
|
||||
#include <sound/tlv320aic3x.h>
|
||||
#include <sound/tpa6130a2-plat.h>
|
||||
#include <media/radio-si4713.h>
|
||||
#include <media/si4713.h>
|
||||
#include <linux/platform_data/leds-lp55xx.h>
|
||||
|
||||
|
@ -756,46 +756,17 @@ static struct regulator_init_data rx51_vintdig = {
|
|||
},
|
||||
};
|
||||
|
||||
static const char * const si4713_supply_names[] = {
|
||||
"vio",
|
||||
"vdd",
|
||||
};
|
||||
|
||||
static struct si4713_platform_data rx51_si4713_i2c_data __initdata_or_module = {
|
||||
.supplies = ARRAY_SIZE(si4713_supply_names),
|
||||
.supply_names = si4713_supply_names,
|
||||
.gpio_reset = RX51_FMTX_RESET_GPIO,
|
||||
};
|
||||
|
||||
static struct i2c_board_info rx51_si4713_board_info __initdata_or_module = {
|
||||
I2C_BOARD_INFO("si4713", SI4713_I2C_ADDR_BUSEN_HIGH),
|
||||
.platform_data = &rx51_si4713_i2c_data,
|
||||
};
|
||||
|
||||
static struct radio_si4713_platform_data rx51_si4713_data __initdata_or_module = {
|
||||
.i2c_bus = 2,
|
||||
.subdev_board_info = &rx51_si4713_board_info,
|
||||
};
|
||||
|
||||
static struct platform_device rx51_si4713_dev __initdata_or_module = {
|
||||
.name = "radio-si4713",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &rx51_si4713_data,
|
||||
static struct gpiod_lookup_table rx51_fmtx_gpios_table = {
|
||||
.dev_id = "2-0063",
|
||||
.table = {
|
||||
GPIO_LOOKUP("gpio.6", 3, "reset", GPIO_ACTIVE_HIGH), /* 163 */
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static __init void rx51_init_si4713(void)
|
||||
static __init void rx51_gpio_init(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = gpio_request_one(RX51_FMTX_IRQ, GPIOF_DIR_IN, "si4713 irq");
|
||||
if (err) {
|
||||
printk(KERN_ERR "Cannot request si4713 irq gpio. %d\n", err);
|
||||
return;
|
||||
}
|
||||
rx51_si4713_board_info.irq = gpio_to_irq(RX51_FMTX_IRQ);
|
||||
platform_device_register(&rx51_si4713_dev);
|
||||
gpiod_add_lookup_table(&rx51_fmtx_gpios_table);
|
||||
}
|
||||
|
||||
static int rx51_twlgpio_setup(struct device *dev, unsigned gpio, unsigned n)
|
||||
|
@ -1025,7 +996,19 @@ static struct aic3x_pdata rx51_aic3x_data2 = {
|
|||
.gpio_reset = 60,
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_I2C_SI4713) && IS_ENABLED(CONFIG_PLATFORM_SI4713)
|
||||
static struct si4713_platform_data rx51_si4713_platform_data = {
|
||||
.is_platform_device = true
|
||||
};
|
||||
#endif
|
||||
|
||||
static struct i2c_board_info __initdata rx51_peripherals_i2c_board_info_2[] = {
|
||||
#if IS_ENABLED(CONFIG_I2C_SI4713) && IS_ENABLED(CONFIG_PLATFORM_SI4713)
|
||||
{
|
||||
I2C_BOARD_INFO("si4713", 0x63),
|
||||
.platform_data = &rx51_si4713_platform_data,
|
||||
},
|
||||
#endif
|
||||
{
|
||||
I2C_BOARD_INFO("tlv320aic3x", 0x18),
|
||||
.platform_data = &rx51_aic3x_data,
|
||||
|
@ -1066,6 +1049,10 @@ static struct i2c_board_info __initdata rx51_peripherals_i2c_board_info_3[] = {
|
|||
|
||||
static int __init rx51_i2c_init(void)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_I2C_SI4713) && IS_ENABLED(CONFIG_PLATFORM_SI4713)
|
||||
int err;
|
||||
#endif
|
||||
|
||||
if ((system_rev >= SYSTEM_REV_S_USES_VAUX3 && system_rev < 0x100) ||
|
||||
system_rev >= SYSTEM_REV_B_USES_VAUX3) {
|
||||
rx51_twldata.vaux3 = &rx51_vaux3_mmc;
|
||||
|
@ -1083,6 +1070,14 @@ static int __init rx51_i2c_init(void)
|
|||
rx51_twldata.vdac->constraints.name = "VDAC";
|
||||
|
||||
omap_pmic_init(1, 2200, "twl5030", 7 + OMAP_INTC_START, &rx51_twldata);
|
||||
#if IS_ENABLED(CONFIG_I2C_SI4713) && IS_ENABLED(CONFIG_PLATFORM_SI4713)
|
||||
err = gpio_request_one(RX51_FMTX_IRQ, GPIOF_DIR_IN, "si4713 irq");
|
||||
if (err) {
|
||||
printk(KERN_ERR "Cannot request si4713 irq gpio. %d\n", err);
|
||||
return err;
|
||||
}
|
||||
rx51_peripherals_i2c_board_info_2[0].irq = gpio_to_irq(RX51_FMTX_IRQ);
|
||||
#endif
|
||||
omap_register_i2c_bus(2, 100, rx51_peripherals_i2c_board_info_2,
|
||||
ARRAY_SIZE(rx51_peripherals_i2c_board_info_2));
|
||||
#if defined(CONFIG_SENSORS_LIS3_I2C) || defined(CONFIG_SENSORS_LIS3_I2C_MODULE)
|
||||
|
@ -1269,13 +1264,13 @@ static void __init rx51_init_omap3_rom_rng(void)
|
|||
|
||||
void __init rx51_peripherals_init(void)
|
||||
{
|
||||
rx51_gpio_init();
|
||||
rx51_i2c_init();
|
||||
regulator_has_full_constraints();
|
||||
gpmc_onenand_init(board_onenand_data);
|
||||
rx51_add_gpio_keys();
|
||||
rx51_init_wl1251();
|
||||
rx51_init_tsc2005();
|
||||
rx51_init_si4713();
|
||||
rx51_init_lirc();
|
||||
spi_register_board_info(rx51_peripherals_spi_board_info,
|
||||
ARRAY_SIZE(rx51_peripherals_spi_board_info));
|
||||
|
|
|
@ -67,28 +67,6 @@ static int __init omap3_l3_init(void)
|
|||
}
|
||||
omap_postcore_initcall(omap3_l3_init);
|
||||
|
||||
#if defined(CONFIG_VIDEO_OMAP2) || defined(CONFIG_VIDEO_OMAP2_MODULE)
|
||||
|
||||
static struct resource omap2cam_resources[] = {
|
||||
{
|
||||
.start = OMAP24XX_CAMERA_BASE,
|
||||
.end = OMAP24XX_CAMERA_BASE + 0xfff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.start = 24 + OMAP_INTC_START,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device omap2cam_device = {
|
||||
.name = "omap24xxcam",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(omap2cam_resources),
|
||||
.resource = omap2cam_resources,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_IOMMU_API)
|
||||
|
||||
#include <linux/platform_data/iommu-omap.h>
|
||||
|
@ -211,14 +189,6 @@ int omap3_init_camera(struct isp_platform_data *pdata)
|
|||
|
||||
#endif
|
||||
|
||||
static inline void omap_init_camera(void)
|
||||
{
|
||||
#if defined(CONFIG_VIDEO_OMAP2) || defined(CONFIG_VIDEO_OMAP2_MODULE)
|
||||
if (cpu_is_omap24xx())
|
||||
platform_device_register(&omap2cam_device);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(CONFIG_OMAP2PLUS_MBOX) || defined(CONFIG_OMAP2PLUS_MBOX_MODULE)
|
||||
static inline void __init omap_init_mbox(void)
|
||||
{
|
||||
|
@ -397,7 +367,6 @@ static int __init omap2_init_devices(void)
|
|||
* in alphabetical order so they're easier to sort through.
|
||||
*/
|
||||
omap_init_audio();
|
||||
omap_init_camera();
|
||||
/* If dtb is there, the devices will be created dynamically */
|
||||
if (!of_have_populated_dt()) {
|
||||
omap_init_mbox();
|
||||
|
|
|
@ -1149,7 +1149,7 @@ static struct soc_camera_platform_info camera_info = {
|
|||
.format_name = "UYVY",
|
||||
.format_depth = 16,
|
||||
.format = {
|
||||
.code = V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
.code = MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_SMPTE170M,
|
||||
.field = V4L2_FIELD_NONE,
|
||||
.width = 640,
|
||||
|
|
|
@ -338,7 +338,7 @@ static struct soc_camera_platform_info camera_info = {
|
|||
.format_name = "UYVY",
|
||||
.format_depth = 16,
|
||||
.format = {
|
||||
.code = V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
.code = MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_SMPTE170M,
|
||||
.field = V4L2_FIELD_NONE,
|
||||
.width = 640,
|
||||
|
|
|
@ -227,83 +227,83 @@ static int ipu_csi_set_testgen_mclk(struct ipu_csi *csi, u32 pixel_clk,
|
|||
static int mbus_code_to_bus_cfg(struct ipu_csi_bus_config *cfg, u32 mbus_code)
|
||||
{
|
||||
switch (mbus_code) {
|
||||
case V4L2_MBUS_FMT_BGR565_2X8_BE:
|
||||
case V4L2_MBUS_FMT_BGR565_2X8_LE:
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_BE:
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_BGR565_2X8_BE:
|
||||
case MEDIA_BUS_FMT_BGR565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_BE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_LE:
|
||||
cfg->data_fmt = CSI_SENS_CONF_DATA_FMT_RGB565;
|
||||
cfg->mipi_dt = MIPI_DT_RGB565;
|
||||
cfg->data_width = IPU_CSI_DATA_WIDTH_8;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_RGB444_2X8_PADHI_BE:
|
||||
case V4L2_MBUS_FMT_RGB444_2X8_PADHI_LE:
|
||||
case MEDIA_BUS_FMT_RGB444_2X8_PADHI_BE:
|
||||
case MEDIA_BUS_FMT_RGB444_2X8_PADHI_LE:
|
||||
cfg->data_fmt = CSI_SENS_CONF_DATA_FMT_RGB444;
|
||||
cfg->mipi_dt = MIPI_DT_RGB444;
|
||||
cfg->data_width = IPU_CSI_DATA_WIDTH_8;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE:
|
||||
case V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE:
|
||||
case MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE:
|
||||
case MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE:
|
||||
cfg->data_fmt = CSI_SENS_CONF_DATA_FMT_RGB555;
|
||||
cfg->mipi_dt = MIPI_DT_RGB555;
|
||||
cfg->data_width = IPU_CSI_DATA_WIDTH_8;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
cfg->data_fmt = CSI_SENS_CONF_DATA_FMT_YUV422_UYVY;
|
||||
cfg->mipi_dt = MIPI_DT_YUV422;
|
||||
cfg->data_width = IPU_CSI_DATA_WIDTH_8;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
cfg->data_fmt = CSI_SENS_CONF_DATA_FMT_YUV422_YUYV;
|
||||
cfg->mipi_dt = MIPI_DT_YUV422;
|
||||
cfg->data_width = IPU_CSI_DATA_WIDTH_8;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_UYVY8_1X16:
|
||||
case MEDIA_BUS_FMT_UYVY8_1X16:
|
||||
cfg->data_fmt = CSI_SENS_CONF_DATA_FMT_YUV422_UYVY;
|
||||
cfg->mipi_dt = MIPI_DT_YUV422;
|
||||
cfg->data_width = IPU_CSI_DATA_WIDTH_16;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_YUYV8_1X16:
|
||||
case MEDIA_BUS_FMT_YUYV8_1X16:
|
||||
cfg->data_fmt = CSI_SENS_CONF_DATA_FMT_YUV422_YUYV;
|
||||
cfg->mipi_dt = MIPI_DT_YUV422;
|
||||
cfg->data_width = IPU_CSI_DATA_WIDTH_16;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_SBGGR8_1X8:
|
||||
case V4L2_MBUS_FMT_SGBRG8_1X8:
|
||||
case V4L2_MBUS_FMT_SGRBG8_1X8:
|
||||
case V4L2_MBUS_FMT_SRGGB8_1X8:
|
||||
case MEDIA_BUS_FMT_SBGGR8_1X8:
|
||||
case MEDIA_BUS_FMT_SGBRG8_1X8:
|
||||
case MEDIA_BUS_FMT_SGRBG8_1X8:
|
||||
case MEDIA_BUS_FMT_SRGGB8_1X8:
|
||||
cfg->data_fmt = CSI_SENS_CONF_DATA_FMT_BAYER;
|
||||
cfg->mipi_dt = MIPI_DT_RAW8;
|
||||
cfg->data_width = IPU_CSI_DATA_WIDTH_8;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_SBGGR10_DPCM8_1X8:
|
||||
case V4L2_MBUS_FMT_SGBRG10_DPCM8_1X8:
|
||||
case V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8:
|
||||
case V4L2_MBUS_FMT_SRGGB10_DPCM8_1X8:
|
||||
case V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_BE:
|
||||
case V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE:
|
||||
case V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_BE:
|
||||
case V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_LE:
|
||||
case MEDIA_BUS_FMT_SBGGR10_DPCM8_1X8:
|
||||
case MEDIA_BUS_FMT_SGBRG10_DPCM8_1X8:
|
||||
case MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8:
|
||||
case MEDIA_BUS_FMT_SRGGB10_DPCM8_1X8:
|
||||
case MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_BE:
|
||||
case MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE:
|
||||
case MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_BE:
|
||||
case MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_LE:
|
||||
cfg->data_fmt = CSI_SENS_CONF_DATA_FMT_BAYER;
|
||||
cfg->mipi_dt = MIPI_DT_RAW10;
|
||||
cfg->data_width = IPU_CSI_DATA_WIDTH_8;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_SBGGR10_1X10:
|
||||
case V4L2_MBUS_FMT_SGBRG10_1X10:
|
||||
case V4L2_MBUS_FMT_SGRBG10_1X10:
|
||||
case V4L2_MBUS_FMT_SRGGB10_1X10:
|
||||
case MEDIA_BUS_FMT_SBGGR10_1X10:
|
||||
case MEDIA_BUS_FMT_SGBRG10_1X10:
|
||||
case MEDIA_BUS_FMT_SGRBG10_1X10:
|
||||
case MEDIA_BUS_FMT_SRGGB10_1X10:
|
||||
cfg->data_fmt = CSI_SENS_CONF_DATA_FMT_BAYER;
|
||||
cfg->mipi_dt = MIPI_DT_RAW10;
|
||||
cfg->data_width = IPU_CSI_DATA_WIDTH_10;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_SBGGR12_1X12:
|
||||
case V4L2_MBUS_FMT_SGBRG12_1X12:
|
||||
case V4L2_MBUS_FMT_SGRBG12_1X12:
|
||||
case V4L2_MBUS_FMT_SRGGB12_1X12:
|
||||
case MEDIA_BUS_FMT_SBGGR12_1X12:
|
||||
case MEDIA_BUS_FMT_SGBRG12_1X12:
|
||||
case MEDIA_BUS_FMT_SGRBG12_1X12:
|
||||
case MEDIA_BUS_FMT_SRGGB12_1X12:
|
||||
cfg->data_fmt = CSI_SENS_CONF_DATA_FMT_BAYER;
|
||||
cfg->mipi_dt = MIPI_DT_RAW12;
|
||||
cfg->data_width = IPU_CSI_DATA_WIDTH_12;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_JPEG_1X8:
|
||||
case MEDIA_BUS_FMT_JPEG_1X8:
|
||||
/* TODO */
|
||||
cfg->data_fmt = CSI_SENS_CONF_DATA_FMT_JPEG;
|
||||
cfg->mipi_dt = MIPI_DT_RAW8;
|
||||
|
|
|
@ -931,6 +931,35 @@ static void cx2341x_calc_audio_properties(struct cx2341x_mpeg_params *params)
|
|||
}
|
||||
}
|
||||
|
||||
/* Check for correctness of the ctrl's value based on the data from
|
||||
struct v4l2_queryctrl and the available menu items. Note that
|
||||
menu_items may be NULL, in that case it is ignored. */
|
||||
static int v4l2_ctrl_check(struct v4l2_ext_control *ctrl, struct v4l2_queryctrl *qctrl,
|
||||
const char * const *menu_items)
|
||||
{
|
||||
if (qctrl->flags & V4L2_CTRL_FLAG_DISABLED)
|
||||
return -EINVAL;
|
||||
if (qctrl->flags & V4L2_CTRL_FLAG_GRABBED)
|
||||
return -EBUSY;
|
||||
if (qctrl->type == V4L2_CTRL_TYPE_STRING)
|
||||
return 0;
|
||||
if (qctrl->type == V4L2_CTRL_TYPE_BUTTON ||
|
||||
qctrl->type == V4L2_CTRL_TYPE_INTEGER64 ||
|
||||
qctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS)
|
||||
return 0;
|
||||
if (ctrl->value < qctrl->minimum || ctrl->value > qctrl->maximum)
|
||||
return -ERANGE;
|
||||
if (qctrl->type == V4L2_CTRL_TYPE_MENU && menu_items != NULL) {
|
||||
if (menu_items[ctrl->value] == NULL ||
|
||||
menu_items[ctrl->value][0] == '\0')
|
||||
return -EINVAL;
|
||||
}
|
||||
if (qctrl->type == V4L2_CTRL_TYPE_BITMASK &&
|
||||
(ctrl->value & ~qctrl->maximum))
|
||||
return -ERANGE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cx2341x_ext_ctrls(struct cx2341x_mpeg_params *params, int busy,
|
||||
struct v4l2_ext_controls *ctrls, unsigned int cmd)
|
||||
{
|
||||
|
|
|
@ -71,7 +71,7 @@ static inline int saa7146_wait_for_debi_done_sleep(struct saa7146_dev *dev,
|
|||
if (saa7146_read(dev, MC2) & 2)
|
||||
break;
|
||||
if (err) {
|
||||
pr_err("%s: %s timed out while waiting for registers getting programmed\n",
|
||||
pr_debug("%s: %s timed out while waiting for registers getting programmed\n",
|
||||
dev->name, __func__);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
|
|
@ -107,8 +107,7 @@ int sms_ir_init(struct smscore_device_t *coredev)
|
|||
|
||||
void sms_ir_exit(struct smscore_device_t *coredev)
|
||||
{
|
||||
if (coredev->ir.dev)
|
||||
rc_unregister_device(coredev->ir.dev);
|
||||
rc_unregister_device(coredev->ir.dev);
|
||||
|
||||
sms_log("");
|
||||
}
|
||||
|
|
|
@ -286,9 +286,17 @@ static const struct {
|
|||
{ TUNER_ABSENT, "Xceive XC5200C"},
|
||||
{ TUNER_ABSENT, "NXP 18273"},
|
||||
{ TUNER_ABSENT, "Montage M88TS2022"},
|
||||
/* 180-189 */
|
||||
/* 180-188 */
|
||||
{ TUNER_ABSENT, "NXP 18272M"},
|
||||
{ TUNER_ABSENT, "NXP 18272S"},
|
||||
|
||||
{ TUNER_ABSENT, "Mirics MSi003"},
|
||||
{ TUNER_ABSENT, "MaxLinear MxL256"},
|
||||
{ TUNER_ABSENT, "SiLabs Si2158"},
|
||||
{ TUNER_ABSENT, "SiLabs Si2178"},
|
||||
{ TUNER_ABSENT, "SiLabs Si2157"},
|
||||
{ TUNER_ABSENT, "SiLabs Si2177"},
|
||||
{ TUNER_ABSENT, "ITE IT9137FN"},
|
||||
};
|
||||
|
||||
/* Use TVEEPROM_AUDPROC_INTERNAL for those audio 'chips' that are
|
||||
|
@ -351,6 +359,16 @@ static const struct {
|
|||
{ TVEEPROM_AUDPROC_INTERNAL, "CX23887" },
|
||||
{ TVEEPROM_AUDPROC_INTERNAL, "SAA7164" },
|
||||
{ TVEEPROM_AUDPROC_INTERNAL, "AU8522" },
|
||||
/* 45-49 */
|
||||
{ TVEEPROM_AUDPROC_INTERNAL, "AVF4910B" },
|
||||
{ TVEEPROM_AUDPROC_INTERNAL, "SAA7231" },
|
||||
{ TVEEPROM_AUDPROC_INTERNAL, "CX23102" },
|
||||
{ TVEEPROM_AUDPROC_INTERNAL, "SAA7163" },
|
||||
{ TVEEPROM_AUDPROC_OTHER, "AK4113" },
|
||||
/* 50-52 */
|
||||
{ TVEEPROM_AUDPROC_OTHER, "CS5340" },
|
||||
{ TVEEPROM_AUDPROC_OTHER, "CS8416" },
|
||||
{ TVEEPROM_AUDPROC_OTHER, "CX20810" },
|
||||
};
|
||||
|
||||
/* This list is supplied by Hauppauge. Thanks! */
|
||||
|
@ -371,8 +389,12 @@ static const char *decoderIC[] = {
|
|||
"CX25843", "CX23418", "NEC61153", "CX23885", "CX23888",
|
||||
/* 35-39 */
|
||||
"SAA7131", "CX25837", "CX23887", "CX23885A", "CX23887A",
|
||||
/* 40-42 */
|
||||
"SAA7164", "CX23885B", "AU8522"
|
||||
/* 40-44 */
|
||||
"SAA7164", "CX23885B", "AU8522", "ADV7401", "AVF4910B",
|
||||
/* 45-49 */
|
||||
"SAA7231", "CX23102", "SAA7163", "ADV7441A", "ADV7181C",
|
||||
/* 50-53 */
|
||||
"CX25836", "TDA9955", "TDA19977", "ADV7842"
|
||||
};
|
||||
|
||||
static int hasRadioTuner(int tunerType)
|
||||
|
@ -548,10 +570,10 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
|
|||
tvee->serial_number =
|
||||
eeprom_data[i+5] +
|
||||
(eeprom_data[i+6] << 8) +
|
||||
(eeprom_data[i+7] << 16);
|
||||
(eeprom_data[i+7] << 16)+
|
||||
(eeprom_data[i+8] << 24);
|
||||
|
||||
if ((eeprom_data[i + 8] & 0xf0) &&
|
||||
(tvee->serial_number < 0xffffff)) {
|
||||
if (eeprom_data[i + 8] == 0xf0) {
|
||||
tvee->MAC_address[0] = 0x00;
|
||||
tvee->MAC_address[1] = 0x0D;
|
||||
tvee->MAC_address[2] = 0xFE;
|
||||
|
@ -696,7 +718,7 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
|
|||
}
|
||||
}
|
||||
|
||||
tveeprom_info("Hauppauge model %d, rev %s, serial# %d\n",
|
||||
tveeprom_info("Hauppauge model %d, rev %s, serial# %u\n",
|
||||
tvee->model, tvee->rev_str, tvee->serial_number);
|
||||
if (tvee->has_MAC_address == 1)
|
||||
tveeprom_info("MAC address is %pM\n", tvee->MAC_address);
|
||||
|
|
|
@ -356,6 +356,7 @@
|
|||
#define USB_PID_MSI_DIGI_VOX_MINI_III 0x8807
|
||||
#define USB_PID_SONY_PLAYTV 0x0003
|
||||
#define USB_PID_MYGICA_D689 0xd811
|
||||
#define USB_PID_MYGICA_T230 0xc688
|
||||
#define USB_PID_ELGATO_EYETV_DIVERSITY 0x0011
|
||||
#define USB_PID_ELGATO_EYETV_DTT 0x0021
|
||||
#define USB_PID_ELGATO_EYETV_DTT_2 0x003f
|
||||
|
|
|
@ -379,7 +379,9 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len )
|
|||
/* Check TS error conditions: sync_byte, transport_error_indicator, scrambling_control . */
|
||||
if ((ts[0] != TS_SYNC) || (ts[1] & TS_TEI) || ((ts[3] & TS_SC) != 0)) {
|
||||
printk(KERN_WARNING "%lu: Invalid TS cell: SYNC %#x, TEI %u, SC %#x.\n",
|
||||
priv->ts_count, ts[0], ts[1] & TS_TEI >> 7, ts[3] & 0xC0 >> 6);
|
||||
priv->ts_count, ts[0],
|
||||
(ts[1] & TS_TEI) >> 7,
|
||||
(ts[3] & TS_SC) >> 6);
|
||||
|
||||
/* Drop partly decoded SNDU, reset state, resync on PUSI. */
|
||||
if (priv->ule_skb) {
|
||||
|
|
|
@ -648,12 +648,15 @@ config DVB_MB86A20S
|
|||
A driver for Fujitsu mb86a20s ISDB-T/ISDB-Tsb demodulator.
|
||||
Say Y when you want to support this frontend.
|
||||
|
||||
comment "ISDB-S (satellite) & ISDB-T (terrestrial) frontends"
|
||||
depends on DVB_CORE
|
||||
|
||||
config DVB_TC90522
|
||||
tristate "Toshiba TC90522"
|
||||
depends on DVB_CORE && I2C
|
||||
default m if !MEDIA_SUBDRV_AUTOSELECT
|
||||
help
|
||||
A Toshiba TC90522 2xISDB-T + 2xISDB-S demodulator.
|
||||
Toshiba TC90522 2xISDB-S 8PSK + 2xISDB-T OFDM demodulator.
|
||||
Say Y when you want to support this frontend.
|
||||
|
||||
comment "Digital terrestrial only tuners/PLL"
|
||||
|
|
|
@ -291,6 +291,12 @@ static int af9033_init(struct dvb_frontend *fe)
|
|||
if (clock_adc_lut[i].clock == dev->cfg.clock)
|
||||
break;
|
||||
}
|
||||
if (i == ARRAY_SIZE(clock_adc_lut)) {
|
||||
dev_err(&dev->client->dev,
|
||||
"Couldn't find ADC config for clock=%d\n",
|
||||
dev->cfg.clock);
|
||||
goto err;
|
||||
}
|
||||
|
||||
adc_cw = af9033_div(dev, clock_adc_lut[i].adc, 1000000ul, 19ul);
|
||||
buf[0] = (adc_cw >> 0) & 0xff;
|
||||
|
@ -580,7 +586,15 @@ static int af9033_set_frontend(struct dvb_frontend *fe)
|
|||
break;
|
||||
}
|
||||
}
|
||||
ret = af9033_wr_regs(dev, 0x800001,
|
||||
if (i == ARRAY_SIZE(coeff_lut)) {
|
||||
dev_err(&dev->client->dev,
|
||||
"Couldn't find LUT config for clock=%d\n",
|
||||
dev->cfg.clock);
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = af9033_wr_regs(dev, 0x800001,
|
||||
coeff_lut[i].val, sizeof(coeff_lut[i].val));
|
||||
}
|
||||
|
||||
|
@ -592,6 +606,13 @@ static int af9033_set_frontend(struct dvb_frontend *fe)
|
|||
if (clock_adc_lut[i].clock == dev->cfg.clock)
|
||||
break;
|
||||
}
|
||||
if (i == ARRAY_SIZE(clock_adc_lut)) {
|
||||
dev_err(&dev->client->dev,
|
||||
"Couldn't find ADC clock for clock=%d\n",
|
||||
dev->cfg.clock);
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
adc_freq = clock_adc_lut[i].adc;
|
||||
|
||||
/* get used IF frequency */
|
||||
|
@ -849,29 +870,97 @@ static int af9033_read_snr(struct dvb_frontend *fe, u16 *snr)
|
|||
{
|
||||
struct af9033_dev *dev = fe->demodulator_priv;
|
||||
struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
|
||||
int ret;
|
||||
u8 u8tmp;
|
||||
|
||||
/* use DVBv5 CNR */
|
||||
if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL)
|
||||
*snr = div_s64(c->cnr.stat[0].svalue, 100); /* 1000x => 10x */
|
||||
else
|
||||
if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL) {
|
||||
/* Return 0.1 dB for AF9030 and 0-0xffff for IT9130. */
|
||||
if (dev->is_af9035) {
|
||||
/* 1000x => 10x (0.1 dB) */
|
||||
*snr = div_s64(c->cnr.stat[0].svalue, 100);
|
||||
} else {
|
||||
/* 1000x => 1x (1 dB) */
|
||||
*snr = div_s64(c->cnr.stat[0].svalue, 1000);
|
||||
|
||||
/* read current modulation */
|
||||
ret = af9033_rd_reg(dev, 0x80f903, &u8tmp);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
/* scale value to 0x0000-0xffff */
|
||||
switch ((u8tmp >> 0) & 3) {
|
||||
case 0:
|
||||
*snr = *snr * 0xffff / 23;
|
||||
break;
|
||||
case 1:
|
||||
*snr = *snr * 0xffff / 26;
|
||||
break;
|
||||
case 2:
|
||||
*snr = *snr * 0xffff / 32;
|
||||
break;
|
||||
default:
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
*snr = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
dev_dbg(&dev->client->dev, "failed=%d\n", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
|
||||
{
|
||||
struct af9033_dev *dev = fe->demodulator_priv;
|
||||
int ret;
|
||||
u8 strength2;
|
||||
struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
|
||||
int ret, tmp, power_real;
|
||||
u8 u8tmp, gain_offset, buf[7];
|
||||
|
||||
/* read signal strength of 0-100 scale */
|
||||
ret = af9033_rd_reg(dev, 0x800048, &strength2);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
if (dev->is_af9035) {
|
||||
/* read signal strength of 0-100 scale */
|
||||
ret = af9033_rd_reg(dev, 0x800048, &u8tmp);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
/* scale value to 0x0000-0xffff */
|
||||
*strength = strength2 * 0xffff / 100;
|
||||
/* scale value to 0x0000-0xffff */
|
||||
*strength = u8tmp * 0xffff / 100;
|
||||
} else {
|
||||
ret = af9033_rd_reg(dev, 0x8000f7, &u8tmp);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
ret = af9033_rd_regs(dev, 0x80f900, buf, 7);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
if (c->frequency <= 300000000)
|
||||
gain_offset = 7; /* VHF */
|
||||
else
|
||||
gain_offset = 4; /* UHF */
|
||||
|
||||
power_real = (u8tmp - 100 - gain_offset) -
|
||||
power_reference[((buf[3] >> 0) & 3)][((buf[6] >> 0) & 7)];
|
||||
|
||||
if (power_real < -15)
|
||||
tmp = 0;
|
||||
else if ((power_real >= -15) && (power_real < 0))
|
||||
tmp = (2 * (power_real + 15)) / 3;
|
||||
else if ((power_real >= 0) && (power_real < 20))
|
||||
tmp = 4 * power_real + 10;
|
||||
else if ((power_real >= 20) && (power_real < 35))
|
||||
tmp = (2 * (power_real - 20)) / 3 + 90;
|
||||
else
|
||||
tmp = 100;
|
||||
|
||||
/* scale value to 0x0000-0xffff */
|
||||
*strength = tmp * 0xffff / 100;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -1011,6 +1100,33 @@ static void af9033_stat_work(struct work_struct *work)
|
|||
|
||||
snr_val = (buf[2] << 16) | (buf[1] << 8) | (buf[0] << 0);
|
||||
|
||||
/* read superframe number */
|
||||
ret = af9033_rd_reg(dev, 0x80f78b, &u8tmp);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
if (u8tmp)
|
||||
snr_val /= u8tmp;
|
||||
|
||||
/* read current transmission mode */
|
||||
ret = af9033_rd_reg(dev, 0x80f900, &u8tmp);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
switch ((u8tmp >> 0) & 3) {
|
||||
case 0:
|
||||
snr_val *= 4;
|
||||
break;
|
||||
case 1:
|
||||
snr_val *= 1;
|
||||
break;
|
||||
case 2:
|
||||
snr_val *= 2;
|
||||
break;
|
||||
default:
|
||||
goto err_schedule_delayed_work;
|
||||
}
|
||||
|
||||
/* read current modulation */
|
||||
ret = af9033_rd_reg(dev, 0x80f903, &u8tmp);
|
||||
if (ret)
|
||||
|
|
|
@ -181,7 +181,10 @@ static const struct val_snr qam64_snr_lut[] = {
|
|||
{ 0x05570d, 26 },
|
||||
{ 0x059feb, 27 },
|
||||
{ 0x05bf38, 28 },
|
||||
{ 0xffffff, 29 },
|
||||
{ 0x05f78f, 29 },
|
||||
{ 0x0612c3, 30 },
|
||||
{ 0x0626be, 31 },
|
||||
{ 0xffffff, 32 },
|
||||
};
|
||||
|
||||
static const struct reg_val ofsm_init[] = {
|
||||
|
@ -2051,4 +2054,10 @@ static const struct reg_val tuner_init_it9135_62[] = {
|
|||
{ 0x80fd8b, 0x00 },
|
||||
};
|
||||
|
||||
/* NorDig power reference table */
|
||||
static const int power_reference[][5] = {
|
||||
{-93, -91, -90, -89, -88}, /* QPSK 1/2 ~ 7/8 */
|
||||
{-87, -85, -84, -83, -82}, /* 16QAM 1/2 ~ 7/8 */
|
||||
{-82, -80, -78, -77, -76}, /* 64QAM 1/2 ~ 7/8 */
|
||||
};
|
||||
#endif /* AF9033_PRIV_H */
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include "au8522_priv.h"
|
||||
|
||||
static int debug;
|
||||
static int zv_mode = 1; /* default to on */
|
||||
|
||||
#define dprintk(arg...)\
|
||||
do { if (debug)\
|
||||
|
@ -469,6 +470,87 @@ static struct {
|
|||
{ 0x8526, 0x01 },
|
||||
};
|
||||
|
||||
static struct {
|
||||
u16 reg;
|
||||
u16 data;
|
||||
} QAM256_mod_tab_zv_mode[] = {
|
||||
{ 0x80a3, 0x09 },
|
||||
{ 0x80a4, 0x00 },
|
||||
{ 0x8081, 0xc4 },
|
||||
{ 0x80a5, 0x40 },
|
||||
{ 0x80b5, 0xfb },
|
||||
{ 0x80b6, 0x8e },
|
||||
{ 0x80b7, 0x39 },
|
||||
{ 0x80aa, 0x77 },
|
||||
{ 0x80ad, 0x77 },
|
||||
{ 0x80a6, 0x67 },
|
||||
{ 0x8262, 0x20 },
|
||||
{ 0x821c, 0x30 },
|
||||
{ 0x80b8, 0x3e },
|
||||
{ 0x80b9, 0xf0 },
|
||||
{ 0x80ba, 0x01 },
|
||||
{ 0x80bb, 0x18 },
|
||||
{ 0x80bc, 0x50 },
|
||||
{ 0x80bd, 0x00 },
|
||||
{ 0x80be, 0xea },
|
||||
{ 0x80bf, 0xef },
|
||||
{ 0x80c0, 0xfc },
|
||||
{ 0x80c1, 0xbd },
|
||||
{ 0x80c2, 0x1f },
|
||||
{ 0x80c3, 0xfc },
|
||||
{ 0x80c4, 0xdd },
|
||||
{ 0x80c5, 0xaf },
|
||||
{ 0x80c6, 0x00 },
|
||||
{ 0x80c7, 0x38 },
|
||||
{ 0x80c8, 0x30 },
|
||||
{ 0x80c9, 0x05 },
|
||||
{ 0x80ca, 0x4a },
|
||||
{ 0x80cb, 0xd0 },
|
||||
{ 0x80cc, 0x01 },
|
||||
{ 0x80cd, 0xd9 },
|
||||
{ 0x80ce, 0x6f },
|
||||
{ 0x80cf, 0xf9 },
|
||||
{ 0x80d0, 0x70 },
|
||||
{ 0x80d1, 0xdf },
|
||||
{ 0x80d2, 0xf7 },
|
||||
{ 0x80d3, 0xc2 },
|
||||
{ 0x80d4, 0xdf },
|
||||
{ 0x80d5, 0x02 },
|
||||
{ 0x80d6, 0x9a },
|
||||
{ 0x80d7, 0xd0 },
|
||||
{ 0x8250, 0x0d },
|
||||
{ 0x8251, 0xcd },
|
||||
{ 0x8252, 0xe0 },
|
||||
{ 0x8253, 0x05 },
|
||||
{ 0x8254, 0xa7 },
|
||||
{ 0x8255, 0xff },
|
||||
{ 0x8256, 0xed },
|
||||
{ 0x8257, 0x5b },
|
||||
{ 0x8258, 0xae },
|
||||
{ 0x8259, 0xe6 },
|
||||
{ 0x825a, 0x3d },
|
||||
{ 0x825b, 0x0f },
|
||||
{ 0x825c, 0x0d },
|
||||
{ 0x825d, 0xea },
|
||||
{ 0x825e, 0xf2 },
|
||||
{ 0x825f, 0x51 },
|
||||
{ 0x8260, 0xf5 },
|
||||
{ 0x8261, 0x06 },
|
||||
{ 0x821a, 0x01 },
|
||||
{ 0x8546, 0x40 },
|
||||
{ 0x8210, 0x26 },
|
||||
{ 0x8211, 0xf6 },
|
||||
{ 0x8212, 0x84 },
|
||||
{ 0x8213, 0x02 },
|
||||
{ 0x8502, 0x01 },
|
||||
{ 0x8121, 0x04 },
|
||||
{ 0x8122, 0x04 },
|
||||
{ 0x852e, 0x10 },
|
||||
{ 0x80a4, 0xca },
|
||||
{ 0x80a7, 0x40 },
|
||||
{ 0x8526, 0x01 },
|
||||
};
|
||||
|
||||
static int au8522_enable_modulation(struct dvb_frontend *fe,
|
||||
fe_modulation_t m)
|
||||
{
|
||||
|
@ -495,12 +577,23 @@ static int au8522_enable_modulation(struct dvb_frontend *fe,
|
|||
au8522_set_if(fe, state->config->qam_if);
|
||||
break;
|
||||
case QAM_256:
|
||||
dprintk("%s() QAM 256\n", __func__);
|
||||
for (i = 0; i < ARRAY_SIZE(QAM256_mod_tab); i++)
|
||||
au8522_writereg(state,
|
||||
QAM256_mod_tab[i].reg,
|
||||
QAM256_mod_tab[i].data);
|
||||
au8522_set_if(fe, state->config->qam_if);
|
||||
if (zv_mode) {
|
||||
dprintk("%s() QAM 256 (zv_mode)\n", __func__);
|
||||
for (i = 0; i < ARRAY_SIZE(QAM256_mod_tab_zv_mode); i++)
|
||||
au8522_writereg(state,
|
||||
QAM256_mod_tab_zv_mode[i].reg,
|
||||
QAM256_mod_tab_zv_mode[i].data);
|
||||
au8522_set_if(fe, state->config->qam_if);
|
||||
msleep(100);
|
||||
au8522_writereg(state, 0x821a, 0x00);
|
||||
} else {
|
||||
dprintk("%s() QAM 256\n", __func__);
|
||||
for (i = 0; i < ARRAY_SIZE(QAM256_mod_tab); i++)
|
||||
au8522_writereg(state,
|
||||
QAM256_mod_tab[i].reg,
|
||||
QAM256_mod_tab[i].data);
|
||||
au8522_set_if(fe, state->config->qam_if);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
dprintk("%s() Invalid modulation\n", __func__);
|
||||
|
@ -537,7 +630,12 @@ static int au8522_set_frontend(struct dvb_frontend *fe)
|
|||
return ret;
|
||||
|
||||
/* Allow the tuner to settle */
|
||||
msleep(100);
|
||||
if (zv_mode) {
|
||||
dprintk("%s() increase tuner settling time for zv_mode\n",
|
||||
__func__);
|
||||
msleep(250);
|
||||
} else
|
||||
msleep(100);
|
||||
|
||||
au8522_enable_modulation(fe, c->modulation);
|
||||
|
||||
|
@ -823,6 +921,11 @@ static struct dvb_frontend_ops au8522_ops = {
|
|||
module_param(debug, int, 0644);
|
||||
MODULE_PARM_DESC(debug, "Enable verbose debug messages");
|
||||
|
||||
module_param(zv_mode, int, 0644);
|
||||
MODULE_PARM_DESC(zv_mode, "Turn on/off ZeeVee modulator compatability mode (default:on).\n"
|
||||
"\t\ton - modified AU8522 QAM256 initialization.\n"
|
||||
"\t\tProvides faster lock when using ZeeVee modulator based sources");
|
||||
|
||||
MODULE_DESCRIPTION("Auvitek AU8522 QAM-B/ATSC Demodulator driver");
|
||||
MODULE_AUTHOR("Steven Toth");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -169,6 +169,9 @@ static int cx22700_set_tps(struct cx22700_state *state,
|
|||
|
||||
cx22700_writereg (state, 0x04, val);
|
||||
|
||||
if (p->code_rate_HP - FEC_1_2 >= sizeof(fec_tab) ||
|
||||
p->code_rate_LP - FEC_1_2 >= sizeof(fec_tab))
|
||||
return -EINVAL;
|
||||
val = fec_tab[p->code_rate_HP - FEC_1_2] << 3;
|
||||
val |= fec_tab[p->code_rate_LP - FEC_1_2];
|
||||
|
||||
|
|
|
@ -177,47 +177,45 @@ static int cx24110_set_inversion (struct cx24110_state* state, fe_spectral_inver
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cx24110_set_fec (struct cx24110_state* state, fe_code_rate_t fec)
|
||||
static int cx24110_set_fec(struct cx24110_state* state, fe_code_rate_t fec)
|
||||
{
|
||||
/* fixme (low): error handling */
|
||||
|
||||
static const int rate[]={-1,1,2,3,5,7,-1};
|
||||
static const int g1[]={-1,0x01,0x02,0x05,0x15,0x45,-1};
|
||||
static const int g2[]={-1,0x01,0x03,0x06,0x1a,0x7a,-1};
|
||||
static const int rate[FEC_AUTO] = {-1, 1, 2, 3, 5, 7, -1};
|
||||
static const int g1[FEC_AUTO] = {-1, 0x01, 0x02, 0x05, 0x15, 0x45, -1};
|
||||
static const int g2[FEC_AUTO] = {-1, 0x01, 0x03, 0x06, 0x1a, 0x7a, -1};
|
||||
|
||||
/* Well, the AutoAcq engine of the cx24106 and 24110 automatically
|
||||
searches all enabled viterbi rates, and can handle non-standard
|
||||
rates as well. */
|
||||
|
||||
if (fec>FEC_AUTO)
|
||||
fec=FEC_AUTO;
|
||||
if (fec > FEC_AUTO)
|
||||
fec = FEC_AUTO;
|
||||
|
||||
if (fec==FEC_AUTO) { /* (re-)establish AutoAcq behaviour */
|
||||
cx24110_writereg(state,0x37,cx24110_readreg(state,0x37)&0xdf);
|
||||
if (fec == FEC_AUTO) { /* (re-)establish AutoAcq behaviour */
|
||||
cx24110_writereg(state, 0x37, cx24110_readreg(state, 0x37) & 0xdf);
|
||||
/* clear AcqVitDis bit */
|
||||
cx24110_writereg(state,0x18,0xae);
|
||||
cx24110_writereg(state, 0x18, 0xae);
|
||||
/* allow all DVB standard code rates */
|
||||
cx24110_writereg(state,0x05,(cx24110_readreg(state,0x05)&0xf0)|0x3);
|
||||
cx24110_writereg(state, 0x05, (cx24110_readreg(state, 0x05) & 0xf0) | 0x3);
|
||||
/* set nominal Viterbi rate 3/4 */
|
||||
cx24110_writereg(state,0x22,(cx24110_readreg(state,0x22)&0xf0)|0x3);
|
||||
cx24110_writereg(state, 0x22, (cx24110_readreg(state, 0x22) & 0xf0) | 0x3);
|
||||
/* set current Viterbi rate 3/4 */
|
||||
cx24110_writereg(state,0x1a,0x05); cx24110_writereg(state,0x1b,0x06);
|
||||
cx24110_writereg(state, 0x1a, 0x05);
|
||||
cx24110_writereg(state, 0x1b, 0x06);
|
||||
/* set the puncture registers for code rate 3/4 */
|
||||
return 0;
|
||||
} else {
|
||||
cx24110_writereg(state,0x37,cx24110_readreg(state,0x37)|0x20);
|
||||
cx24110_writereg(state, 0x37, cx24110_readreg(state, 0x37) | 0x20);
|
||||
/* set AcqVitDis bit */
|
||||
if(rate[fec]>0) {
|
||||
cx24110_writereg(state,0x05,(cx24110_readreg(state,0x05)&0xf0)|rate[fec]);
|
||||
/* set nominal Viterbi rate */
|
||||
cx24110_writereg(state,0x22,(cx24110_readreg(state,0x22)&0xf0)|rate[fec]);
|
||||
/* set current Viterbi rate */
|
||||
cx24110_writereg(state,0x1a,g1[fec]);
|
||||
cx24110_writereg(state,0x1b,g2[fec]);
|
||||
/* not sure if this is the right way: I always used AutoAcq mode */
|
||||
} else
|
||||
return -EOPNOTSUPP;
|
||||
/* fixme (low): which is the correct return code? */
|
||||
if (rate[fec] < 0)
|
||||
return -EINVAL;
|
||||
|
||||
cx24110_writereg(state, 0x05, (cx24110_readreg(state, 0x05) & 0xf0) | rate[fec]);
|
||||
/* set nominal Viterbi rate */
|
||||
cx24110_writereg(state, 0x22, (cx24110_readreg(state, 0x22) & 0xf0) | rate[fec]);
|
||||
/* set current Viterbi rate */
|
||||
cx24110_writereg(state, 0x1a, g1[fec]);
|
||||
cx24110_writereg(state, 0x1b, g2[fec]);
|
||||
/* not sure if this is the right way: I always used AutoAcq mode */
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -459,7 +459,7 @@ static int cx24117_firmware_ondemand(struct dvb_frontend *fe)
|
|||
if (state->priv->skip_fw_load)
|
||||
return 0;
|
||||
|
||||
/* check if firmware if already running */
|
||||
/* check if firmware is already running */
|
||||
if (cx24117_readreg(state, 0xeb) != 0xa) {
|
||||
/* Load firmware */
|
||||
/* request the firmware, this will block until loaded */
|
||||
|
|
|
@ -1780,7 +1780,7 @@ static u32 interpolate_value(u32 value, struct linear_segments *segments,
|
|||
}
|
||||
|
||||
/* FIXME: may require changes - this one was borrowed from dib8000 */
|
||||
static u32 dib7000p_get_time_us(struct dvb_frontend *demod, int layer)
|
||||
static u32 dib7000p_get_time_us(struct dvb_frontend *demod)
|
||||
{
|
||||
struct dtv_frontend_properties *c = &demod->dtv_property_cache;
|
||||
u64 time_us, tmp64;
|
||||
|
@ -1881,7 +1881,6 @@ static int dib7000p_get_stats(struct dvb_frontend *demod, fe_status_t stat)
|
|||
{
|
||||
struct dib7000p_state *state = demod->demodulator_priv;
|
||||
struct dtv_frontend_properties *c = &demod->dtv_property_cache;
|
||||
int i;
|
||||
int show_per_stats = 0;
|
||||
u32 time_us = 0, val, snr;
|
||||
u64 blocks, ucb;
|
||||
|
@ -1935,7 +1934,7 @@ static int dib7000p_get_stats(struct dvb_frontend *demod, fe_status_t stat)
|
|||
|
||||
/* Estimate the number of packets based on bitrate */
|
||||
if (!time_us)
|
||||
time_us = dib7000p_get_time_us(demod, -1);
|
||||
time_us = dib7000p_get_time_us(demod);
|
||||
|
||||
if (time_us) {
|
||||
blocks = 1250000ULL * 1000000ULL;
|
||||
|
@ -1949,7 +1948,7 @@ static int dib7000p_get_stats(struct dvb_frontend *demod, fe_status_t stat)
|
|||
|
||||
/* Get post-BER measures */
|
||||
if (time_after(jiffies, state->ber_jiffies_stats)) {
|
||||
time_us = dib7000p_get_time_us(demod, -1);
|
||||
time_us = dib7000p_get_time_us(demod);
|
||||
state->ber_jiffies_stats = jiffies + msecs_to_jiffies((time_us + 500) / 1000);
|
||||
|
||||
dprintk("Next all layers stats available in %u us.", time_us);
|
||||
|
@ -1969,7 +1968,7 @@ static int dib7000p_get_stats(struct dvb_frontend *demod, fe_status_t stat)
|
|||
c->block_error.stat[0].scale = FE_SCALE_COUNTER;
|
||||
c->block_error.stat[0].uvalue += val;
|
||||
|
||||
time_us = dib7000p_get_time_us(demod, i);
|
||||
time_us = dib7000p_get_time_us(demod);
|
||||
if (time_us) {
|
||||
blocks = 1250000ULL * 1000000ULL;
|
||||
do_div(blocks, time_us * 8 * 204);
|
||||
|
|
|
@ -12255,8 +12255,7 @@ static void drx39xxj_release(struct dvb_frontend *fe)
|
|||
kfree(demod->my_ext_attr);
|
||||
kfree(demod->my_common_attr);
|
||||
kfree(demod->my_i2c_dev_addr);
|
||||
if (demod->firmware)
|
||||
release_firmware(demod->firmware);
|
||||
release_firmware(demod->firmware);
|
||||
kfree(demod);
|
||||
kfree(state);
|
||||
}
|
||||
|
|
|
@ -166,9 +166,9 @@ static unsigned int debug;
|
|||
module_param(debug, int, 0644);
|
||||
MODULE_PARM_DESC(debug, "enable debug messages");
|
||||
|
||||
#define dprintk(level, fmt, arg...) do { \
|
||||
if (debug >= level) \
|
||||
pr_debug(fmt, ##arg); \
|
||||
#define dprintk(level, fmt, arg...) do { \
|
||||
if (debug >= level) \
|
||||
printk(KERN_DEBUG KBUILD_MODNAME ": %s " fmt, __func__, ##arg); \
|
||||
} while (0)
|
||||
|
||||
|
||||
|
@ -6310,8 +6310,7 @@ static void drxk_release(struct dvb_frontend *fe)
|
|||
struct drxk_state *state = fe->demodulator_priv;
|
||||
|
||||
dprintk(1, "\n");
|
||||
if (state->fw)
|
||||
release_firmware(state->fw);
|
||||
release_firmware(state->fw);
|
||||
|
||||
kfree(state);
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Montage M88DS3103 demodulator driver
|
||||
* Montage M88DS3103/M88RS6000 demodulator driver
|
||||
*
|
||||
* Copyright (C) 2013 Antti Palosaari <crope@iki.fi>
|
||||
*
|
||||
|
@ -162,7 +162,7 @@ static int m88ds3103_wr_reg_val_tab(struct m88ds3103_priv *priv,
|
|||
|
||||
dev_dbg(&priv->i2c->dev, "%s: tab_len=%d\n", __func__, tab_len);
|
||||
|
||||
if (tab_len > 83) {
|
||||
if (tab_len > 86) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
@ -245,9 +245,9 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
|||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
int ret, len;
|
||||
const struct m88ds3103_reg_val *init;
|
||||
u8 u8tmp, u8tmp1, u8tmp2;
|
||||
u8 buf[2];
|
||||
u16 u16tmp, divide_ratio;
|
||||
u8 u8tmp, u8tmp1 = 0, u8tmp2 = 0; /* silence compiler warning */
|
||||
u8 buf[3];
|
||||
u16 u16tmp, divide_ratio = 0;
|
||||
u32 tuner_frequency, target_mclk;
|
||||
s32 s32tmp;
|
||||
|
||||
|
@ -262,6 +262,22 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
|||
goto err;
|
||||
}
|
||||
|
||||
/* reset */
|
||||
ret = m88ds3103_wr_reg(priv, 0x07, 0x80);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = m88ds3103_wr_reg(priv, 0x07, 0x00);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
/* Disable demod clock path */
|
||||
if (priv->chip_id == M88RS6000_CHIP_ID) {
|
||||
ret = m88ds3103_wr_reg(priv, 0x06, 0xe0);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* program tuner */
|
||||
if (fe->ops.tuner_ops.set_params) {
|
||||
ret = fe->ops.tuner_ops.set_params(fe);
|
||||
|
@ -282,14 +298,73 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
|||
tuner_frequency = c->frequency;
|
||||
}
|
||||
|
||||
/* reset */
|
||||
ret = m88ds3103_wr_reg(priv, 0x07, 0x80);
|
||||
if (ret)
|
||||
goto err;
|
||||
/* select M88RS6000 demod main mclk and ts mclk from tuner die. */
|
||||
if (priv->chip_id == M88RS6000_CHIP_ID) {
|
||||
if (c->symbol_rate > 45010000)
|
||||
priv->mclk_khz = 110250;
|
||||
else
|
||||
priv->mclk_khz = 96000;
|
||||
|
||||
ret = m88ds3103_wr_reg(priv, 0x07, 0x00);
|
||||
if (ret)
|
||||
goto err;
|
||||
if (c->delivery_system == SYS_DVBS)
|
||||
target_mclk = 96000;
|
||||
else
|
||||
target_mclk = 144000;
|
||||
|
||||
/* Enable demod clock path */
|
||||
ret = m88ds3103_wr_reg(priv, 0x06, 0x00);
|
||||
if (ret)
|
||||
goto err;
|
||||
usleep_range(10000, 20000);
|
||||
} else {
|
||||
/* set M88DS3103 mclk and ts mclk. */
|
||||
priv->mclk_khz = 96000;
|
||||
|
||||
switch (priv->cfg->ts_mode) {
|
||||
case M88DS3103_TS_SERIAL:
|
||||
case M88DS3103_TS_SERIAL_D7:
|
||||
target_mclk = priv->cfg->ts_clk;
|
||||
break;
|
||||
case M88DS3103_TS_PARALLEL:
|
||||
case M88DS3103_TS_CI:
|
||||
if (c->delivery_system == SYS_DVBS)
|
||||
target_mclk = 96000;
|
||||
else {
|
||||
if (c->symbol_rate < 18000000)
|
||||
target_mclk = 96000;
|
||||
else if (c->symbol_rate < 28000000)
|
||||
target_mclk = 144000;
|
||||
else
|
||||
target_mclk = 192000;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
dev_dbg(&priv->i2c->dev, "%s: invalid ts_mode\n",
|
||||
__func__);
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
switch (target_mclk) {
|
||||
case 96000:
|
||||
u8tmp1 = 0x02; /* 0b10 */
|
||||
u8tmp2 = 0x01; /* 0b01 */
|
||||
break;
|
||||
case 144000:
|
||||
u8tmp1 = 0x00; /* 0b00 */
|
||||
u8tmp2 = 0x01; /* 0b01 */
|
||||
break;
|
||||
case 192000:
|
||||
u8tmp1 = 0x03; /* 0b11 */
|
||||
u8tmp2 = 0x00; /* 0b00 */
|
||||
break;
|
||||
}
|
||||
ret = m88ds3103_wr_reg_mask(priv, 0x22, u8tmp1 << 6, 0xc0);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = m88ds3103_wr_reg_mask(priv, 0x24, u8tmp2 << 6, 0xc0);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = m88ds3103_wr_reg(priv, 0xb2, 0x01);
|
||||
if (ret)
|
||||
|
@ -301,36 +376,21 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
|||
|
||||
switch (c->delivery_system) {
|
||||
case SYS_DVBS:
|
||||
len = ARRAY_SIZE(m88ds3103_dvbs_init_reg_vals);
|
||||
init = m88ds3103_dvbs_init_reg_vals;
|
||||
target_mclk = 96000;
|
||||
if (priv->chip_id == M88RS6000_CHIP_ID) {
|
||||
len = ARRAY_SIZE(m88rs6000_dvbs_init_reg_vals);
|
||||
init = m88rs6000_dvbs_init_reg_vals;
|
||||
} else {
|
||||
len = ARRAY_SIZE(m88ds3103_dvbs_init_reg_vals);
|
||||
init = m88ds3103_dvbs_init_reg_vals;
|
||||
}
|
||||
break;
|
||||
case SYS_DVBS2:
|
||||
len = ARRAY_SIZE(m88ds3103_dvbs2_init_reg_vals);
|
||||
init = m88ds3103_dvbs2_init_reg_vals;
|
||||
|
||||
switch (priv->cfg->ts_mode) {
|
||||
case M88DS3103_TS_SERIAL:
|
||||
case M88DS3103_TS_SERIAL_D7:
|
||||
if (c->symbol_rate < 18000000)
|
||||
target_mclk = 96000;
|
||||
else
|
||||
target_mclk = 144000;
|
||||
break;
|
||||
case M88DS3103_TS_PARALLEL:
|
||||
case M88DS3103_TS_CI:
|
||||
if (c->symbol_rate < 18000000)
|
||||
target_mclk = 96000;
|
||||
else if (c->symbol_rate < 28000000)
|
||||
target_mclk = 144000;
|
||||
else
|
||||
target_mclk = 192000;
|
||||
break;
|
||||
default:
|
||||
dev_dbg(&priv->i2c->dev, "%s: invalid ts_mode\n",
|
||||
__func__);
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
if (priv->chip_id == M88RS6000_CHIP_ID) {
|
||||
len = ARRAY_SIZE(m88rs6000_dvbs2_init_reg_vals);
|
||||
init = m88rs6000_dvbs2_init_reg_vals;
|
||||
} else {
|
||||
len = ARRAY_SIZE(m88ds3103_dvbs2_init_reg_vals);
|
||||
init = m88ds3103_dvbs2_init_reg_vals;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -347,7 +407,30 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
|||
goto err;
|
||||
}
|
||||
|
||||
u8tmp1 = 0; /* silence compiler warning */
|
||||
if (priv->chip_id == M88RS6000_CHIP_ID) {
|
||||
if ((c->delivery_system == SYS_DVBS2)
|
||||
&& ((c->symbol_rate / 1000) <= 5000)) {
|
||||
ret = m88ds3103_wr_reg(priv, 0xc0, 0x04);
|
||||
if (ret)
|
||||
goto err;
|
||||
buf[0] = 0x09;
|
||||
buf[1] = 0x22;
|
||||
buf[2] = 0x88;
|
||||
ret = m88ds3103_wr_regs(priv, 0x8a, buf, 3);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
ret = m88ds3103_wr_reg_mask(priv, 0x9d, 0x08, 0x08);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = m88ds3103_wr_reg(priv, 0xf1, 0x01);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = m88ds3103_wr_reg_mask(priv, 0x30, 0x80, 0x80);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
|
||||
switch (priv->cfg->ts_mode) {
|
||||
case M88DS3103_TS_SERIAL:
|
||||
u8tmp1 = 0x00;
|
||||
|
@ -383,16 +466,15 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
|||
ret = m88ds3103_wr_reg_mask(priv, 0x29, u8tmp1, 0x20);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (priv->cfg->ts_clk) {
|
||||
divide_ratio = DIV_ROUND_UP(target_mclk, priv->cfg->ts_clk);
|
||||
u8tmp1 = divide_ratio / 2;
|
||||
u8tmp2 = DIV_ROUND_UP(divide_ratio, 2);
|
||||
} else {
|
||||
divide_ratio = 0;
|
||||
u8tmp1 = 0;
|
||||
u8tmp2 = 0;
|
||||
break;
|
||||
default:
|
||||
if (priv->cfg->ts_clk) {
|
||||
divide_ratio = DIV_ROUND_UP(target_mclk, priv->cfg->ts_clk);
|
||||
u8tmp1 = divide_ratio / 2;
|
||||
u8tmp2 = DIV_ROUND_UP(divide_ratio, 2);
|
||||
}
|
||||
}
|
||||
|
||||
dev_dbg(&priv->i2c->dev,
|
||||
|
@ -420,29 +502,6 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
|||
if (ret)
|
||||
goto err;
|
||||
|
||||
switch (target_mclk) {
|
||||
case 96000:
|
||||
u8tmp1 = 0x02; /* 0b10 */
|
||||
u8tmp2 = 0x01; /* 0b01 */
|
||||
break;
|
||||
case 144000:
|
||||
u8tmp1 = 0x00; /* 0b00 */
|
||||
u8tmp2 = 0x01; /* 0b01 */
|
||||
break;
|
||||
case 192000:
|
||||
u8tmp1 = 0x03; /* 0b11 */
|
||||
u8tmp2 = 0x00; /* 0b00 */
|
||||
break;
|
||||
}
|
||||
|
||||
ret = m88ds3103_wr_reg_mask(priv, 0x22, u8tmp1 << 6, 0xc0);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = m88ds3103_wr_reg_mask(priv, 0x24, u8tmp2 << 6, 0xc0);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
if (c->symbol_rate <= 3000000)
|
||||
u8tmp = 0x20;
|
||||
else if (c->symbol_rate <= 10000000)
|
||||
|
@ -466,7 +525,7 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
|||
if (ret)
|
||||
goto err;
|
||||
|
||||
u16tmp = DIV_ROUND_CLOSEST((c->symbol_rate / 1000) << 15, M88DS3103_MCLK_KHZ / 2);
|
||||
u16tmp = DIV_ROUND_CLOSEST((c->symbol_rate / 1000) << 15, priv->mclk_khz / 2);
|
||||
buf[0] = (u16tmp >> 0) & 0xff;
|
||||
buf[1] = (u16tmp >> 8) & 0xff;
|
||||
ret = m88ds3103_wr_regs(priv, 0x61, buf, 2);
|
||||
|
@ -489,7 +548,7 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
|||
(tuner_frequency - c->frequency));
|
||||
|
||||
s32tmp = 0x10000 * (tuner_frequency - c->frequency);
|
||||
s32tmp = DIV_ROUND_CLOSEST(s32tmp, M88DS3103_MCLK_KHZ);
|
||||
s32tmp = DIV_ROUND_CLOSEST(s32tmp, priv->mclk_khz);
|
||||
if (s32tmp < 0)
|
||||
s32tmp += 0x10000;
|
||||
|
||||
|
@ -520,7 +579,7 @@ static int m88ds3103_init(struct dvb_frontend *fe)
|
|||
struct m88ds3103_priv *priv = fe->demodulator_priv;
|
||||
int ret, len, remaining;
|
||||
const struct firmware *fw = NULL;
|
||||
u8 *fw_file = M88DS3103_FIRMWARE;
|
||||
u8 *fw_file;
|
||||
u8 u8tmp;
|
||||
|
||||
dev_dbg(&priv->i2c->dev, "%s:\n", __func__);
|
||||
|
@ -541,15 +600,6 @@ static int m88ds3103_init(struct dvb_frontend *fe)
|
|||
if (ret)
|
||||
goto err;
|
||||
|
||||
/* reset */
|
||||
ret = m88ds3103_wr_reg(priv, 0x07, 0x60);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = m88ds3103_wr_reg(priv, 0x07, 0x00);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
/* firmware status */
|
||||
ret = m88ds3103_rd_reg(priv, 0xb9, &u8tmp);
|
||||
if (ret)
|
||||
|
@ -560,10 +610,23 @@ static int m88ds3103_init(struct dvb_frontend *fe)
|
|||
if (u8tmp)
|
||||
goto skip_fw_download;
|
||||
|
||||
/* global reset, global diseqc reset, golbal fec reset */
|
||||
ret = m88ds3103_wr_reg(priv, 0x07, 0xe0);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = m88ds3103_wr_reg(priv, 0x07, 0x00);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
/* cold state - try to download firmware */
|
||||
dev_info(&priv->i2c->dev, "%s: found a '%s' in cold state\n",
|
||||
KBUILD_MODNAME, m88ds3103_ops.info.name);
|
||||
|
||||
if (priv->chip_id == M88RS6000_CHIP_ID)
|
||||
fw_file = M88RS6000_FIRMWARE;
|
||||
else
|
||||
fw_file = M88DS3103_FIRMWARE;
|
||||
/* request the firmware, this will block and timeout */
|
||||
ret = request_firmware(&fw, fw_file, priv->i2c->dev.parent);
|
||||
if (ret) {
|
||||
|
@ -577,7 +640,7 @@ static int m88ds3103_init(struct dvb_frontend *fe)
|
|||
|
||||
ret = m88ds3103_wr_reg(priv, 0xb2, 0x01);
|
||||
if (ret)
|
||||
goto err;
|
||||
goto error_fw_release;
|
||||
|
||||
for (remaining = fw->size; remaining > 0;
|
||||
remaining -= (priv->cfg->i2c_wr_max - 1)) {
|
||||
|
@ -591,13 +654,13 @@ static int m88ds3103_init(struct dvb_frontend *fe)
|
|||
dev_err(&priv->i2c->dev,
|
||||
"%s: firmware download failed=%d\n",
|
||||
KBUILD_MODNAME, ret);
|
||||
goto err;
|
||||
goto error_fw_release;
|
||||
}
|
||||
}
|
||||
|
||||
ret = m88ds3103_wr_reg(priv, 0xb2, 0x00);
|
||||
if (ret)
|
||||
goto err;
|
||||
goto error_fw_release;
|
||||
|
||||
release_firmware(fw);
|
||||
fw = NULL;
|
||||
|
@ -623,10 +686,10 @@ static int m88ds3103_init(struct dvb_frontend *fe)
|
|||
priv->warm = true;
|
||||
|
||||
return 0;
|
||||
err:
|
||||
if (fw)
|
||||
release_firmware(fw);
|
||||
|
||||
error_fw_release:
|
||||
release_firmware(fw);
|
||||
err:
|
||||
dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
|
||||
return ret;
|
||||
}
|
||||
|
@ -635,13 +698,18 @@ static int m88ds3103_sleep(struct dvb_frontend *fe)
|
|||
{
|
||||
struct m88ds3103_priv *priv = fe->demodulator_priv;
|
||||
int ret;
|
||||
u8 u8tmp;
|
||||
|
||||
dev_dbg(&priv->i2c->dev, "%s:\n", __func__);
|
||||
|
||||
priv->delivery_system = SYS_UNDEFINED;
|
||||
|
||||
/* TS Hi-Z */
|
||||
ret = m88ds3103_wr_reg_mask(priv, 0x27, 0x00, 0x01);
|
||||
if (priv->chip_id == M88RS6000_CHIP_ID)
|
||||
u8tmp = 0x29;
|
||||
else
|
||||
u8tmp = 0x27;
|
||||
ret = m88ds3103_wr_reg_mask(priv, u8tmp, 0x00, 0x01);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
|
@ -830,7 +898,7 @@ static int m88ds3103_get_frontend(struct dvb_frontend *fe)
|
|||
goto err;
|
||||
|
||||
c->symbol_rate = 1ull * ((buf[1] << 8) | (buf[0] << 0)) *
|
||||
M88DS3103_MCLK_KHZ * 1000 / 0x10000;
|
||||
priv->mclk_khz * 1000 / 0x10000;
|
||||
|
||||
return 0;
|
||||
err:
|
||||
|
@ -1310,18 +1378,22 @@ struct dvb_frontend *m88ds3103_attach(const struct m88ds3103_config *cfg,
|
|||
priv->i2c = i2c;
|
||||
mutex_init(&priv->i2c_mutex);
|
||||
|
||||
ret = m88ds3103_rd_reg(priv, 0x01, &chip_id);
|
||||
/* 0x00: chip id[6:0], 0x01: chip ver[7:0], 0x02: chip ver[15:8] */
|
||||
ret = m88ds3103_rd_reg(priv, 0x00, &chip_id);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
dev_dbg(&priv->i2c->dev, "%s: chip_id=%02x\n", __func__, chip_id);
|
||||
chip_id >>= 1;
|
||||
dev_info(&priv->i2c->dev, "%s: chip_id=%02x\n", __func__, chip_id);
|
||||
|
||||
switch (chip_id) {
|
||||
case 0xd0:
|
||||
case M88RS6000_CHIP_ID:
|
||||
case M88DS3103_CHIP_ID:
|
||||
break;
|
||||
default:
|
||||
goto err;
|
||||
}
|
||||
priv->chip_id = chip_id;
|
||||
|
||||
switch (priv->cfg->clock_out) {
|
||||
case M88DS3103_CLOCK_OUT_DISABLED:
|
||||
|
@ -1337,6 +1409,11 @@ struct dvb_frontend *m88ds3103_attach(const struct m88ds3103_config *cfg,
|
|||
goto err;
|
||||
}
|
||||
|
||||
/* 0x29 register is defined differently for m88rs6000. */
|
||||
/* set internal tuner address to 0x21 */
|
||||
if (chip_id == M88RS6000_CHIP_ID)
|
||||
u8tmp = 0x00;
|
||||
|
||||
ret = m88ds3103_wr_reg(priv, 0x29, u8tmp);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
@ -1364,6 +1441,9 @@ struct dvb_frontend *m88ds3103_attach(const struct m88ds3103_config *cfg,
|
|||
|
||||
/* create dvb_frontend */
|
||||
memcpy(&priv->fe.ops, &m88ds3103_ops, sizeof(struct dvb_frontend_ops));
|
||||
if (priv->chip_id == M88RS6000_CHIP_ID)
|
||||
strncpy(priv->fe.ops.info.name,
|
||||
"Montage M88RS6000", sizeof(priv->fe.ops.info.name));
|
||||
priv->fe.demodulator_priv = priv;
|
||||
|
||||
return &priv->fe;
|
||||
|
@ -1423,3 +1503,4 @@ MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
|
|||
MODULE_DESCRIPTION("Montage M88DS3103 DVB-S/S2 demodulator driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_FIRMWARE(M88DS3103_FIRMWARE);
|
||||
MODULE_FIRMWARE(M88RS6000_FIRMWARE);
|
||||
|
|
|
@ -25,7 +25,10 @@
|
|||
#include <linux/math64.h>
|
||||
|
||||
#define M88DS3103_FIRMWARE "dvb-demod-m88ds3103.fw"
|
||||
#define M88RS6000_FIRMWARE "dvb-demod-m88rs6000.fw"
|
||||
#define M88DS3103_MCLK_KHZ 96000
|
||||
#define M88RS6000_CHIP_ID 0x74
|
||||
#define M88DS3103_CHIP_ID 0x70
|
||||
|
||||
struct m88ds3103_priv {
|
||||
struct i2c_adapter *i2c;
|
||||
|
@ -38,6 +41,10 @@ struct m88ds3103_priv {
|
|||
u32 ber;
|
||||
bool warm; /* FW running */
|
||||
struct i2c_adapter *i2c_adapter;
|
||||
/* auto detect chip id to do different config */
|
||||
u8 chip_id;
|
||||
/* main mclk is calculated for M88RS6000 dynamically */
|
||||
u32 mclk_khz;
|
||||
};
|
||||
|
||||
struct m88ds3103_reg_val {
|
||||
|
@ -214,4 +221,178 @@ static const struct m88ds3103_reg_val m88ds3103_dvbs2_init_reg_vals[] = {
|
|||
{0xb8, 0x00},
|
||||
};
|
||||
|
||||
static const struct m88ds3103_reg_val m88rs6000_dvbs_init_reg_vals[] = {
|
||||
{0x23, 0x07},
|
||||
{0x08, 0x03},
|
||||
{0x0c, 0x02},
|
||||
{0x20, 0x00},
|
||||
{0x21, 0x54},
|
||||
{0x25, 0x82},
|
||||
{0x27, 0x31},
|
||||
{0x30, 0x08},
|
||||
{0x31, 0x40},
|
||||
{0x32, 0x32},
|
||||
{0x33, 0x35},
|
||||
{0x35, 0xff},
|
||||
{0x3a, 0x00},
|
||||
{0x37, 0x10},
|
||||
{0x38, 0x10},
|
||||
{0x39, 0x02},
|
||||
{0x42, 0x60},
|
||||
{0x4a, 0x80},
|
||||
{0x4b, 0x04},
|
||||
{0x4d, 0x91},
|
||||
{0x5d, 0xc8},
|
||||
{0x50, 0x36},
|
||||
{0x51, 0x36},
|
||||
{0x52, 0x36},
|
||||
{0x53, 0x36},
|
||||
{0x63, 0x0f},
|
||||
{0x64, 0x30},
|
||||
{0x65, 0x40},
|
||||
{0x68, 0x26},
|
||||
{0x69, 0x4c},
|
||||
{0x70, 0x20},
|
||||
{0x71, 0x70},
|
||||
{0x72, 0x04},
|
||||
{0x73, 0x00},
|
||||
{0x70, 0x40},
|
||||
{0x71, 0x70},
|
||||
{0x72, 0x04},
|
||||
{0x73, 0x00},
|
||||
{0x70, 0x60},
|
||||
{0x71, 0x70},
|
||||
{0x72, 0x04},
|
||||
{0x73, 0x00},
|
||||
{0x70, 0x80},
|
||||
{0x71, 0x70},
|
||||
{0x72, 0x04},
|
||||
{0x73, 0x00},
|
||||
{0x70, 0xa0},
|
||||
{0x71, 0x70},
|
||||
{0x72, 0x04},
|
||||
{0x73, 0x00},
|
||||
{0x70, 0x1f},
|
||||
{0x76, 0x38},
|
||||
{0x77, 0xa6},
|
||||
{0x78, 0x0c},
|
||||
{0x79, 0x80},
|
||||
{0x7f, 0x14},
|
||||
{0x7c, 0x00},
|
||||
{0xae, 0x82},
|
||||
{0x80, 0x64},
|
||||
{0x81, 0x66},
|
||||
{0x82, 0x44},
|
||||
{0x85, 0x04},
|
||||
{0xcd, 0xf4},
|
||||
{0x90, 0x33},
|
||||
{0xa0, 0x44},
|
||||
{0xbe, 0x00},
|
||||
{0xc0, 0x08},
|
||||
{0xc3, 0x10},
|
||||
{0xc4, 0x08},
|
||||
{0xc5, 0xf0},
|
||||
{0xc6, 0xff},
|
||||
{0xc7, 0x00},
|
||||
{0xc8, 0x1a},
|
||||
{0xc9, 0x80},
|
||||
{0xe0, 0xf8},
|
||||
{0xe6, 0x8b},
|
||||
{0xd0, 0x40},
|
||||
{0xf8, 0x20},
|
||||
{0xfa, 0x0f},
|
||||
{0x00, 0x00},
|
||||
{0xbd, 0x01},
|
||||
{0xb8, 0x00},
|
||||
{0x29, 0x11},
|
||||
};
|
||||
|
||||
static const struct m88ds3103_reg_val m88rs6000_dvbs2_init_reg_vals[] = {
|
||||
{0x23, 0x07},
|
||||
{0x08, 0x07},
|
||||
{0x0c, 0x02},
|
||||
{0x20, 0x00},
|
||||
{0x21, 0x54},
|
||||
{0x25, 0x82},
|
||||
{0x27, 0x31},
|
||||
{0x30, 0x08},
|
||||
{0x32, 0x32},
|
||||
{0x33, 0x35},
|
||||
{0x35, 0xff},
|
||||
{0x3a, 0x00},
|
||||
{0x37, 0x10},
|
||||
{0x38, 0x10},
|
||||
{0x39, 0x02},
|
||||
{0x42, 0x60},
|
||||
{0x4a, 0x80},
|
||||
{0x4b, 0x04},
|
||||
{0x4d, 0x91},
|
||||
{0x5d, 0xc8},
|
||||
{0x50, 0x36},
|
||||
{0x51, 0x36},
|
||||
{0x52, 0x36},
|
||||
{0x53, 0x36},
|
||||
{0x63, 0x0f},
|
||||
{0x64, 0x10},
|
||||
{0x65, 0x20},
|
||||
{0x68, 0x46},
|
||||
{0x69, 0xcd},
|
||||
{0x70, 0x20},
|
||||
{0x71, 0x70},
|
||||
{0x72, 0x04},
|
||||
{0x73, 0x00},
|
||||
{0x70, 0x40},
|
||||
{0x71, 0x70},
|
||||
{0x72, 0x04},
|
||||
{0x73, 0x00},
|
||||
{0x70, 0x60},
|
||||
{0x71, 0x70},
|
||||
{0x72, 0x04},
|
||||
{0x73, 0x00},
|
||||
{0x70, 0x80},
|
||||
{0x71, 0x70},
|
||||
{0x72, 0x04},
|
||||
{0x73, 0x00},
|
||||
{0x70, 0xa0},
|
||||
{0x71, 0x70},
|
||||
{0x72, 0x04},
|
||||
{0x73, 0x00},
|
||||
{0x70, 0x1f},
|
||||
{0x76, 0x38},
|
||||
{0x77, 0xa6},
|
||||
{0x78, 0x0c},
|
||||
{0x79, 0x80},
|
||||
{0x7f, 0x14},
|
||||
{0x85, 0x08},
|
||||
{0xcd, 0xf4},
|
||||
{0x90, 0x33},
|
||||
{0x86, 0x00},
|
||||
{0x87, 0x0f},
|
||||
{0x89, 0x00},
|
||||
{0x8b, 0x44},
|
||||
{0x8c, 0x66},
|
||||
{0x9d, 0xc1},
|
||||
{0x8a, 0x10},
|
||||
{0xad, 0x40},
|
||||
{0xa0, 0x44},
|
||||
{0xbe, 0x00},
|
||||
{0xc0, 0x08},
|
||||
{0xc1, 0x10},
|
||||
{0xc2, 0x08},
|
||||
{0xc3, 0x10},
|
||||
{0xc4, 0x08},
|
||||
{0xc5, 0xf0},
|
||||
{0xc6, 0xff},
|
||||
{0xc7, 0x00},
|
||||
{0xc8, 0x1a},
|
||||
{0xc9, 0x80},
|
||||
{0xca, 0x23},
|
||||
{0xcb, 0x24},
|
||||
{0xcc, 0xf4},
|
||||
{0xce, 0x74},
|
||||
{0x00, 0x00},
|
||||
{0xbd, 0x01},
|
||||
{0xb8, 0x00},
|
||||
{0x29, 0x01},
|
||||
};
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* Panasonic MN88472 DVB-T/T2/C demodulator driver
|
||||
*
|
||||
* Copyright (C) 2013 Antti Palosaari <crope@iki.fi>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef MN88472_H
|
||||
#define MN88472_H
|
||||
|
||||
#include <linux/dvb/frontend.h>
|
||||
|
||||
struct mn88472_config {
|
||||
/*
|
||||
* Max num of bytes given I2C adapter could write at once.
|
||||
* Default: none
|
||||
*/
|
||||
u16 i2c_wr_max;
|
||||
|
||||
|
||||
/* Everything after that is returned by the driver. */
|
||||
|
||||
/*
|
||||
* DVB frontend.
|
||||
*/
|
||||
struct dvb_frontend **fe;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* Panasonic MN88473 DVB-T/T2/C demodulator driver
|
||||
*
|
||||
* Copyright (C) 2014 Antti Palosaari <crope@iki.fi>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef MN88473_H
|
||||
#define MN88473_H
|
||||
|
||||
#include <linux/dvb/frontend.h>
|
||||
|
||||
struct mn88473_config {
|
||||
/*
|
||||
* Max num of bytes given I2C adapter could write at once.
|
||||
* Default: none
|
||||
*/
|
||||
u16 i2c_wr_max;
|
||||
|
||||
|
||||
/* Everything after that is returned by the driver. */
|
||||
|
||||
/*
|
||||
* DVB frontend.
|
||||
*/
|
||||
struct dvb_frontend **fe;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -258,13 +258,11 @@ static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
|
|||
return rtl2832_rd(priv, reg, val, len);
|
||||
}
|
||||
|
||||
#if 0 /* currently not used */
|
||||
/* write single register */
|
||||
static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 val)
|
||||
{
|
||||
return rtl2832_wr_regs(priv, reg, page, &val, 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* read single register */
|
||||
static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val)
|
||||
|
@ -599,6 +597,11 @@ static int rtl2832_set_frontend(struct dvb_frontend *fe)
|
|||
if (fe->ops.tuner_ops.set_params)
|
||||
fe->ops.tuner_ops.set_params(fe);
|
||||
|
||||
/* PIP mode related */
|
||||
ret = rtl2832_wr_regs(priv, 0x92, 1, "\x00\x0f\xff", 3);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
/* If the frontend has get_if_frequency(), use it */
|
||||
if (fe->ops.tuner_ops.get_if_frequency) {
|
||||
u32 if_freq;
|
||||
|
@ -661,7 +664,6 @@ static int rtl2832_set_frontend(struct dvb_frontend *fe)
|
|||
if (ret)
|
||||
goto err;
|
||||
|
||||
|
||||
/* soft reset */
|
||||
ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
|
||||
if (ret)
|
||||
|
@ -1020,6 +1022,58 @@ static int rtl2832_deselect(struct i2c_adapter *adap, void *mux_priv,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int rtl2832_enable_external_ts_if(struct dvb_frontend *fe)
|
||||
{
|
||||
struct rtl2832_priv *priv = fe->demodulator_priv;
|
||||
int ret;
|
||||
|
||||
dev_dbg(&priv->i2c->dev, "%s: setting PIP mode\n", __func__);
|
||||
|
||||
ret = rtl2832_wr_regs(priv, 0x0c, 1, "\x5f\xff", 2);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = rtl2832_wr_demod_reg(priv, DVBT_PIP_ON, 0x1);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = rtl2832_wr_reg(priv, 0xbc, 0, 0x18);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = rtl2832_wr_reg(priv, 0x22, 0, 0x01);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = rtl2832_wr_reg(priv, 0x26, 0, 0x1f);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = rtl2832_wr_reg(priv, 0x27, 0, 0xff);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = rtl2832_wr_regs(priv, 0x92, 1, "\x7f\xf7\xff", 3);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
/* soft reset */
|
||||
ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
return 0;
|
||||
err:
|
||||
dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
|
||||
return ret;
|
||||
|
||||
}
|
||||
EXPORT_SYMBOL(rtl2832_enable_external_ts_if);
|
||||
|
||||
struct i2c_adapter *rtl2832_get_i2c_adapter(struct dvb_frontend *fe)
|
||||
{
|
||||
struct rtl2832_priv *priv = fe->demodulator_priv;
|
||||
|
|
|
@ -64,6 +64,10 @@ extern struct i2c_adapter *rtl2832_get_private_i2c_adapter(
|
|||
struct dvb_frontend *fe
|
||||
);
|
||||
|
||||
extern int rtl2832_enable_external_ts_if(
|
||||
struct dvb_frontend *fe
|
||||
);
|
||||
|
||||
#else
|
||||
|
||||
static inline struct dvb_frontend *rtl2832_attach(
|
||||
|
@ -89,6 +93,13 @@ static inline struct i2c_adapter *rtl2832_get_private_i2c_adapter(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline int rtl2832_enable_external_ts_if(
|
||||
struct dvb_frontend *fe
|
||||
)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -1013,6 +1013,10 @@ static int rtl2832_sdr_start_streaming(struct vb2_queue *vq, unsigned int count)
|
|||
if (s->d->props->power_ctrl)
|
||||
s->d->props->power_ctrl(s->d, 1);
|
||||
|
||||
/* enable ADC */
|
||||
if (s->d->props->frontend_ctrl)
|
||||
s->d->props->frontend_ctrl(s->fe, 1);
|
||||
|
||||
set_bit(POWER_ON, &s->flags);
|
||||
|
||||
ret = rtl2832_sdr_set_tuner(s);
|
||||
|
@ -1064,6 +1068,10 @@ static void rtl2832_sdr_stop_streaming(struct vb2_queue *vq)
|
|||
|
||||
clear_bit(POWER_ON, &s->flags);
|
||||
|
||||
/* disable ADC */
|
||||
if (s->d->props->frontend_ctrl)
|
||||
s->d->props->frontend_ctrl(s->fe, 0);
|
||||
|
||||
if (s->d->props->power_ctrl)
|
||||
s->d->props->power_ctrl(s->d, 0);
|
||||
|
||||
|
|
|
@ -308,14 +308,16 @@ static int si2168_set_frontend(struct dvb_frontend *fe)
|
|||
if (ret)
|
||||
goto err;
|
||||
|
||||
memcpy(cmd.args, "\x14\x00\x09\x10\xe3\x18", 6);
|
||||
memcpy(cmd.args, "\x14\x00\x09\x10\xe3\x08", 6);
|
||||
cmd.args[5] |= s->ts_clock_inv ? 0x00 : 0x10;
|
||||
cmd.wlen = 6;
|
||||
cmd.rlen = 4;
|
||||
ret = si2168_cmd_execute(s, &cmd);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
memcpy(cmd.args, "\x14\x00\x08\x10\xd7\x15", 6);
|
||||
memcpy(cmd.args, "\x14\x00\x08\x10\xd7\x05", 6);
|
||||
cmd.args[5] |= s->ts_clock_inv ? 0x00 : 0x10;
|
||||
cmd.wlen = 6;
|
||||
cmd.rlen = 4;
|
||||
ret = si2168_cmd_execute(s, &cmd);
|
||||
|
@ -453,27 +455,45 @@ static int si2168_init(struct dvb_frontend *fe)
|
|||
dev_err(&s->client->dev,
|
||||
"firmware file '%s' not found\n",
|
||||
fw_file);
|
||||
goto err;
|
||||
goto error_fw_release;
|
||||
}
|
||||
}
|
||||
|
||||
dev_info(&s->client->dev, "downloading firmware from file '%s'\n",
|
||||
fw_file);
|
||||
|
||||
for (remaining = fw->size; remaining > 0; remaining -= i2c_wr_max) {
|
||||
len = remaining;
|
||||
if (len > i2c_wr_max)
|
||||
len = i2c_wr_max;
|
||||
if ((fw->size % 17 == 0) && (fw->data[0] > 5)) {
|
||||
/* firmware is in the new format */
|
||||
for (remaining = fw->size; remaining > 0; remaining -= 17) {
|
||||
len = fw->data[fw->size - remaining];
|
||||
memcpy(cmd.args, &fw->data[(fw->size - remaining) + 1], len);
|
||||
cmd.wlen = len;
|
||||
cmd.rlen = 1;
|
||||
ret = si2168_cmd_execute(s, &cmd);
|
||||
if (ret) {
|
||||
dev_err(&s->client->dev,
|
||||
"firmware download failed=%d\n",
|
||||
ret);
|
||||
goto error_fw_release;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* firmware is in the old format */
|
||||
for (remaining = fw->size; remaining > 0; remaining -= i2c_wr_max) {
|
||||
len = remaining;
|
||||
if (len > i2c_wr_max)
|
||||
len = i2c_wr_max;
|
||||
|
||||
memcpy(cmd.args, &fw->data[fw->size - remaining], len);
|
||||
cmd.wlen = len;
|
||||
cmd.rlen = 1;
|
||||
ret = si2168_cmd_execute(s, &cmd);
|
||||
if (ret) {
|
||||
dev_err(&s->client->dev,
|
||||
"firmware download failed=%d\n",
|
||||
ret);
|
||||
goto err;
|
||||
memcpy(cmd.args, &fw->data[fw->size - remaining], len);
|
||||
cmd.wlen = len;
|
||||
cmd.rlen = 1;
|
||||
ret = si2168_cmd_execute(s, &cmd);
|
||||
if (ret) {
|
||||
dev_err(&s->client->dev,
|
||||
"firmware download failed=%d\n",
|
||||
ret);
|
||||
goto error_fw_release;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -487,6 +507,17 @@ static int si2168_init(struct dvb_frontend *fe)
|
|||
if (ret)
|
||||
goto err;
|
||||
|
||||
/* query firmware version */
|
||||
memcpy(cmd.args, "\x11", 1);
|
||||
cmd.wlen = 1;
|
||||
cmd.rlen = 10;
|
||||
ret = si2168_cmd_execute(s, &cmd);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
dev_dbg(&s->client->dev, "firmware version: %c.%c.%d\n",
|
||||
cmd.args[6], cmd.args[7], cmd.args[8]);
|
||||
|
||||
/* set ts mode */
|
||||
memcpy(cmd.args, "\x14\x00\x01\x10\x10\x00", 6);
|
||||
cmd.args[4] |= s->ts_mode;
|
||||
|
@ -498,17 +529,16 @@ static int si2168_init(struct dvb_frontend *fe)
|
|||
|
||||
s->fw_loaded = true;
|
||||
|
||||
warm:
|
||||
dev_info(&s->client->dev, "found a '%s' in warm state\n",
|
||||
si2168_ops.info.name);
|
||||
|
||||
warm:
|
||||
s->active = true;
|
||||
|
||||
return 0;
|
||||
err:
|
||||
if (fw)
|
||||
release_firmware(fw);
|
||||
|
||||
error_fw_release:
|
||||
release_firmware(fw);
|
||||
err:
|
||||
dev_dbg(&s->client->dev, "failed=%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
@ -670,6 +700,7 @@ static int si2168_probe(struct i2c_client *client,
|
|||
*config->i2c_adapter = s->adapter;
|
||||
*config->fe = &s->fe;
|
||||
s->ts_mode = config->ts_mode;
|
||||
s->ts_clock_inv = config->ts_clock_inv;
|
||||
s->fw_loaded = false;
|
||||
|
||||
i2c_set_clientdata(client, s);
|
||||
|
|
|
@ -37,6 +37,10 @@ struct si2168_config {
|
|||
|
||||
/* TS mode */
|
||||
u8 ts_mode;
|
||||
|
||||
/* TS clock inverted */
|
||||
bool ts_clock_inv;
|
||||
|
||||
};
|
||||
|
||||
#define SI2168_TS_PARALLEL 0x06
|
||||
|
|
|
@ -38,6 +38,7 @@ struct si2168 {
|
|||
bool active;
|
||||
bool fw_loaded;
|
||||
u8 ts_mode;
|
||||
bool ts_clock_inv;
|
||||
};
|
||||
|
||||
/* firmare command struct */
|
||||
|
|
|
@ -92,6 +92,9 @@ static int sp2_write_i2c(struct sp2 *s, u8 reg, u8 *buf, int len)
|
|||
return -EIO;
|
||||
}
|
||||
|
||||
dev_dbg(&s->client->dev, "addr=0x%04x, reg = 0x%02x, data = %*ph\n",
|
||||
client->addr, reg, len, buf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -103,9 +106,6 @@ static int sp2_ci_op_cam(struct dvb_ca_en50221 *en50221, int slot, u8 acs,
|
|||
int mem, ret;
|
||||
int (*ci_op_cam)(void*, u8, int, u8, int*) = s->ci_control;
|
||||
|
||||
dev_dbg(&s->client->dev, "slot=%d, acs=0x%02x, addr=0x%04x, data = 0x%02x",
|
||||
slot, acs, addr, data);
|
||||
|
||||
if (slot != 0)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -140,13 +140,16 @@ static int sp2_ci_op_cam(struct dvb_ca_en50221 *en50221, int slot, u8 acs,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (read) {
|
||||
dev_dbg(&s->client->dev, "cam read, addr=0x%04x, data = 0x%04x",
|
||||
addr, mem);
|
||||
dev_dbg(&s->client->dev, "%s: slot=%d, addr=0x%04x, %s, data=%x",
|
||||
(read) ? "read" : "write", slot, addr,
|
||||
(acs == SP2_CI_ATTR_ACS) ? "attr" : "io",
|
||||
(read) ? mem : data);
|
||||
|
||||
if (read)
|
||||
return mem;
|
||||
} else {
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int sp2_ci_read_attribute_mem(struct dvb_ca_en50221 *en50221,
|
||||
|
@ -407,7 +410,7 @@ static int sp2_probe(struct i2c_client *client,
|
|||
|
||||
static int sp2_remove(struct i2c_client *client)
|
||||
{
|
||||
struct si2157 *s = i2c_get_clientdata(client);
|
||||
struct sp2 *s = i2c_get_clientdata(client);
|
||||
|
||||
dev_dbg(&client->dev, "\n");
|
||||
|
||||
|
|
|
@ -705,7 +705,7 @@ static int stb0899_send_diseqc_msg(struct dvb_frontend *fe, struct dvb_diseqc_ma
|
|||
struct stb0899_state *state = fe->demodulator_priv;
|
||||
u8 reg, i;
|
||||
|
||||
if (cmd->msg_len > 8)
|
||||
if (cmd->msg_len > sizeof(cmd->msg))
|
||||
return -EINVAL;
|
||||
|
||||
/* enable FIFO precharge */
|
||||
|
|
|
@ -2146,7 +2146,7 @@ static int stv090x_get_coldlock(struct stv090x_state *state, s32 timeout_dmd)
|
|||
|
||||
u32 reg;
|
||||
s32 car_step, steps, cur_step, dir, freq, timeout_lock;
|
||||
int lock = 0;
|
||||
int lock;
|
||||
|
||||
if (state->srate >= 10000000)
|
||||
timeout_lock = timeout_dmd / 3;
|
||||
|
@ -2154,98 +2154,96 @@ static int stv090x_get_coldlock(struct stv090x_state *state, s32 timeout_dmd)
|
|||
timeout_lock = timeout_dmd / 2;
|
||||
|
||||
lock = stv090x_get_dmdlock(state, timeout_lock); /* cold start wait */
|
||||
if (!lock) {
|
||||
if (state->srate >= 10000000) {
|
||||
if (stv090x_chk_tmg(state)) {
|
||||
if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1f) < 0)
|
||||
goto err;
|
||||
if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x15) < 0)
|
||||
goto err;
|
||||
lock = stv090x_get_dmdlock(state, timeout_dmd);
|
||||
} else {
|
||||
lock = 0;
|
||||
}
|
||||
} else {
|
||||
if (state->srate <= 4000000)
|
||||
car_step = 1000;
|
||||
else if (state->srate <= 7000000)
|
||||
car_step = 2000;
|
||||
else if (state->srate <= 10000000)
|
||||
car_step = 3000;
|
||||
else
|
||||
car_step = 5000;
|
||||
if (lock)
|
||||
return lock;
|
||||
|
||||
steps = (state->search_range / 1000) / car_step;
|
||||
steps /= 2;
|
||||
steps = 2 * (steps + 1);
|
||||
if (steps < 0)
|
||||
steps = 2;
|
||||
else if (steps > 12)
|
||||
steps = 12;
|
||||
|
||||
cur_step = 1;
|
||||
dir = 1;
|
||||
|
||||
if (!lock) {
|
||||
freq = state->frequency;
|
||||
state->tuner_bw = stv090x_car_width(state->srate, state->rolloff) + state->srate;
|
||||
while ((cur_step <= steps) && (!lock)) {
|
||||
if (dir > 0)
|
||||
freq += cur_step * car_step;
|
||||
else
|
||||
freq -= cur_step * car_step;
|
||||
|
||||
/* Setup tuner */
|
||||
if (stv090x_i2c_gate_ctrl(state, 1) < 0)
|
||||
goto err;
|
||||
|
||||
if (state->config->tuner_set_frequency) {
|
||||
if (state->config->tuner_set_frequency(fe, freq) < 0)
|
||||
goto err_gateoff;
|
||||
}
|
||||
|
||||
if (state->config->tuner_set_bandwidth) {
|
||||
if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0)
|
||||
goto err_gateoff;
|
||||
}
|
||||
|
||||
if (stv090x_i2c_gate_ctrl(state, 0) < 0)
|
||||
goto err;
|
||||
|
||||
msleep(50);
|
||||
|
||||
if (stv090x_i2c_gate_ctrl(state, 1) < 0)
|
||||
goto err;
|
||||
|
||||
if (state->config->tuner_get_status) {
|
||||
if (state->config->tuner_get_status(fe, ®) < 0)
|
||||
goto err_gateoff;
|
||||
}
|
||||
|
||||
if (reg)
|
||||
dprintk(FE_DEBUG, 1, "Tuner phase locked");
|
||||
else
|
||||
dprintk(FE_DEBUG, 1, "Tuner unlocked");
|
||||
|
||||
if (stv090x_i2c_gate_ctrl(state, 0) < 0)
|
||||
goto err;
|
||||
|
||||
STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1c);
|
||||
if (STV090x_WRITE_DEMOD(state, CFRINIT1, 0x00) < 0)
|
||||
goto err;
|
||||
if (STV090x_WRITE_DEMOD(state, CFRINIT0, 0x00) < 0)
|
||||
goto err;
|
||||
if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1f) < 0)
|
||||
goto err;
|
||||
if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x15) < 0)
|
||||
goto err;
|
||||
lock = stv090x_get_dmdlock(state, (timeout_dmd / 3));
|
||||
|
||||
dir *= -1;
|
||||
cur_step++;
|
||||
}
|
||||
}
|
||||
if (state->srate >= 10000000) {
|
||||
if (stv090x_chk_tmg(state)) {
|
||||
if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1f) < 0)
|
||||
goto err;
|
||||
if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x15) < 0)
|
||||
goto err;
|
||||
return stv090x_get_dmdlock(state, timeout_dmd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (state->srate <= 4000000)
|
||||
car_step = 1000;
|
||||
else if (state->srate <= 7000000)
|
||||
car_step = 2000;
|
||||
else if (state->srate <= 10000000)
|
||||
car_step = 3000;
|
||||
else
|
||||
car_step = 5000;
|
||||
|
||||
steps = (state->search_range / 1000) / car_step;
|
||||
steps /= 2;
|
||||
steps = 2 * (steps + 1);
|
||||
if (steps < 0)
|
||||
steps = 2;
|
||||
else if (steps > 12)
|
||||
steps = 12;
|
||||
|
||||
cur_step = 1;
|
||||
dir = 1;
|
||||
|
||||
freq = state->frequency;
|
||||
state->tuner_bw = stv090x_car_width(state->srate, state->rolloff) + state->srate;
|
||||
while ((cur_step <= steps) && (!lock)) {
|
||||
if (dir > 0)
|
||||
freq += cur_step * car_step;
|
||||
else
|
||||
freq -= cur_step * car_step;
|
||||
|
||||
/* Setup tuner */
|
||||
if (stv090x_i2c_gate_ctrl(state, 1) < 0)
|
||||
goto err;
|
||||
|
||||
if (state->config->tuner_set_frequency) {
|
||||
if (state->config->tuner_set_frequency(fe, freq) < 0)
|
||||
goto err_gateoff;
|
||||
}
|
||||
|
||||
if (state->config->tuner_set_bandwidth) {
|
||||
if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0)
|
||||
goto err_gateoff;
|
||||
}
|
||||
|
||||
if (stv090x_i2c_gate_ctrl(state, 0) < 0)
|
||||
goto err;
|
||||
|
||||
msleep(50);
|
||||
|
||||
if (stv090x_i2c_gate_ctrl(state, 1) < 0)
|
||||
goto err;
|
||||
|
||||
if (state->config->tuner_get_status) {
|
||||
if (state->config->tuner_get_status(fe, ®) < 0)
|
||||
goto err_gateoff;
|
||||
}
|
||||
|
||||
if (reg)
|
||||
dprintk(FE_DEBUG, 1, "Tuner phase locked");
|
||||
else
|
||||
dprintk(FE_DEBUG, 1, "Tuner unlocked");
|
||||
|
||||
if (stv090x_i2c_gate_ctrl(state, 0) < 0)
|
||||
goto err;
|
||||
|
||||
STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1c);
|
||||
if (STV090x_WRITE_DEMOD(state, CFRINIT1, 0x00) < 0)
|
||||
goto err;
|
||||
if (STV090x_WRITE_DEMOD(state, CFRINIT0, 0x00) < 0)
|
||||
goto err;
|
||||
if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1f) < 0)
|
||||
goto err;
|
||||
if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x15) < 0)
|
||||
goto err;
|
||||
lock = stv090x_get_dmdlock(state, (timeout_dmd / 3));
|
||||
|
||||
dir *= -1;
|
||||
cur_step++;
|
||||
}
|
||||
|
||||
return lock;
|
||||
|
@ -2663,13 +2661,9 @@ static enum stv090x_signal_state stv090x_get_sig_params(struct stv090x_state *st
|
|||
return STV090x_RANGEOK;
|
||||
else if (abs(offst_freq) <= (stv090x_car_width(state->srate, state->rolloff) / 2000))
|
||||
return STV090x_RANGEOK;
|
||||
else
|
||||
return STV090x_OUTOFRANGE; /* Out of Range */
|
||||
} else {
|
||||
if (abs(offst_freq) <= ((state->search_range / 2000) + 500))
|
||||
return STV090x_RANGEOK;
|
||||
else
|
||||
return STV090x_OUTOFRANGE;
|
||||
}
|
||||
|
||||
return STV090x_OUTOFRANGE;
|
||||
|
@ -2789,6 +2783,12 @@ static u8 stv090x_optimize_carloop(struct stv090x_state *state, enum stv090x_mod
|
|||
aclc = car_loop[i].crl_pilots_off_30;
|
||||
}
|
||||
} else { /* 16APSK and 32APSK */
|
||||
/*
|
||||
* This should never happen in practice, except if
|
||||
* something is really wrong at the car_loop table.
|
||||
*/
|
||||
if (i >= 11)
|
||||
i = 10;
|
||||
if (state->srate <= 3000000)
|
||||
aclc = car_loop_apsk_low[i].crl_pilots_on_2;
|
||||
else if (state->srate <= 7000000)
|
||||
|
@ -3470,7 +3470,20 @@ static enum dvbfe_search stv090x_search(struct dvb_frontend *fe)
|
|||
if (props->frequency == 0)
|
||||
return DVBFE_ALGO_SEARCH_INVALID;
|
||||
|
||||
state->delsys = props->delivery_system;
|
||||
switch (props->delivery_system) {
|
||||
case SYS_DSS:
|
||||
state->delsys = STV090x_DSS;
|
||||
break;
|
||||
case SYS_DVBS:
|
||||
state->delsys = STV090x_DVBS1;
|
||||
break;
|
||||
case SYS_DVBS2:
|
||||
state->delsys = STV090x_DVBS2;
|
||||
break;
|
||||
default:
|
||||
return DVBFE_ALGO_SEARCH_INVALID;
|
||||
}
|
||||
|
||||
state->frequency = props->frequency;
|
||||
state->srate = props->symbol_rate;
|
||||
state->search_mode = STV090x_SEARCH_AUTO;
|
||||
|
@ -4859,8 +4872,8 @@ static int stv090x_setup(struct dvb_frontend *fe)
|
|||
return -1;
|
||||
}
|
||||
|
||||
int stv090x_set_gpio(struct dvb_frontend *fe, u8 gpio, u8 dir, u8 value,
|
||||
u8 xor_value)
|
||||
static int stv090x_set_gpio(struct dvb_frontend *fe, u8 gpio, u8 dir,
|
||||
u8 value, u8 xor_value)
|
||||
{
|
||||
struct stv090x_state *state = fe->demodulator_priv;
|
||||
u8 reg = 0;
|
||||
|
@ -4871,7 +4884,6 @@ int stv090x_set_gpio(struct dvb_frontend *fe, u8 gpio, u8 dir, u8 value,
|
|||
|
||||
return stv090x_write_reg(state, STV090x_GPIOxCFG(gpio), reg);
|
||||
}
|
||||
EXPORT_SYMBOL(stv090x_set_gpio);
|
||||
|
||||
static struct dvb_frontend_ops stv090x_ops = {
|
||||
.delsys = { SYS_DVBS, SYS_DVBS2, SYS_DSS },
|
||||
|
@ -4908,7 +4920,7 @@ static struct dvb_frontend_ops stv090x_ops = {
|
|||
};
|
||||
|
||||
|
||||
struct dvb_frontend *stv090x_attach(const struct stv090x_config *config,
|
||||
struct dvb_frontend *stv090x_attach(struct stv090x_config *config,
|
||||
struct i2c_adapter *i2c,
|
||||
enum stv090x_demodulator demod)
|
||||
{
|
||||
|
@ -4969,6 +4981,8 @@ struct dvb_frontend *stv090x_attach(const struct stv090x_config *config,
|
|||
if (config->diseqc_envelope_mode)
|
||||
stv090x_send_diseqc_burst(&state->frontend, SEC_MINI_A);
|
||||
|
||||
config->set_gpio = stv090x_set_gpio;
|
||||
|
||||
dprintk(FE_ERROR, 1, "Attaching %s demodulator(%d) Cut=0x%02x",
|
||||
state->device == STV0900 ? "STV0900" : "STV0903",
|
||||
demod,
|
||||
|
|
|
@ -89,29 +89,29 @@ struct stv090x_config {
|
|||
|
||||
bool diseqc_envelope_mode;
|
||||
|
||||
int (*tuner_init) (struct dvb_frontend *fe);
|
||||
int (*tuner_sleep) (struct dvb_frontend *fe);
|
||||
int (*tuner_set_mode) (struct dvb_frontend *fe, enum tuner_mode mode);
|
||||
int (*tuner_set_frequency) (struct dvb_frontend *fe, u32 frequency);
|
||||
int (*tuner_get_frequency) (struct dvb_frontend *fe, u32 *frequency);
|
||||
int (*tuner_set_bandwidth) (struct dvb_frontend *fe, u32 bandwidth);
|
||||
int (*tuner_get_bandwidth) (struct dvb_frontend *fe, u32 *bandwidth);
|
||||
int (*tuner_set_bbgain) (struct dvb_frontend *fe, u32 gain);
|
||||
int (*tuner_get_bbgain) (struct dvb_frontend *fe, u32 *gain);
|
||||
int (*tuner_set_refclk) (struct dvb_frontend *fe, u32 refclk);
|
||||
int (*tuner_get_status) (struct dvb_frontend *fe, u32 *status);
|
||||
void (*tuner_i2c_lock) (struct dvb_frontend *fe, int lock);
|
||||
int (*tuner_init)(struct dvb_frontend *fe);
|
||||
int (*tuner_sleep)(struct dvb_frontend *fe);
|
||||
int (*tuner_set_mode)(struct dvb_frontend *fe, enum tuner_mode mode);
|
||||
int (*tuner_set_frequency)(struct dvb_frontend *fe, u32 frequency);
|
||||
int (*tuner_get_frequency)(struct dvb_frontend *fe, u32 *frequency);
|
||||
int (*tuner_set_bandwidth)(struct dvb_frontend *fe, u32 bandwidth);
|
||||
int (*tuner_get_bandwidth)(struct dvb_frontend *fe, u32 *bandwidth);
|
||||
int (*tuner_set_bbgain)(struct dvb_frontend *fe, u32 gain);
|
||||
int (*tuner_get_bbgain)(struct dvb_frontend *fe, u32 *gain);
|
||||
int (*tuner_set_refclk)(struct dvb_frontend *fe, u32 refclk);
|
||||
int (*tuner_get_status)(struct dvb_frontend *fe, u32 *status);
|
||||
void (*tuner_i2c_lock)(struct dvb_frontend *fe, int lock);
|
||||
|
||||
/* dir = 0 -> output, dir = 1 -> input/open-drain */
|
||||
int (*set_gpio)(struct dvb_frontend *fe, u8 gpio, u8 dir, u8 value,
|
||||
u8 xor_value);
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_DVB_STV090x)
|
||||
|
||||
extern struct dvb_frontend *stv090x_attach(const struct stv090x_config *config,
|
||||
struct i2c_adapter *i2c,
|
||||
enum stv090x_demodulator demod);
|
||||
|
||||
/* dir = 0 -> output, dir = 1 -> input/open-drain */
|
||||
extern int stv090x_set_gpio(struct dvb_frontend *fe, u8 gpio,
|
||||
u8 dir, u8 value, u8 xor_value);
|
||||
struct dvb_frontend *stv090x_attach(struct stv090x_config *config,
|
||||
struct i2c_adapter *i2c,
|
||||
enum stv090x_demodulator demod);
|
||||
|
||||
#else
|
||||
|
||||
|
@ -123,12 +123,6 @@ static inline struct dvb_frontend *stv090x_attach(const struct stv090x_config *c
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline int stv090x_set_gpio(struct dvb_frontend *fe, u8 gpio,
|
||||
u8 opd, u8 value, u8 xor_value)
|
||||
{
|
||||
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif /* CONFIG_DVB_STV090x */
|
||||
|
||||
#endif /* __STV090x_H */
|
||||
|
|
|
@ -253,6 +253,5 @@ int fdtv_ca_register(struct firedtv *fdtv)
|
|||
|
||||
void fdtv_ca_release(struct firedtv *fdtv)
|
||||
{
|
||||
if (fdtv->cadev)
|
||||
dvb_unregister_device(fdtv->cadev);
|
||||
dvb_unregister_device(fdtv->cadev);
|
||||
}
|
||||
|
|
|
@ -96,7 +96,7 @@ struct firedtv {
|
|||
|
||||
enum model_type type;
|
||||
char subunit;
|
||||
char isochannel;
|
||||
s8 isochannel;
|
||||
struct fdtv_ir_context *ir_context;
|
||||
|
||||
fe_sec_voltage_t voltage;
|
||||
|
|
|
@ -63,9 +63,9 @@ static inline struct adv7170 *to_adv7170(struct v4l2_subdev *sd)
|
|||
|
||||
static char *inputs[] = { "pass_through", "play_back" };
|
||||
|
||||
static enum v4l2_mbus_pixelcode adv7170_codes[] = {
|
||||
V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
V4L2_MBUS_FMT_UYVY8_1X16,
|
||||
static u32 adv7170_codes[] = {
|
||||
MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
MEDIA_BUS_FMT_UYVY8_1X16,
|
||||
};
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
@ -263,7 +263,7 @@ static int adv7170_s_routing(struct v4l2_subdev *sd,
|
|||
}
|
||||
|
||||
static int adv7170_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index >= ARRAY_SIZE(adv7170_codes))
|
||||
return -EINVAL;
|
||||
|
@ -278,9 +278,9 @@ static int adv7170_g_fmt(struct v4l2_subdev *sd,
|
|||
u8 val = adv7170_read(sd, 0x7);
|
||||
|
||||
if ((val & 0x40) == (1 << 6))
|
||||
mf->code = V4L2_MBUS_FMT_UYVY8_1X16;
|
||||
mf->code = MEDIA_BUS_FMT_UYVY8_1X16;
|
||||
else
|
||||
mf->code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
mf->code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
|
||||
mf->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
mf->width = 0;
|
||||
|
@ -297,11 +297,11 @@ static int adv7170_s_fmt(struct v4l2_subdev *sd,
|
|||
int ret;
|
||||
|
||||
switch (mf->code) {
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
val &= ~0x40;
|
||||
break;
|
||||
|
||||
case V4L2_MBUS_FMT_UYVY8_1X16:
|
||||
case MEDIA_BUS_FMT_UYVY8_1X16:
|
||||
val |= 0x40;
|
||||
break;
|
||||
|
||||
|
|
|
@ -60,9 +60,9 @@ static inline struct adv7175 *to_adv7175(struct v4l2_subdev *sd)
|
|||
|
||||
static char *inputs[] = { "pass_through", "play_back", "color_bar" };
|
||||
|
||||
static enum v4l2_mbus_pixelcode adv7175_codes[] = {
|
||||
V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
V4L2_MBUS_FMT_UYVY8_1X16,
|
||||
static u32 adv7175_codes[] = {
|
||||
MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
MEDIA_BUS_FMT_UYVY8_1X16,
|
||||
};
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
@ -301,7 +301,7 @@ static int adv7175_s_routing(struct v4l2_subdev *sd,
|
|||
}
|
||||
|
||||
static int adv7175_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index >= ARRAY_SIZE(adv7175_codes))
|
||||
return -EINVAL;
|
||||
|
@ -316,9 +316,9 @@ static int adv7175_g_fmt(struct v4l2_subdev *sd,
|
|||
u8 val = adv7175_read(sd, 0x7);
|
||||
|
||||
if ((val & 0x40) == (1 << 6))
|
||||
mf->code = V4L2_MBUS_FMT_UYVY8_1X16;
|
||||
mf->code = MEDIA_BUS_FMT_UYVY8_1X16;
|
||||
else
|
||||
mf->code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
mf->code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
|
||||
mf->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
mf->width = 0;
|
||||
|
@ -335,11 +335,11 @@ static int adv7175_s_fmt(struct v4l2_subdev *sd,
|
|||
int ret;
|
||||
|
||||
switch (mf->code) {
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
val &= ~0x40;
|
||||
break;
|
||||
|
||||
case V4L2_MBUS_FMT_UYVY8_1X16:
|
||||
case MEDIA_BUS_FMT_UYVY8_1X16:
|
||||
val |= 0x40;
|
||||
break;
|
||||
|
||||
|
|
|
@ -422,12 +422,12 @@ static void adv7180_exit_controls(struct adv7180_state *state)
|
|||
}
|
||||
|
||||
static int adv7180_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index > 0)
|
||||
return -EINVAL;
|
||||
|
||||
*code = V4L2_MBUS_FMT_YUYV8_2X8;
|
||||
*code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -437,7 +437,7 @@ static int adv7180_mbus_fmt(struct v4l2_subdev *sd,
|
|||
{
|
||||
struct adv7180_state *state = to_state(sd);
|
||||
|
||||
fmt->code = V4L2_MBUS_FMT_YUYV8_2X8;
|
||||
fmt->code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
fmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
fmt->field = V4L2_FIELD_INTERLACED;
|
||||
fmt->width = 720;
|
||||
|
|
|
@ -421,12 +421,12 @@ static int adv7183_g_input_status(struct v4l2_subdev *sd, u32 *status)
|
|||
}
|
||||
|
||||
static int adv7183_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index > 0)
|
||||
return -EINVAL;
|
||||
|
||||
*code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
*code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -435,7 +435,7 @@ static int adv7183_try_mbus_fmt(struct v4l2_subdev *sd,
|
|||
{
|
||||
struct adv7183 *decoder = to_adv7183(sd);
|
||||
|
||||
fmt->code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
fmt->code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
fmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
if (decoder->std & V4L2_STD_525_60) {
|
||||
fmt->field = V4L2_FIELD_SEQ_TB;
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/videodev2.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/hdmi.h>
|
||||
#include <linux/v4l2-dv-timings.h>
|
||||
#include <media/v4l2-device.h>
|
||||
#include <media/v4l2-common.h>
|
||||
|
@ -96,6 +97,10 @@ struct adv7511_state {
|
|||
bool have_monitor;
|
||||
/* timings from s_dv_timings */
|
||||
struct v4l2_dv_timings dv_timings;
|
||||
u32 fmt_code;
|
||||
u32 colorspace;
|
||||
u32 ycbcr_enc;
|
||||
u32 quantization;
|
||||
/* controls */
|
||||
struct v4l2_ctrl *hdmi_mode_ctrl;
|
||||
struct v4l2_ctrl *hotplug_ctrl;
|
||||
|
@ -779,26 +784,234 @@ static int adv7511_get_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid)
|
|||
{
|
||||
struct adv7511_state *state = get_adv7511_state(sd);
|
||||
|
||||
memset(edid->reserved, 0, sizeof(edid->reserved));
|
||||
|
||||
if (edid->pad != 0)
|
||||
return -EINVAL;
|
||||
if ((edid->blocks == 0) || (edid->blocks > 256))
|
||||
return -EINVAL;
|
||||
if (!state->edid.segments) {
|
||||
v4l2_dbg(1, debug, sd, "EDID segment 0 not found\n");
|
||||
return -ENODATA;
|
||||
|
||||
if (edid->start_block == 0 && edid->blocks == 0) {
|
||||
edid->blocks = state->edid.segments * 2;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (state->edid.segments == 0)
|
||||
return -ENODATA;
|
||||
|
||||
if (edid->start_block >= state->edid.segments * 2)
|
||||
return -E2BIG;
|
||||
if ((edid->blocks + edid->start_block) >= state->edid.segments * 2)
|
||||
return -EINVAL;
|
||||
|
||||
if (edid->start_block + edid->blocks > state->edid.segments * 2)
|
||||
edid->blocks = state->edid.segments * 2 - edid->start_block;
|
||||
|
||||
memcpy(edid->edid, &state->edid.data[edid->start_block * 128],
|
||||
128 * edid->blocks);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int adv7511_enum_mbus_code(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_mbus_code_enum *code)
|
||||
{
|
||||
if (code->pad != 0)
|
||||
return -EINVAL;
|
||||
|
||||
switch (code->index) {
|
||||
case 0:
|
||||
code->code = MEDIA_BUS_FMT_RGB888_1X24;
|
||||
break;
|
||||
case 1:
|
||||
code->code = MEDIA_BUS_FMT_YUYV8_1X16;
|
||||
break;
|
||||
case 2:
|
||||
code->code = MEDIA_BUS_FMT_UYVY8_1X16;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void adv7511_fill_format(struct adv7511_state *state,
|
||||
struct v4l2_mbus_framefmt *format)
|
||||
{
|
||||
memset(format, 0, sizeof(*format));
|
||||
|
||||
format->width = state->dv_timings.bt.width;
|
||||
format->height = state->dv_timings.bt.height;
|
||||
format->field = V4L2_FIELD_NONE;
|
||||
}
|
||||
|
||||
static int adv7511_get_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_format *format)
|
||||
{
|
||||
struct adv7511_state *state = get_adv7511_state(sd);
|
||||
|
||||
if (format->pad != 0)
|
||||
return -EINVAL;
|
||||
|
||||
adv7511_fill_format(state, &format->format);
|
||||
|
||||
if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
|
||||
struct v4l2_mbus_framefmt *fmt;
|
||||
|
||||
fmt = v4l2_subdev_get_try_format(fh, format->pad);
|
||||
format->format.code = fmt->code;
|
||||
format->format.colorspace = fmt->colorspace;
|
||||
format->format.ycbcr_enc = fmt->ycbcr_enc;
|
||||
format->format.quantization = fmt->quantization;
|
||||
} else {
|
||||
format->format.code = state->fmt_code;
|
||||
format->format.colorspace = state->colorspace;
|
||||
format->format.ycbcr_enc = state->ycbcr_enc;
|
||||
format->format.quantization = state->quantization;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int adv7511_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_format *format)
|
||||
{
|
||||
struct adv7511_state *state = get_adv7511_state(sd);
|
||||
/*
|
||||
* Bitfield namings come the CEA-861-F standard, table 8 "Auxiliary
|
||||
* Video Information (AVI) InfoFrame Format"
|
||||
*
|
||||
* c = Colorimetry
|
||||
* ec = Extended Colorimetry
|
||||
* y = RGB or YCbCr
|
||||
* q = RGB Quantization Range
|
||||
* yq = YCC Quantization Range
|
||||
*/
|
||||
u8 c = HDMI_COLORIMETRY_NONE;
|
||||
u8 ec = HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
|
||||
u8 y = HDMI_COLORSPACE_RGB;
|
||||
u8 q = HDMI_QUANTIZATION_RANGE_DEFAULT;
|
||||
u8 yq = HDMI_YCC_QUANTIZATION_RANGE_LIMITED;
|
||||
|
||||
if (format->pad != 0)
|
||||
return -EINVAL;
|
||||
switch (format->format.code) {
|
||||
case MEDIA_BUS_FMT_UYVY8_1X16:
|
||||
case MEDIA_BUS_FMT_YUYV8_1X16:
|
||||
case MEDIA_BUS_FMT_RGB888_1X24:
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
adv7511_fill_format(state, &format->format);
|
||||
if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
|
||||
struct v4l2_mbus_framefmt *fmt;
|
||||
|
||||
fmt = v4l2_subdev_get_try_format(fh, format->pad);
|
||||
fmt->code = format->format.code;
|
||||
fmt->colorspace = format->format.colorspace;
|
||||
fmt->ycbcr_enc = format->format.ycbcr_enc;
|
||||
fmt->quantization = format->format.quantization;
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (format->format.code) {
|
||||
case MEDIA_BUS_FMT_UYVY8_1X16:
|
||||
adv7511_wr_and_or(sd, 0x15, 0xf0, 0x01);
|
||||
adv7511_wr_and_or(sd, 0x16, 0x03, 0xb8);
|
||||
y = HDMI_COLORSPACE_YUV422;
|
||||
break;
|
||||
case MEDIA_BUS_FMT_YUYV8_1X16:
|
||||
adv7511_wr_and_or(sd, 0x15, 0xf0, 0x01);
|
||||
adv7511_wr_and_or(sd, 0x16, 0x03, 0xbc);
|
||||
y = HDMI_COLORSPACE_YUV422;
|
||||
break;
|
||||
case MEDIA_BUS_FMT_RGB888_1X24:
|
||||
default:
|
||||
adv7511_wr_and_or(sd, 0x15, 0xf0, 0x00);
|
||||
adv7511_wr_and_or(sd, 0x16, 0x03, 0x00);
|
||||
break;
|
||||
}
|
||||
state->fmt_code = format->format.code;
|
||||
state->colorspace = format->format.colorspace;
|
||||
state->ycbcr_enc = format->format.ycbcr_enc;
|
||||
state->quantization = format->format.quantization;
|
||||
|
||||
switch (format->format.colorspace) {
|
||||
case V4L2_COLORSPACE_ADOBERGB:
|
||||
c = HDMI_COLORIMETRY_EXTENDED;
|
||||
ec = y ? HDMI_EXTENDED_COLORIMETRY_ADOBE_YCC_601 :
|
||||
HDMI_EXTENDED_COLORIMETRY_ADOBE_RGB;
|
||||
break;
|
||||
case V4L2_COLORSPACE_SMPTE170M:
|
||||
c = y ? HDMI_COLORIMETRY_ITU_601 : HDMI_COLORIMETRY_NONE;
|
||||
if (y && format->format.ycbcr_enc == V4L2_YCBCR_ENC_XV601) {
|
||||
c = HDMI_COLORIMETRY_EXTENDED;
|
||||
ec = HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
|
||||
}
|
||||
break;
|
||||
case V4L2_COLORSPACE_REC709:
|
||||
c = y ? HDMI_COLORIMETRY_ITU_709 : HDMI_COLORIMETRY_NONE;
|
||||
if (y && format->format.ycbcr_enc == V4L2_YCBCR_ENC_XV709) {
|
||||
c = HDMI_COLORIMETRY_EXTENDED;
|
||||
ec = HDMI_EXTENDED_COLORIMETRY_XV_YCC_709;
|
||||
}
|
||||
break;
|
||||
case V4L2_COLORSPACE_SRGB:
|
||||
c = y ? HDMI_COLORIMETRY_EXTENDED : HDMI_COLORIMETRY_NONE;
|
||||
ec = y ? HDMI_EXTENDED_COLORIMETRY_S_YCC_601 :
|
||||
HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
|
||||
break;
|
||||
case V4L2_COLORSPACE_BT2020:
|
||||
c = HDMI_COLORIMETRY_EXTENDED;
|
||||
if (y && format->format.ycbcr_enc == V4L2_YCBCR_ENC_BT2020_CONST_LUM)
|
||||
ec = 5; /* Not yet available in hdmi.h */
|
||||
else
|
||||
ec = 6; /* Not yet available in hdmi.h */
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* CEA-861-F says that for RGB formats the YCC range must match the
|
||||
* RGB range, although sources should ignore the YCC range.
|
||||
*
|
||||
* The RGB quantization range shouldn't be non-zero if the EDID doesn't
|
||||
* have the Q bit set in the Video Capabilities Data Block, however this
|
||||
* isn't checked at the moment. The assumption is that the application
|
||||
* knows the EDID and can detect this.
|
||||
*
|
||||
* The same is true for the YCC quantization range: non-standard YCC
|
||||
* quantization ranges should only be sent if the EDID has the YQ bit
|
||||
* set in the Video Capabilities Data Block.
|
||||
*/
|
||||
switch (format->format.quantization) {
|
||||
case V4L2_QUANTIZATION_FULL_RANGE:
|
||||
q = y ? HDMI_QUANTIZATION_RANGE_DEFAULT :
|
||||
HDMI_QUANTIZATION_RANGE_FULL;
|
||||
yq = q ? q - 1 : HDMI_YCC_QUANTIZATION_RANGE_FULL;
|
||||
break;
|
||||
case V4L2_QUANTIZATION_LIM_RANGE:
|
||||
q = y ? HDMI_QUANTIZATION_RANGE_DEFAULT :
|
||||
HDMI_QUANTIZATION_RANGE_LIMITED;
|
||||
yq = q ? q - 1 : HDMI_YCC_QUANTIZATION_RANGE_LIMITED;
|
||||
break;
|
||||
}
|
||||
|
||||
adv7511_wr_and_or(sd, 0x4a, 0xbf, 0);
|
||||
adv7511_wr_and_or(sd, 0x55, 0x9f, y << 5);
|
||||
adv7511_wr_and_or(sd, 0x56, 0x3f, c << 6);
|
||||
adv7511_wr_and_or(sd, 0x57, 0x83, (ec << 4) | (q << 2));
|
||||
adv7511_wr_and_or(sd, 0x59, 0x0f, yq << 4);
|
||||
adv7511_wr_and_or(sd, 0x4a, 0xff, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct v4l2_subdev_pad_ops adv7511_pad_ops = {
|
||||
.get_edid = adv7511_get_edid,
|
||||
.enum_mbus_code = adv7511_enum_mbus_code,
|
||||
.get_fmt = adv7511_get_fmt,
|
||||
.set_fmt = adv7511_set_fmt,
|
||||
.enum_dv_timings = adv7511_enum_dv_timings,
|
||||
.dv_timings_cap = adv7511_dv_timings_cap,
|
||||
};
|
||||
|
@ -1116,6 +1329,8 @@ static int adv7511_probe(struct i2c_client *client, const struct i2c_device_id *
|
|||
return -ENODEV;
|
||||
}
|
||||
memcpy(&state->pdata, pdata, sizeof(state->pdata));
|
||||
state->fmt_code = MEDIA_BUS_FMT_RGB888_1X24;
|
||||
state->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
|
||||
sd = &state->sd;
|
||||
|
||||
|
|
|
@ -88,7 +88,7 @@ struct adv7604_reg_seq {
|
|||
};
|
||||
|
||||
struct adv7604_format_info {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
u8 op_ch_sel;
|
||||
bool rgb_out;
|
||||
bool swap_cb_cr;
|
||||
|
@ -749,77 +749,77 @@ static void adv7604_write_reg_seq(struct v4l2_subdev *sd,
|
|||
*/
|
||||
|
||||
static const struct adv7604_format_info adv7604_formats[] = {
|
||||
{ V4L2_MBUS_FMT_RGB888_1X24, ADV7604_OP_CH_SEL_RGB, true, false,
|
||||
{ MEDIA_BUS_FMT_RGB888_1X24, ADV7604_OP_CH_SEL_RGB, true, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_444 | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV8_2X8, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV8_2X8, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU8_2X8, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU8_2X8, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV10_2X10, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV10_2X10, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_10BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU10_2X10, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU10_2X10, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_10BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV12_2X12, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV12_2X12, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU12_2X12, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU12_2X12, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_UYVY8_1X16, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
{ MEDIA_BUS_FMT_UYVY8_1X16, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_VYUY8_1X16, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
{ MEDIA_BUS_FMT_VYUY8_1X16, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV8_1X16, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV8_1X16, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU8_1X16, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU8_1X16, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_UYVY10_1X20, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
{ MEDIA_BUS_FMT_UYVY10_1X20, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_10BIT },
|
||||
{ V4L2_MBUS_FMT_VYUY10_1X20, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
{ MEDIA_BUS_FMT_VYUY10_1X20, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_10BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV10_1X20, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV10_1X20, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_10BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU10_1X20, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU10_1X20, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_10BIT },
|
||||
{ V4L2_MBUS_FMT_UYVY12_1X24, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
{ MEDIA_BUS_FMT_UYVY12_1X24, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_VYUY12_1X24, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
{ MEDIA_BUS_FMT_VYUY12_1X24, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV12_1X24, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV12_1X24, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU12_1X24, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU12_1X24, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
};
|
||||
|
||||
static const struct adv7604_format_info adv7611_formats[] = {
|
||||
{ V4L2_MBUS_FMT_RGB888_1X24, ADV7604_OP_CH_SEL_RGB, true, false,
|
||||
{ MEDIA_BUS_FMT_RGB888_1X24, ADV7604_OP_CH_SEL_RGB, true, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_444 | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV8_2X8, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV8_2X8, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU8_2X8, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU8_2X8, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV12_2X12, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV12_2X12, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU12_2X12, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU12_2X12, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_UYVY8_1X16, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
{ MEDIA_BUS_FMT_UYVY8_1X16, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_VYUY8_1X16, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
{ MEDIA_BUS_FMT_VYUY8_1X16, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV8_1X16, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV8_1X16, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU8_1X16, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU8_1X16, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_UYVY12_1X24, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
{ MEDIA_BUS_FMT_UYVY12_1X24, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_VYUY12_1X24, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
{ MEDIA_BUS_FMT_VYUY12_1X24, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV12_1X24, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV12_1X24, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU12_1X24, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU12_1X24, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
};
|
||||
|
||||
static const struct adv7604_format_info *
|
||||
adv7604_format_info(struct adv7604_state *state, enum v4l2_mbus_pixelcode code)
|
||||
adv7604_format_info(struct adv7604_state *state, u32 code)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
|
@ -1917,7 +1917,7 @@ static int adv7604_set_format(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
|||
|
||||
info = adv7604_format_info(state, format->format.code);
|
||||
if (info == NULL)
|
||||
info = adv7604_format_info(state, V4L2_MBUS_FMT_YUYV8_2X8);
|
||||
info = adv7604_format_info(state, MEDIA_BUS_FMT_YUYV8_2X8);
|
||||
|
||||
adv7604_fill_format(state, &format->format);
|
||||
format->format.code = info->code;
|
||||
|
@ -1997,19 +1997,7 @@ static int adv7604_get_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid)
|
|||
struct adv7604_state *state = to_state(sd);
|
||||
u8 *data = NULL;
|
||||
|
||||
if (edid->pad > ADV7604_PAD_HDMI_PORT_D)
|
||||
return -EINVAL;
|
||||
if (edid->blocks == 0)
|
||||
return -EINVAL;
|
||||
if (edid->blocks > 2)
|
||||
return -EINVAL;
|
||||
if (edid->start_block > 1)
|
||||
return -EINVAL;
|
||||
if (edid->start_block == 1)
|
||||
edid->blocks = 1;
|
||||
|
||||
if (edid->blocks > state->edid.blocks)
|
||||
edid->blocks = state->edid.blocks;
|
||||
memset(edid->reserved, 0, sizeof(edid->reserved));
|
||||
|
||||
switch (edid->pad) {
|
||||
case ADV7604_PAD_HDMI_PORT_A:
|
||||
|
@ -2021,14 +2009,24 @@ static int adv7604_get_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid)
|
|||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
break;
|
||||
}
|
||||
if (!data)
|
||||
|
||||
if (edid->start_block == 0 && edid->blocks == 0) {
|
||||
edid->blocks = data ? state->edid.blocks : 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (data == NULL)
|
||||
return -ENODATA;
|
||||
|
||||
memcpy(edid->edid,
|
||||
data + edid->start_block * 128,
|
||||
edid->blocks * 128);
|
||||
if (edid->start_block >= state->edid.blocks)
|
||||
return -EINVAL;
|
||||
|
||||
if (edid->start_block + edid->blocks > state->edid.blocks)
|
||||
edid->blocks = state->edid.blocks - edid->start_block;
|
||||
|
||||
memcpy(edid->edid, data + edid->start_block * 128, edid->blocks * 128);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2068,6 +2066,8 @@ static int adv7604_set_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid)
|
|||
int err;
|
||||
int i;
|
||||
|
||||
memset(edid->reserved, 0, sizeof(edid->reserved));
|
||||
|
||||
if (edid->pad > ADV7604_PAD_HDMI_PORT_D)
|
||||
return -EINVAL;
|
||||
if (edid->start_block != 0)
|
||||
|
@ -2164,7 +2164,6 @@ static int adv7604_set_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid)
|
|||
return -EIO;
|
||||
}
|
||||
|
||||
|
||||
/* enable hotplug after 100 ms */
|
||||
queue_delayed_work(state->work_queues,
|
||||
&state->delayed_work_enable_hotplug, HZ / 10);
|
||||
|
@ -2807,7 +2806,7 @@ static int adv7604_probe(struct i2c_client *client,
|
|||
}
|
||||
|
||||
state->timings = cea640x480;
|
||||
state->format = adv7604_format_info(state, V4L2_MBUS_FMT_YUYV8_2X8);
|
||||
state->format = adv7604_format_info(state, MEDIA_BUS_FMT_YUYV8_2X8);
|
||||
|
||||
sd = &state->sd;
|
||||
v4l2_i2c_subdev_init(sd, client, &adv7604_ops);
|
||||
|
|
|
@ -1877,12 +1877,12 @@ static int adv7842_s_routing(struct v4l2_subdev *sd,
|
|||
}
|
||||
|
||||
static int adv7842_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index)
|
||||
return -EINVAL;
|
||||
/* Good enough for now */
|
||||
*code = V4L2_MBUS_FMT_FIXED;
|
||||
*code = MEDIA_BUS_FMT_FIXED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1893,7 +1893,7 @@ static int adv7842_g_mbus_fmt(struct v4l2_subdev *sd,
|
|||
|
||||
fmt->width = state->timings.bt.width;
|
||||
fmt->height = state->timings.bt.height;
|
||||
fmt->code = V4L2_MBUS_FMT_FIXED;
|
||||
fmt->code = MEDIA_BUS_FMT_FIXED;
|
||||
fmt->field = V4L2_FIELD_NONE;
|
||||
|
||||
if (state->mode == ADV7842_MODE_SDP) {
|
||||
|
@ -2028,16 +2028,7 @@ static int adv7842_get_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid)
|
|||
struct adv7842_state *state = to_state(sd);
|
||||
u8 *data = NULL;
|
||||
|
||||
if (edid->pad > ADV7842_EDID_PORT_VGA)
|
||||
return -EINVAL;
|
||||
if (edid->blocks == 0)
|
||||
return -EINVAL;
|
||||
if (edid->blocks > 2)
|
||||
return -EINVAL;
|
||||
if (edid->start_block > 1)
|
||||
return -EINVAL;
|
||||
if (edid->start_block == 1)
|
||||
edid->blocks = 1;
|
||||
memset(edid->reserved, 0, sizeof(edid->reserved));
|
||||
|
||||
switch (edid->pad) {
|
||||
case ADV7842_EDID_PORT_A:
|
||||
|
@ -2052,12 +2043,23 @@ static int adv7842_get_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid)
|
|||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (edid->start_block == 0 && edid->blocks == 0) {
|
||||
edid->blocks = data ? 2 : 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!data)
|
||||
return -ENODATA;
|
||||
|
||||
memcpy(edid->edid,
|
||||
data + edid->start_block * 128,
|
||||
edid->blocks * 128);
|
||||
if (edid->start_block >= 2)
|
||||
return -EINVAL;
|
||||
|
||||
if (edid->start_block + edid->blocks > 2)
|
||||
edid->blocks = 2 - edid->start_block;
|
||||
|
||||
memcpy(edid->edid, data + edid->start_block * 128, edid->blocks * 128);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2066,12 +2068,16 @@ static int adv7842_set_edid(struct v4l2_subdev *sd, struct v4l2_edid *e)
|
|||
struct adv7842_state *state = to_state(sd);
|
||||
int err = 0;
|
||||
|
||||
memset(e->reserved, 0, sizeof(e->reserved));
|
||||
|
||||
if (e->pad > ADV7842_EDID_PORT_VGA)
|
||||
return -EINVAL;
|
||||
if (e->start_block != 0)
|
||||
return -EINVAL;
|
||||
if (e->blocks > 2)
|
||||
if (e->blocks > 2) {
|
||||
e->blocks = 2;
|
||||
return -E2BIG;
|
||||
}
|
||||
|
||||
/* todo, per edid */
|
||||
state->aspect_ratio = v4l2_calc_aspect_ratio(e->edid[0x15],
|
||||
|
|
|
@ -102,7 +102,7 @@ static int ak881x_try_g_mbus_fmt(struct v4l2_subdev *sd,
|
|||
v4l_bound_align_image(&mf->width, 0, 720, 2,
|
||||
&mf->height, 0, ak881x->lines, 1, 0);
|
||||
mf->field = V4L2_FIELD_INTERLACED;
|
||||
mf->code = V4L2_MBUS_FMT_YUYV8_2X8;
|
||||
mf->code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
mf->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
|
||||
return 0;
|
||||
|
@ -112,19 +112,19 @@ static int ak881x_s_mbus_fmt(struct v4l2_subdev *sd,
|
|||
struct v4l2_mbus_framefmt *mf)
|
||||
{
|
||||
if (mf->field != V4L2_FIELD_INTERLACED ||
|
||||
mf->code != V4L2_MBUS_FMT_YUYV8_2X8)
|
||||
mf->code != MEDIA_BUS_FMT_YUYV8_2X8)
|
||||
return -EINVAL;
|
||||
|
||||
return ak881x_try_g_mbus_fmt(sd, mf);
|
||||
}
|
||||
|
||||
static int ak881x_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index)
|
||||
return -EINVAL;
|
||||
|
||||
*code = V4L2_MBUS_FMT_YUYV8_2X8;
|
||||
*code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -879,7 +879,7 @@ void cx25840_std_setup(struct i2c_client *client)
|
|||
/* Sets horizontal blanking delay and active lines */
|
||||
cx25840_write(client, 0x470, hblank);
|
||||
cx25840_write(client, 0x471,
|
||||
0xff & (((hblank >> 8) & 0x3) | (hactive << 4)));
|
||||
(((hblank >> 8) & 0x3) | (hactive << 4)) & 0xff);
|
||||
cx25840_write(client, 0x472, hactive >> 4);
|
||||
|
||||
/* Sets burst gate delay */
|
||||
|
@ -888,13 +888,13 @@ void cx25840_std_setup(struct i2c_client *client)
|
|||
/* Sets vertical blanking delay and active duration */
|
||||
cx25840_write(client, 0x474, vblank);
|
||||
cx25840_write(client, 0x475,
|
||||
0xff & (((vblank >> 8) & 0x3) | (vactive << 4)));
|
||||
(((vblank >> 8) & 0x3) | (vactive << 4)) & 0xff);
|
||||
cx25840_write(client, 0x476, vactive >> 4);
|
||||
cx25840_write(client, 0x477, vblank656);
|
||||
|
||||
/* Sets src decimation rate */
|
||||
cx25840_write(client, 0x478, 0xff & src_decimation);
|
||||
cx25840_write(client, 0x479, 0xff & (src_decimation >> 8));
|
||||
cx25840_write(client, 0x478, src_decimation & 0xff);
|
||||
cx25840_write(client, 0x479, (src_decimation >> 8) & 0xff);
|
||||
|
||||
/* Sets Luma and UV Low pass filters */
|
||||
cx25840_write(client, 0x47a, luma_lpf << 6 | ((uv_lpf << 4) & 0x30));
|
||||
|
@ -904,8 +904,8 @@ void cx25840_std_setup(struct i2c_client *client)
|
|||
|
||||
/* Sets SC Step*/
|
||||
cx25840_write(client, 0x47c, sc);
|
||||
cx25840_write(client, 0x47d, 0xff & sc >> 8);
|
||||
cx25840_write(client, 0x47e, 0xff & sc >> 16);
|
||||
cx25840_write(client, 0x47d, (sc >> 8) & 0xff);
|
||||
cx25840_write(client, 0x47e, (sc >> 16) & 0xff);
|
||||
|
||||
/* Sets VBI parameters */
|
||||
if (std & V4L2_STD_625_50) {
|
||||
|
@ -1373,7 +1373,7 @@ static int cx25840_s_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt
|
|||
int HSC, VSC, Vsrc, Hsrc, filter, Vlines;
|
||||
int is_50Hz = !(state->std & V4L2_STD_525_60);
|
||||
|
||||
if (fmt->code != V4L2_MBUS_FMT_FIXED)
|
||||
if (fmt->code != MEDIA_BUS_FMT_FIXED)
|
||||
return -EINVAL;
|
||||
|
||||
fmt->field = V4L2_FIELD_INTERLACED;
|
||||
|
|
|
@ -113,7 +113,7 @@ int cx25840_loadfw(struct i2c_client *client)
|
|||
const u8 *ptr;
|
||||
const char *fwname = get_fw_name(client);
|
||||
int size, retval;
|
||||
int MAX_BUF_SIZE = FWSEND;
|
||||
int max_buf_size = FWSEND;
|
||||
u32 gpio_oe = 0, gpio_da = 0;
|
||||
|
||||
if (is_cx2388x(state)) {
|
||||
|
@ -122,10 +122,9 @@ int cx25840_loadfw(struct i2c_client *client)
|
|||
gpio_da = cx25840_read(client, 0x164);
|
||||
}
|
||||
|
||||
if (is_cx231xx(state) && MAX_BUF_SIZE > 16) {
|
||||
v4l_err(client, " Firmware download size changed to 16 bytes max length\n");
|
||||
MAX_BUF_SIZE = 16; /* cx231xx cannot accept more than 16 bytes at a time */
|
||||
}
|
||||
/* cx231xx cannot accept more than 16 bytes at a time */
|
||||
if (is_cx231xx(state) && max_buf_size > 16)
|
||||
max_buf_size = 16;
|
||||
|
||||
if (request_firmware(&fw, fwname, FWDEV(client)) != 0) {
|
||||
v4l_err(client, "unable to open firmware %s\n", fwname);
|
||||
|
@ -140,7 +139,7 @@ int cx25840_loadfw(struct i2c_client *client)
|
|||
size = fw->size;
|
||||
ptr = fw->data;
|
||||
while (size > 0) {
|
||||
int len = min(MAX_BUF_SIZE - 2, size);
|
||||
int len = min(max_buf_size - 2, size);
|
||||
|
||||
memcpy(buffer + 2, ptr, len);
|
||||
|
||||
|
|
|
@ -464,8 +464,7 @@ static int ir_remove(struct i2c_client *client)
|
|||
cancel_delayed_work_sync(&ir->work);
|
||||
|
||||
/* unregister device */
|
||||
if (ir->rc)
|
||||
rc_unregister_device(ir->rc);
|
||||
rc_unregister_device(ir->rc);
|
||||
|
||||
/* free memory */
|
||||
return 0;
|
||||
|
|
|
@ -57,14 +57,14 @@ static struct v4l2_mbus_framefmt m5mols_default_ffmt[M5MOLS_RESTYPE_MAX] = {
|
|||
[M5MOLS_RESTYPE_MONITOR] = {
|
||||
.width = 1920,
|
||||
.height = 1080,
|
||||
.code = V4L2_MBUS_FMT_VYUY8_2X8,
|
||||
.code = MEDIA_BUS_FMT_VYUY8_2X8,
|
||||
.field = V4L2_FIELD_NONE,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
},
|
||||
[M5MOLS_RESTYPE_CAPTURE] = {
|
||||
.width = 1920,
|
||||
.height = 1080,
|
||||
.code = V4L2_MBUS_FMT_JPEG_1X8,
|
||||
.code = MEDIA_BUS_FMT_JPEG_1X8,
|
||||
.field = V4L2_FIELD_NONE,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
},
|
||||
|
@ -479,7 +479,7 @@ static int m5mols_get_version(struct v4l2_subdev *sd)
|
|||
* __find_restype - Lookup M-5MOLS resolution type according to pixel code
|
||||
* @code: pixel code
|
||||
*/
|
||||
static enum m5mols_restype __find_restype(enum v4l2_mbus_pixelcode code)
|
||||
static enum m5mols_restype __find_restype(u32 code)
|
||||
{
|
||||
enum m5mols_restype type = M5MOLS_RESTYPE_MONITOR;
|
||||
|
||||
|
|
|
@ -192,12 +192,12 @@ static int ml86v7667_g_input_status(struct v4l2_subdev *sd, u32 *status)
|
|||
}
|
||||
|
||||
static int ml86v7667_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index > 0)
|
||||
return -EINVAL;
|
||||
|
||||
*code = V4L2_MBUS_FMT_YUYV8_2X8;
|
||||
*code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -207,7 +207,7 @@ static int ml86v7667_mbus_fmt(struct v4l2_subdev *sd,
|
|||
{
|
||||
struct ml86v7667_priv *priv = to_ml86v7667(sd);
|
||||
|
||||
fmt->code = V4L2_MBUS_FMT_YUYV8_2X8;
|
||||
fmt->code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
fmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
/* The top field is always transferred first by the chip */
|
||||
fmt->field = V4L2_FIELD_INTERLACED_TB;
|
||||
|
|
|
@ -323,7 +323,7 @@ static int mt9m032_enum_mbus_code(struct v4l2_subdev *subdev,
|
|||
if (code->index != 0)
|
||||
return -EINVAL;
|
||||
|
||||
code->code = V4L2_MBUS_FMT_Y8_1X8;
|
||||
code->code = MEDIA_BUS_FMT_Y8_1X8;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -331,7 +331,7 @@ static int mt9m032_enum_frame_size(struct v4l2_subdev *subdev,
|
|||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_frame_size_enum *fse)
|
||||
{
|
||||
if (fse->index != 0 || fse->code != V4L2_MBUS_FMT_Y8_1X8)
|
||||
if (fse->index != 0 || fse->code != MEDIA_BUS_FMT_Y8_1X8)
|
||||
return -EINVAL;
|
||||
|
||||
fse->min_width = MT9M032_COLUMN_SIZE_DEF;
|
||||
|
@ -759,7 +759,7 @@ static int mt9m032_probe(struct i2c_client *client,
|
|||
|
||||
sensor->format.width = sensor->crop.width;
|
||||
sensor->format.height = sensor->crop.height;
|
||||
sensor->format.code = V4L2_MBUS_FMT_Y8_1X8;
|
||||
sensor->format.code = MEDIA_BUS_FMT_Y8_1X8;
|
||||
sensor->format.field = V4L2_FIELD_NONE;
|
||||
sensor->format.colorspace = V4L2_COLORSPACE_SRGB;
|
||||
|
||||
|
|
|
@ -950,9 +950,9 @@ static int mt9p031_open(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
|
|||
format = v4l2_subdev_get_try_format(fh, 0);
|
||||
|
||||
if (mt9p031->model == MT9P031_MODEL_MONOCHROME)
|
||||
format->code = V4L2_MBUS_FMT_Y12_1X12;
|
||||
format->code = MEDIA_BUS_FMT_Y12_1X12;
|
||||
else
|
||||
format->code = V4L2_MBUS_FMT_SGRBG12_1X12;
|
||||
format->code = MEDIA_BUS_FMT_SGRBG12_1X12;
|
||||
|
||||
format->width = MT9P031_WINDOW_WIDTH_DEF;
|
||||
format->height = MT9P031_WINDOW_HEIGHT_DEF;
|
||||
|
@ -1120,9 +1120,9 @@ static int mt9p031_probe(struct i2c_client *client,
|
|||
mt9p031->crop.top = MT9P031_ROW_START_DEF;
|
||||
|
||||
if (mt9p031->model == MT9P031_MODEL_MONOCHROME)
|
||||
mt9p031->format.code = V4L2_MBUS_FMT_Y12_1X12;
|
||||
mt9p031->format.code = MEDIA_BUS_FMT_Y12_1X12;
|
||||
else
|
||||
mt9p031->format.code = V4L2_MBUS_FMT_SGRBG12_1X12;
|
||||
mt9p031->format.code = MEDIA_BUS_FMT_SGRBG12_1X12;
|
||||
|
||||
mt9p031->format.width = MT9P031_WINDOW_WIDTH_DEF;
|
||||
mt9p031->format.height = MT9P031_WINDOW_HEIGHT_DEF;
|
||||
|
|
|
@ -333,7 +333,7 @@ static int mt9t001_enum_mbus_code(struct v4l2_subdev *subdev,
|
|||
if (code->index > 0)
|
||||
return -EINVAL;
|
||||
|
||||
code->code = V4L2_MBUS_FMT_SGRBG10_1X10;
|
||||
code->code = MEDIA_BUS_FMT_SGRBG10_1X10;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -341,7 +341,7 @@ static int mt9t001_enum_frame_size(struct v4l2_subdev *subdev,
|
|||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_frame_size_enum *fse)
|
||||
{
|
||||
if (fse->index >= 8 || fse->code != V4L2_MBUS_FMT_SGRBG10_1X10)
|
||||
if (fse->index >= 8 || fse->code != MEDIA_BUS_FMT_SGRBG10_1X10)
|
||||
return -EINVAL;
|
||||
|
||||
fse->min_width = (MT9T001_WINDOW_WIDTH_DEF + 1) / fse->index;
|
||||
|
@ -792,7 +792,7 @@ static int mt9t001_open(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
|
|||
crop->height = MT9T001_WINDOW_HEIGHT_DEF + 1;
|
||||
|
||||
format = v4l2_subdev_get_try_format(fh, 0);
|
||||
format->code = V4L2_MBUS_FMT_SGRBG10_1X10;
|
||||
format->code = MEDIA_BUS_FMT_SGRBG10_1X10;
|
||||
format->width = MT9T001_WINDOW_WIDTH_DEF + 1;
|
||||
format->height = MT9T001_WINDOW_HEIGHT_DEF + 1;
|
||||
format->field = V4L2_FIELD_NONE;
|
||||
|
@ -917,7 +917,7 @@ static int mt9t001_probe(struct i2c_client *client,
|
|||
mt9t001->crop.width = MT9T001_WINDOW_WIDTH_DEF + 1;
|
||||
mt9t001->crop.height = MT9T001_WINDOW_HEIGHT_DEF + 1;
|
||||
|
||||
mt9t001->format.code = V4L2_MBUS_FMT_SGRBG10_1X10;
|
||||
mt9t001->format.code = MEDIA_BUS_FMT_SGRBG10_1X10;
|
||||
mt9t001->format.width = MT9T001_WINDOW_WIDTH_DEF + 1;
|
||||
mt9t001->format.height = MT9T001_WINDOW_HEIGHT_DEF + 1;
|
||||
mt9t001->format.field = V4L2_FIELD_NONE;
|
||||
|
|
|
@ -325,18 +325,18 @@ static int mt9v011_reset(struct v4l2_subdev *sd, u32 val)
|
|||
}
|
||||
|
||||
static int mt9v011_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index > 0)
|
||||
return -EINVAL;
|
||||
|
||||
*code = V4L2_MBUS_FMT_SGRBG8_1X8;
|
||||
*code = MEDIA_BUS_FMT_SGRBG8_1X8;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mt9v011_try_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *fmt)
|
||||
{
|
||||
if (fmt->code != V4L2_MBUS_FMT_SGRBG8_1X8)
|
||||
if (fmt->code != MEDIA_BUS_FMT_SGRBG8_1X8)
|
||||
return -EINVAL;
|
||||
|
||||
v4l_bound_align_image(&fmt->width, 48, 639, 1,
|
||||
|
|
|
@ -454,7 +454,7 @@ static int mt9v032_enum_mbus_code(struct v4l2_subdev *subdev,
|
|||
if (code->index > 0)
|
||||
return -EINVAL;
|
||||
|
||||
code->code = V4L2_MBUS_FMT_SGRBG10_1X10;
|
||||
code->code = MEDIA_BUS_FMT_SGRBG10_1X10;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -462,7 +462,7 @@ static int mt9v032_enum_frame_size(struct v4l2_subdev *subdev,
|
|||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_frame_size_enum *fse)
|
||||
{
|
||||
if (fse->index >= 3 || fse->code != V4L2_MBUS_FMT_SGRBG10_1X10)
|
||||
if (fse->index >= 3 || fse->code != MEDIA_BUS_FMT_SGRBG10_1X10)
|
||||
return -EINVAL;
|
||||
|
||||
fse->min_width = MT9V032_WINDOW_WIDTH_DEF / (1 << fse->index);
|
||||
|
@ -814,9 +814,9 @@ static int mt9v032_open(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
|
|||
format = v4l2_subdev_get_try_format(fh, 0);
|
||||
|
||||
if (mt9v032->model->color)
|
||||
format->code = V4L2_MBUS_FMT_SGRBG10_1X10;
|
||||
format->code = MEDIA_BUS_FMT_SGRBG10_1X10;
|
||||
else
|
||||
format->code = V4L2_MBUS_FMT_Y10_1X10;
|
||||
format->code = MEDIA_BUS_FMT_Y10_1X10;
|
||||
|
||||
format->width = MT9V032_WINDOW_WIDTH_DEF;
|
||||
format->height = MT9V032_WINDOW_HEIGHT_DEF;
|
||||
|
@ -966,9 +966,9 @@ static int mt9v032_probe(struct i2c_client *client,
|
|||
mt9v032->crop.height = MT9V032_WINDOW_HEIGHT_DEF;
|
||||
|
||||
if (mt9v032->model->color)
|
||||
mt9v032->format.code = V4L2_MBUS_FMT_SGRBG10_1X10;
|
||||
mt9v032->format.code = MEDIA_BUS_FMT_SGRBG10_1X10;
|
||||
else
|
||||
mt9v032->format.code = V4L2_MBUS_FMT_Y10_1X10;
|
||||
mt9v032->format.code = MEDIA_BUS_FMT_Y10_1X10;
|
||||
|
||||
mt9v032->format.width = MT9V032_WINDOW_WIDTH_DEF;
|
||||
mt9v032->format.height = MT9V032_WINDOW_HEIGHT_DEF;
|
||||
|
|
|
@ -112,7 +112,7 @@ MODULE_PARM_DESC(debug, "Enable module debug trace. Set to 1 to enable.");
|
|||
#define REG_TERM 0xFFFF
|
||||
|
||||
struct noon010_format {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
u16 ispctl1_reg;
|
||||
};
|
||||
|
@ -175,23 +175,23 @@ static const struct noon010_frmsize noon010_sizes[] = {
|
|||
/* Supported pixel formats. */
|
||||
static const struct noon010_format noon010_formats[] = {
|
||||
{
|
||||
.code = V4L2_MBUS_FMT_YUYV8_2X8,
|
||||
.code = MEDIA_BUS_FMT_YUYV8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.ispctl1_reg = 0x03,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_YVYU8_2X8,
|
||||
.code = MEDIA_BUS_FMT_YVYU8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.ispctl1_reg = 0x02,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_VYUY8_2X8,
|
||||
.code = MEDIA_BUS_FMT_VYUY8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.ispctl1_reg = 0,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
.code = MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.ispctl1_reg = 0x01,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_RGB565_2X8_BE,
|
||||
.code = MEDIA_BUS_FMT_RGB565_2X8_BE,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.ispctl1_reg = 0x40,
|
||||
},
|
||||
|
|
|
@ -632,31 +632,31 @@ static int ov7670_detect(struct v4l2_subdev *sd)
|
|||
* The magic matrix numbers come from OmniVision.
|
||||
*/
|
||||
static struct ov7670_format_struct {
|
||||
enum v4l2_mbus_pixelcode mbus_code;
|
||||
u32 mbus_code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
struct regval_list *regs;
|
||||
int cmatrix[CMATRIX_LEN];
|
||||
} ov7670_formats[] = {
|
||||
{
|
||||
.mbus_code = V4L2_MBUS_FMT_YUYV8_2X8,
|
||||
.mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.regs = ov7670_fmt_yuv422,
|
||||
.cmatrix = { 128, -128, 0, -34, -94, 128 },
|
||||
},
|
||||
{
|
||||
.mbus_code = V4L2_MBUS_FMT_RGB444_2X8_PADHI_LE,
|
||||
.mbus_code = MEDIA_BUS_FMT_RGB444_2X8_PADHI_LE,
|
||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||
.regs = ov7670_fmt_rgb444,
|
||||
.cmatrix = { 179, -179, 0, -61, -176, 228 },
|
||||
},
|
||||
{
|
||||
.mbus_code = V4L2_MBUS_FMT_RGB565_2X8_LE,
|
||||
.mbus_code = MEDIA_BUS_FMT_RGB565_2X8_LE,
|
||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||
.regs = ov7670_fmt_rgb565,
|
||||
.cmatrix = { 179, -179, 0, -61, -176, 228 },
|
||||
},
|
||||
{
|
||||
.mbus_code = V4L2_MBUS_FMT_SBGGR8_1X8,
|
||||
.mbus_code = MEDIA_BUS_FMT_SBGGR8_1X8,
|
||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||
.regs = ov7670_fmt_raw,
|
||||
.cmatrix = { 0, 0, 0, 0, 0, 0 },
|
||||
|
@ -772,7 +772,7 @@ static void ov7675_get_framerate(struct v4l2_subdev *sd,
|
|||
pll_factor = PLL_FACTOR;
|
||||
|
||||
clkrc++;
|
||||
if (info->fmt->mbus_code == V4L2_MBUS_FMT_SBGGR8_1X8)
|
||||
if (info->fmt->mbus_code == MEDIA_BUS_FMT_SBGGR8_1X8)
|
||||
clkrc = (clkrc >> 1);
|
||||
|
||||
tpf->numerator = 1;
|
||||
|
@ -810,7 +810,7 @@ static int ov7675_set_framerate(struct v4l2_subdev *sd,
|
|||
} else {
|
||||
clkrc = (5 * pll_factor * info->clock_speed * tpf->numerator) /
|
||||
(4 * tpf->denominator);
|
||||
if (info->fmt->mbus_code == V4L2_MBUS_FMT_SBGGR8_1X8)
|
||||
if (info->fmt->mbus_code == MEDIA_BUS_FMT_SBGGR8_1X8)
|
||||
clkrc = (clkrc << 1);
|
||||
clkrc--;
|
||||
}
|
||||
|
@ -900,7 +900,7 @@ static int ov7670_set_hw(struct v4l2_subdev *sd, int hstart, int hstop,
|
|||
|
||||
|
||||
static int ov7670_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index >= N_OV7670_FMTS)
|
||||
return -EINVAL;
|
||||
|
|
|
@ -384,17 +384,17 @@ static const struct ov965x_framesize ov965x_framesizes[] = {
|
|||
};
|
||||
|
||||
struct ov965x_pixfmt {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
u32 colorspace;
|
||||
/* REG_TSLB value, only bits [3:2] may be set. */
|
||||
u8 tslb_reg;
|
||||
};
|
||||
|
||||
static const struct ov965x_pixfmt ov965x_formats[] = {
|
||||
{ V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG, 0x00},
|
||||
{ V4L2_MBUS_FMT_YVYU8_2X8, V4L2_COLORSPACE_JPEG, 0x04},
|
||||
{ V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG, 0x0c},
|
||||
{ V4L2_MBUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_JPEG, 0x08},
|
||||
{ MEDIA_BUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG, 0x00},
|
||||
{ MEDIA_BUS_FMT_YVYU8_2X8, V4L2_COLORSPACE_JPEG, 0x04},
|
||||
{ MEDIA_BUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG, 0x0c},
|
||||
{ MEDIA_BUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_JPEG, 0x08},
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -27,8 +27,8 @@
|
|||
|
||||
#define DRIVER_NAME "S5C73M3"
|
||||
|
||||
#define S5C73M3_ISP_FMT V4L2_MBUS_FMT_VYUY8_2X8
|
||||
#define S5C73M3_JPEG_FMT V4L2_MBUS_FMT_S5C_UYVY_JPEG_1X8
|
||||
#define S5C73M3_ISP_FMT MEDIA_BUS_FMT_VYUY8_2X8
|
||||
#define S5C73M3_JPEG_FMT MEDIA_BUS_FMT_S5C_UYVY_JPEG_1X8
|
||||
|
||||
/* Subdevs pad index definitions */
|
||||
enum s5c73m3_pads {
|
||||
|
@ -402,7 +402,7 @@ struct s5c73m3 {
|
|||
|
||||
const struct s5c73m3_frame_size *sensor_pix_size[2];
|
||||
const struct s5c73m3_frame_size *oif_pix_size[2];
|
||||
enum v4l2_mbus_pixelcode mbus_code;
|
||||
u32 mbus_code;
|
||||
|
||||
const struct s5c73m3_interval *fiv;
|
||||
|
||||
|
|
|
@ -151,7 +151,7 @@ static const struct s5k4ecgx_frmsize s5k4ecgx_prev_sizes[] = {
|
|||
#define S5K4ECGX_NUM_PREV ARRAY_SIZE(s5k4ecgx_prev_sizes)
|
||||
|
||||
struct s5k4ecgx_pixfmt {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
u32 colorspace;
|
||||
/* REG_TC_PCFG_Format register value */
|
||||
u16 reg_p_format;
|
||||
|
@ -159,7 +159,7 @@ struct s5k4ecgx_pixfmt {
|
|||
|
||||
/* By default value, output from sensor will be YUV422 0-255 */
|
||||
static const struct s5k4ecgx_pixfmt s5k4ecgx_formats[] = {
|
||||
{ V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG, 5 },
|
||||
{ MEDIA_BUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG, 5 },
|
||||
};
|
||||
|
||||
static const char * const s5k4ecgx_supply_names[] = {
|
||||
|
|
|
@ -248,7 +248,7 @@ enum s5k5baf_gpio_id {
|
|||
#define NUM_ISP_PADS 2
|
||||
|
||||
struct s5k5baf_pixfmt {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
u32 colorspace;
|
||||
/* REG_P_FMT(x) register value */
|
||||
u16 reg_p_fmt;
|
||||
|
@ -331,10 +331,10 @@ struct s5k5baf {
|
|||
};
|
||||
|
||||
static const struct s5k5baf_pixfmt s5k5baf_formats[] = {
|
||||
{ V4L2_MBUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_JPEG, 5 },
|
||||
{ MEDIA_BUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_JPEG, 5 },
|
||||
/* range 16-240 */
|
||||
{ V4L2_MBUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_REC709, 6 },
|
||||
{ V4L2_MBUS_FMT_RGB565_2X8_BE, V4L2_COLORSPACE_JPEG, 0 },
|
||||
{ MEDIA_BUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_REC709, 6 },
|
||||
{ MEDIA_BUS_FMT_RGB565_2X8_BE, V4L2_COLORSPACE_JPEG, 0 },
|
||||
};
|
||||
|
||||
static struct v4l2_rect s5k5baf_cis_rect = {
|
||||
|
@ -1206,7 +1206,7 @@ static int s5k5baf_enum_mbus_code(struct v4l2_subdev *sd,
|
|||
if (code->pad == PAD_CIS) {
|
||||
if (code->index > 0)
|
||||
return -EINVAL;
|
||||
code->code = V4L2_MBUS_FMT_FIXED;
|
||||
code->code = MEDIA_BUS_FMT_FIXED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1227,7 +1227,7 @@ static int s5k5baf_enum_frame_size(struct v4l2_subdev *sd,
|
|||
return -EINVAL;
|
||||
|
||||
if (fse->pad == PAD_CIS) {
|
||||
fse->code = V4L2_MBUS_FMT_FIXED;
|
||||
fse->code = MEDIA_BUS_FMT_FIXED;
|
||||
fse->min_width = S5K5BAF_CIS_WIDTH;
|
||||
fse->max_width = S5K5BAF_CIS_WIDTH;
|
||||
fse->min_height = S5K5BAF_CIS_HEIGHT;
|
||||
|
@ -1252,7 +1252,7 @@ static void s5k5baf_try_cis_format(struct v4l2_mbus_framefmt *mf)
|
|||
{
|
||||
mf->width = S5K5BAF_CIS_WIDTH;
|
||||
mf->height = S5K5BAF_CIS_HEIGHT;
|
||||
mf->code = V4L2_MBUS_FMT_FIXED;
|
||||
mf->code = MEDIA_BUS_FMT_FIXED;
|
||||
mf->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
mf->field = V4L2_FIELD_NONE;
|
||||
}
|
||||
|
|
|
@ -80,7 +80,7 @@ static inline struct s5k6a3 *sd_to_s5k6a3(struct v4l2_subdev *sd)
|
|||
|
||||
static const struct v4l2_mbus_framefmt s5k6a3_formats[] = {
|
||||
{
|
||||
.code = V4L2_MBUS_FMT_SGRBG10_1X10,
|
||||
.code = MEDIA_BUS_FMT_SGRBG10_1X10,
|
||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||
.field = V4L2_FIELD_NONE,
|
||||
}
|
||||
|
|
|
@ -191,7 +191,7 @@ struct s5k6aa_regval {
|
|||
};
|
||||
|
||||
struct s5k6aa_pixfmt {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
u32 colorspace;
|
||||
/* REG_P_FMT(x) register value */
|
||||
u16 reg_p_fmt;
|
||||
|
@ -285,10 +285,10 @@ static struct s5k6aa_regval s5k6aa_analog_config[] = {
|
|||
|
||||
/* TODO: Add RGB888 and Bayer format */
|
||||
static const struct s5k6aa_pixfmt s5k6aa_formats[] = {
|
||||
{ V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG, 5 },
|
||||
{ MEDIA_BUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG, 5 },
|
||||
/* range 16-240 */
|
||||
{ V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_REC709, 6 },
|
||||
{ V4L2_MBUS_FMT_RGB565_2X8_BE, V4L2_COLORSPACE_JPEG, 0 },
|
||||
{ MEDIA_BUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_REC709, 6 },
|
||||
{ MEDIA_BUS_FMT_RGB565_2X8_BE, V4L2_COLORSPACE_JPEG, 0 },
|
||||
};
|
||||
|
||||
static const struct s5k6aa_interval s5k6aa_intervals[] = {
|
||||
|
|
|
@ -562,7 +562,7 @@ static int saa6752hs_g_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefm
|
|||
h->video_format = SAA6752HS_VF_D1;
|
||||
f->width = v4l2_format_table[h->video_format].fmt.pix.width;
|
||||
f->height = v4l2_format_table[h->video_format].fmt.pix.height;
|
||||
f->code = V4L2_MBUS_FMT_FIXED;
|
||||
f->code = MEDIA_BUS_FMT_FIXED;
|
||||
f->field = V4L2_FIELD_INTERLACED;
|
||||
f->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
return 0;
|
||||
|
@ -572,7 +572,7 @@ static int saa6752hs_try_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_frame
|
|||
{
|
||||
int dist_352, dist_480, dist_720;
|
||||
|
||||
f->code = V4L2_MBUS_FMT_FIXED;
|
||||
f->code = MEDIA_BUS_FMT_FIXED;
|
||||
|
||||
dist_352 = abs(f->width - 352);
|
||||
dist_480 = abs(f->width - 480);
|
||||
|
@ -599,7 +599,7 @@ static int saa6752hs_s_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefm
|
|||
{
|
||||
struct saa6752hs_state *h = to_state(sd);
|
||||
|
||||
if (f->code != V4L2_MBUS_FMT_FIXED)
|
||||
if (f->code != MEDIA_BUS_FMT_FIXED)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
|
|
|
@ -1172,7 +1172,7 @@ static int saa711x_s_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_f
|
|||
|
||||
static int saa711x_s_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *fmt)
|
||||
{
|
||||
if (fmt->code != V4L2_MBUS_FMT_FIXED)
|
||||
if (fmt->code != MEDIA_BUS_FMT_FIXED)
|
||||
return -EINVAL;
|
||||
fmt->field = V4L2_FIELD_INTERLACED;
|
||||
fmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
|
|
|
@ -998,7 +998,7 @@ static int saa717x_s_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt
|
|||
|
||||
v4l2_dbg(1, debug, sd, "decoder set size\n");
|
||||
|
||||
if (fmt->code != V4L2_MBUS_FMT_FIXED)
|
||||
if (fmt->code != MEDIA_BUS_FMT_FIXED)
|
||||
return -EINVAL;
|
||||
|
||||
/* FIXME need better bounds checking here */
|
||||
|
|
|
@ -65,264 +65,36 @@ static int bounds_check(struct device *dev, uint32_t val,
|
|||
|
||||
static void print_pll(struct device *dev, struct smiapp_pll *pll)
|
||||
{
|
||||
dev_dbg(dev, "pre_pll_clk_div\t%d\n", pll->pre_pll_clk_div);
|
||||
dev_dbg(dev, "pll_multiplier \t%d\n", pll->pll_multiplier);
|
||||
if (pll->flags != SMIAPP_PLL_FLAG_NO_OP_CLOCKS) {
|
||||
dev_dbg(dev, "op_sys_clk_div \t%d\n", pll->op_sys_clk_div);
|
||||
dev_dbg(dev, "op_pix_clk_div \t%d\n", pll->op_pix_clk_div);
|
||||
dev_dbg(dev, "pre_pll_clk_div\t%u\n", pll->pre_pll_clk_div);
|
||||
dev_dbg(dev, "pll_multiplier \t%u\n", pll->pll_multiplier);
|
||||
if (!(pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS)) {
|
||||
dev_dbg(dev, "op_sys_clk_div \t%u\n", pll->op.sys_clk_div);
|
||||
dev_dbg(dev, "op_pix_clk_div \t%u\n", pll->op.pix_clk_div);
|
||||
}
|
||||
dev_dbg(dev, "vt_sys_clk_div \t%d\n", pll->vt_sys_clk_div);
|
||||
dev_dbg(dev, "vt_pix_clk_div \t%d\n", pll->vt_pix_clk_div);
|
||||
dev_dbg(dev, "vt_sys_clk_div \t%u\n", pll->vt.sys_clk_div);
|
||||
dev_dbg(dev, "vt_pix_clk_div \t%u\n", pll->vt.pix_clk_div);
|
||||
|
||||
dev_dbg(dev, "ext_clk_freq_hz \t%d\n", pll->ext_clk_freq_hz);
|
||||
dev_dbg(dev, "pll_ip_clk_freq_hz \t%d\n", pll->pll_ip_clk_freq_hz);
|
||||
dev_dbg(dev, "pll_op_clk_freq_hz \t%d\n", pll->pll_op_clk_freq_hz);
|
||||
if (pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS) {
|
||||
dev_dbg(dev, "op_sys_clk_freq_hz \t%d\n",
|
||||
pll->op_sys_clk_freq_hz);
|
||||
dev_dbg(dev, "op_pix_clk_freq_hz \t%d\n",
|
||||
pll->op_pix_clk_freq_hz);
|
||||
dev_dbg(dev, "ext_clk_freq_hz \t%u\n", pll->ext_clk_freq_hz);
|
||||
dev_dbg(dev, "pll_ip_clk_freq_hz \t%u\n", pll->pll_ip_clk_freq_hz);
|
||||
dev_dbg(dev, "pll_op_clk_freq_hz \t%u\n", pll->pll_op_clk_freq_hz);
|
||||
if (!(pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS)) {
|
||||
dev_dbg(dev, "op_sys_clk_freq_hz \t%u\n",
|
||||
pll->op.sys_clk_freq_hz);
|
||||
dev_dbg(dev, "op_pix_clk_freq_hz \t%u\n",
|
||||
pll->op.pix_clk_freq_hz);
|
||||
}
|
||||
dev_dbg(dev, "vt_sys_clk_freq_hz \t%d\n", pll->vt_sys_clk_freq_hz);
|
||||
dev_dbg(dev, "vt_pix_clk_freq_hz \t%d\n", pll->vt_pix_clk_freq_hz);
|
||||
dev_dbg(dev, "vt_sys_clk_freq_hz \t%u\n", pll->vt.sys_clk_freq_hz);
|
||||
dev_dbg(dev, "vt_pix_clk_freq_hz \t%u\n", pll->vt.pix_clk_freq_hz);
|
||||
}
|
||||
|
||||
/*
|
||||
* Heuristically guess the PLL tree for a given common multiplier and
|
||||
* divisor. Begin with the operational timing and continue to video
|
||||
* timing once operational timing has been verified.
|
||||
*
|
||||
* @mul is the PLL multiplier and @div is the common divisor
|
||||
* (pre_pll_clk_div and op_sys_clk_div combined). The final PLL
|
||||
* multiplier will be a multiple of @mul.
|
||||
*
|
||||
* @return Zero on success, error code on error.
|
||||
*/
|
||||
static int __smiapp_pll_calculate(struct device *dev,
|
||||
const struct smiapp_pll_limits *limits,
|
||||
struct smiapp_pll *pll, uint32_t mul,
|
||||
uint32_t div, uint32_t lane_op_clock_ratio)
|
||||
static int check_all_bounds(struct device *dev,
|
||||
const struct smiapp_pll_limits *limits,
|
||||
const struct smiapp_pll_branch_limits *op_limits,
|
||||
struct smiapp_pll *pll,
|
||||
struct smiapp_pll_branch *op_pll)
|
||||
{
|
||||
uint32_t sys_div;
|
||||
uint32_t best_pix_div = INT_MAX >> 1;
|
||||
uint32_t vt_op_binning_div;
|
||||
/*
|
||||
* Higher multipliers (and divisors) are often required than
|
||||
* necessitated by the external clock and the output clocks.
|
||||
* There are limits for all values in the clock tree. These
|
||||
* are the minimum and maximum multiplier for mul.
|
||||
*/
|
||||
uint32_t more_mul_min, more_mul_max;
|
||||
uint32_t more_mul_factor;
|
||||
uint32_t min_vt_div, max_vt_div, vt_div;
|
||||
uint32_t min_sys_div, max_sys_div;
|
||||
unsigned int i;
|
||||
int rval;
|
||||
|
||||
/*
|
||||
* Get pre_pll_clk_div so that our pll_op_clk_freq_hz won't be
|
||||
* too high.
|
||||
*/
|
||||
dev_dbg(dev, "pre_pll_clk_div %d\n", pll->pre_pll_clk_div);
|
||||
|
||||
/* Don't go above max pll multiplier. */
|
||||
more_mul_max = limits->max_pll_multiplier / mul;
|
||||
dev_dbg(dev, "more_mul_max: max_pll_multiplier check: %d\n",
|
||||
more_mul_max);
|
||||
/* Don't go above max pll op frequency. */
|
||||
more_mul_max =
|
||||
min_t(uint32_t,
|
||||
more_mul_max,
|
||||
limits->max_pll_op_freq_hz
|
||||
/ (pll->ext_clk_freq_hz / pll->pre_pll_clk_div * mul));
|
||||
dev_dbg(dev, "more_mul_max: max_pll_op_freq_hz check: %d\n",
|
||||
more_mul_max);
|
||||
/* Don't go above the division capability of op sys clock divider. */
|
||||
more_mul_max = min(more_mul_max,
|
||||
limits->op.max_sys_clk_div * pll->pre_pll_clk_div
|
||||
/ div);
|
||||
dev_dbg(dev, "more_mul_max: max_op_sys_clk_div check: %d\n",
|
||||
more_mul_max);
|
||||
/* Ensure we won't go above min_pll_multiplier. */
|
||||
more_mul_max = min(more_mul_max,
|
||||
DIV_ROUND_UP(limits->max_pll_multiplier, mul));
|
||||
dev_dbg(dev, "more_mul_max: min_pll_multiplier check: %d\n",
|
||||
more_mul_max);
|
||||
|
||||
/* Ensure we won't go below min_pll_op_freq_hz. */
|
||||
more_mul_min = DIV_ROUND_UP(limits->min_pll_op_freq_hz,
|
||||
pll->ext_clk_freq_hz / pll->pre_pll_clk_div
|
||||
* mul);
|
||||
dev_dbg(dev, "more_mul_min: min_pll_op_freq_hz check: %d\n",
|
||||
more_mul_min);
|
||||
/* Ensure we won't go below min_pll_multiplier. */
|
||||
more_mul_min = max(more_mul_min,
|
||||
DIV_ROUND_UP(limits->min_pll_multiplier, mul));
|
||||
dev_dbg(dev, "more_mul_min: min_pll_multiplier check: %d\n",
|
||||
more_mul_min);
|
||||
|
||||
if (more_mul_min > more_mul_max) {
|
||||
dev_dbg(dev,
|
||||
"unable to compute more_mul_min and more_mul_max\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
more_mul_factor = lcm(div, pll->pre_pll_clk_div) / div;
|
||||
dev_dbg(dev, "more_mul_factor: %d\n", more_mul_factor);
|
||||
more_mul_factor = lcm(more_mul_factor, limits->op.min_sys_clk_div);
|
||||
dev_dbg(dev, "more_mul_factor: min_op_sys_clk_div: %d\n",
|
||||
more_mul_factor);
|
||||
i = roundup(more_mul_min, more_mul_factor);
|
||||
if (!is_one_or_even(i))
|
||||
i <<= 1;
|
||||
|
||||
dev_dbg(dev, "final more_mul: %d\n", i);
|
||||
if (i > more_mul_max) {
|
||||
dev_dbg(dev, "final more_mul is bad, max %d\n", more_mul_max);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pll->pll_multiplier = mul * i;
|
||||
pll->op_sys_clk_div = div * i / pll->pre_pll_clk_div;
|
||||
dev_dbg(dev, "op_sys_clk_div: %d\n", pll->op_sys_clk_div);
|
||||
|
||||
pll->pll_ip_clk_freq_hz = pll->ext_clk_freq_hz
|
||||
/ pll->pre_pll_clk_div;
|
||||
|
||||
pll->pll_op_clk_freq_hz = pll->pll_ip_clk_freq_hz
|
||||
* pll->pll_multiplier;
|
||||
|
||||
/* Derive pll_op_clk_freq_hz. */
|
||||
pll->op_sys_clk_freq_hz =
|
||||
pll->pll_op_clk_freq_hz / pll->op_sys_clk_div;
|
||||
|
||||
pll->op_pix_clk_div = pll->bits_per_pixel;
|
||||
dev_dbg(dev, "op_pix_clk_div: %d\n", pll->op_pix_clk_div);
|
||||
|
||||
pll->op_pix_clk_freq_hz =
|
||||
pll->op_sys_clk_freq_hz / pll->op_pix_clk_div;
|
||||
|
||||
/*
|
||||
* Some sensors perform analogue binning and some do this
|
||||
* digitally. The ones doing this digitally can be roughly be
|
||||
* found out using this formula. The ones doing this digitally
|
||||
* should run at higher clock rate, so smaller divisor is used
|
||||
* on video timing side.
|
||||
*/
|
||||
if (limits->min_line_length_pck_bin > limits->min_line_length_pck
|
||||
/ pll->binning_horizontal)
|
||||
vt_op_binning_div = pll->binning_horizontal;
|
||||
else
|
||||
vt_op_binning_div = 1;
|
||||
dev_dbg(dev, "vt_op_binning_div: %d\n", vt_op_binning_div);
|
||||
|
||||
/*
|
||||
* Profile 2 supports vt_pix_clk_div E [4, 10]
|
||||
*
|
||||
* Horizontal binning can be used as a base for difference in
|
||||
* divisors. One must make sure that horizontal blanking is
|
||||
* enough to accommodate the CSI-2 sync codes.
|
||||
*
|
||||
* Take scaling factor into account as well.
|
||||
*
|
||||
* Find absolute limits for the factor of vt divider.
|
||||
*/
|
||||
dev_dbg(dev, "scale_m: %d\n", pll->scale_m);
|
||||
min_vt_div = DIV_ROUND_UP(pll->op_pix_clk_div * pll->op_sys_clk_div
|
||||
* pll->scale_n,
|
||||
lane_op_clock_ratio * vt_op_binning_div
|
||||
* pll->scale_m);
|
||||
|
||||
/* Find smallest and biggest allowed vt divisor. */
|
||||
dev_dbg(dev, "min_vt_div: %d\n", min_vt_div);
|
||||
min_vt_div = max(min_vt_div,
|
||||
DIV_ROUND_UP(pll->pll_op_clk_freq_hz,
|
||||
limits->vt.max_pix_clk_freq_hz));
|
||||
dev_dbg(dev, "min_vt_div: max_vt_pix_clk_freq_hz: %d\n",
|
||||
min_vt_div);
|
||||
min_vt_div = max_t(uint32_t, min_vt_div,
|
||||
limits->vt.min_pix_clk_div
|
||||
* limits->vt.min_sys_clk_div);
|
||||
dev_dbg(dev, "min_vt_div: min_vt_clk_div: %d\n", min_vt_div);
|
||||
|
||||
max_vt_div = limits->vt.max_sys_clk_div * limits->vt.max_pix_clk_div;
|
||||
dev_dbg(dev, "max_vt_div: %d\n", max_vt_div);
|
||||
max_vt_div = min(max_vt_div,
|
||||
DIV_ROUND_UP(pll->pll_op_clk_freq_hz,
|
||||
limits->vt.min_pix_clk_freq_hz));
|
||||
dev_dbg(dev, "max_vt_div: min_vt_pix_clk_freq_hz: %d\n",
|
||||
max_vt_div);
|
||||
|
||||
/*
|
||||
* Find limitsits for sys_clk_div. Not all values are possible
|
||||
* with all values of pix_clk_div.
|
||||
*/
|
||||
min_sys_div = limits->vt.min_sys_clk_div;
|
||||
dev_dbg(dev, "min_sys_div: %d\n", min_sys_div);
|
||||
min_sys_div = max(min_sys_div,
|
||||
DIV_ROUND_UP(min_vt_div,
|
||||
limits->vt.max_pix_clk_div));
|
||||
dev_dbg(dev, "min_sys_div: max_vt_pix_clk_div: %d\n", min_sys_div);
|
||||
min_sys_div = max(min_sys_div,
|
||||
pll->pll_op_clk_freq_hz
|
||||
/ limits->vt.max_sys_clk_freq_hz);
|
||||
dev_dbg(dev, "min_sys_div: max_pll_op_clk_freq_hz: %d\n", min_sys_div);
|
||||
min_sys_div = clk_div_even_up(min_sys_div);
|
||||
dev_dbg(dev, "min_sys_div: one or even: %d\n", min_sys_div);
|
||||
|
||||
max_sys_div = limits->vt.max_sys_clk_div;
|
||||
dev_dbg(dev, "max_sys_div: %d\n", max_sys_div);
|
||||
max_sys_div = min(max_sys_div,
|
||||
DIV_ROUND_UP(max_vt_div,
|
||||
limits->vt.min_pix_clk_div));
|
||||
dev_dbg(dev, "max_sys_div: min_vt_pix_clk_div: %d\n", max_sys_div);
|
||||
max_sys_div = min(max_sys_div,
|
||||
DIV_ROUND_UP(pll->pll_op_clk_freq_hz,
|
||||
limits->vt.min_pix_clk_freq_hz));
|
||||
dev_dbg(dev, "max_sys_div: min_vt_pix_clk_freq_hz: %d\n", max_sys_div);
|
||||
|
||||
/*
|
||||
* Find pix_div such that a legal pix_div * sys_div results
|
||||
* into a value which is not smaller than div, the desired
|
||||
* divisor.
|
||||
*/
|
||||
for (vt_div = min_vt_div; vt_div <= max_vt_div;
|
||||
vt_div += 2 - (vt_div & 1)) {
|
||||
for (sys_div = min_sys_div;
|
||||
sys_div <= max_sys_div;
|
||||
sys_div += 2 - (sys_div & 1)) {
|
||||
uint16_t pix_div = DIV_ROUND_UP(vt_div, sys_div);
|
||||
|
||||
if (pix_div < limits->vt.min_pix_clk_div
|
||||
|| pix_div > limits->vt.max_pix_clk_div) {
|
||||
dev_dbg(dev,
|
||||
"pix_div %d too small or too big (%d--%d)\n",
|
||||
pix_div,
|
||||
limits->vt.min_pix_clk_div,
|
||||
limits->vt.max_pix_clk_div);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check if this one is better. */
|
||||
if (pix_div * sys_div
|
||||
<= roundup(min_vt_div, best_pix_div))
|
||||
best_pix_div = pix_div;
|
||||
}
|
||||
if (best_pix_div < INT_MAX >> 1)
|
||||
break;
|
||||
}
|
||||
|
||||
pll->vt_sys_clk_div = DIV_ROUND_UP(min_vt_div, best_pix_div);
|
||||
pll->vt_pix_clk_div = best_pix_div;
|
||||
|
||||
pll->vt_sys_clk_freq_hz =
|
||||
pll->pll_op_clk_freq_hz / pll->vt_sys_clk_div;
|
||||
pll->vt_pix_clk_freq_hz =
|
||||
pll->vt_sys_clk_freq_hz / pll->vt_pix_clk_div;
|
||||
|
||||
pll->pixel_rate_csi =
|
||||
pll->op_pix_clk_freq_hz * lane_op_clock_ratio;
|
||||
|
||||
rval = bounds_check(dev, pll->pll_ip_clk_freq_hz,
|
||||
limits->min_pll_ip_freq_hz,
|
||||
limits->max_pll_ip_freq_hz,
|
||||
|
@ -339,35 +111,38 @@ static int __smiapp_pll_calculate(struct device *dev,
|
|||
"pll_op_clk_freq_hz");
|
||||
if (!rval)
|
||||
rval = bounds_check(
|
||||
dev, pll->op_sys_clk_div,
|
||||
limits->op.min_sys_clk_div, limits->op.max_sys_clk_div,
|
||||
dev, op_pll->sys_clk_div,
|
||||
op_limits->min_sys_clk_div, op_limits->max_sys_clk_div,
|
||||
"op_sys_clk_div");
|
||||
if (!rval)
|
||||
rval = bounds_check(
|
||||
dev, pll->op_pix_clk_div,
|
||||
limits->op.min_pix_clk_div, limits->op.max_pix_clk_div,
|
||||
"op_pix_clk_div");
|
||||
if (!rval)
|
||||
rval = bounds_check(
|
||||
dev, pll->op_sys_clk_freq_hz,
|
||||
limits->op.min_sys_clk_freq_hz,
|
||||
limits->op.max_sys_clk_freq_hz,
|
||||
dev, op_pll->sys_clk_freq_hz,
|
||||
op_limits->min_sys_clk_freq_hz,
|
||||
op_limits->max_sys_clk_freq_hz,
|
||||
"op_sys_clk_freq_hz");
|
||||
if (!rval)
|
||||
rval = bounds_check(
|
||||
dev, pll->op_pix_clk_freq_hz,
|
||||
limits->op.min_pix_clk_freq_hz,
|
||||
limits->op.max_pix_clk_freq_hz,
|
||||
dev, op_pll->pix_clk_freq_hz,
|
||||
op_limits->min_pix_clk_freq_hz,
|
||||
op_limits->max_pix_clk_freq_hz,
|
||||
"op_pix_clk_freq_hz");
|
||||
|
||||
/*
|
||||
* If there are no OP clocks, the VT clocks are contained in
|
||||
* the OP clock struct.
|
||||
*/
|
||||
if (pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS)
|
||||
return rval;
|
||||
|
||||
if (!rval)
|
||||
rval = bounds_check(
|
||||
dev, pll->vt_sys_clk_freq_hz,
|
||||
dev, pll->vt.sys_clk_freq_hz,
|
||||
limits->vt.min_sys_clk_freq_hz,
|
||||
limits->vt.max_sys_clk_freq_hz,
|
||||
"vt_sys_clk_freq_hz");
|
||||
if (!rval)
|
||||
rval = bounds_check(
|
||||
dev, pll->vt_pix_clk_freq_hz,
|
||||
dev, pll->vt.pix_clk_freq_hz,
|
||||
limits->vt.min_pix_clk_freq_hz,
|
||||
limits->vt.max_pix_clk_freq_hz,
|
||||
"vt_pix_clk_freq_hz");
|
||||
|
@ -375,10 +150,258 @@ static int __smiapp_pll_calculate(struct device *dev,
|
|||
return rval;
|
||||
}
|
||||
|
||||
/*
|
||||
* Heuristically guess the PLL tree for a given common multiplier and
|
||||
* divisor. Begin with the operational timing and continue to video
|
||||
* timing once operational timing has been verified.
|
||||
*
|
||||
* @mul is the PLL multiplier and @div is the common divisor
|
||||
* (pre_pll_clk_div and op_sys_clk_div combined). The final PLL
|
||||
* multiplier will be a multiple of @mul.
|
||||
*
|
||||
* @return Zero on success, error code on error.
|
||||
*/
|
||||
static int __smiapp_pll_calculate(
|
||||
struct device *dev, const struct smiapp_pll_limits *limits,
|
||||
const struct smiapp_pll_branch_limits *op_limits,
|
||||
struct smiapp_pll *pll, struct smiapp_pll_branch *op_pll, uint32_t mul,
|
||||
uint32_t div, uint32_t lane_op_clock_ratio)
|
||||
{
|
||||
uint32_t sys_div;
|
||||
uint32_t best_pix_div = INT_MAX >> 1;
|
||||
uint32_t vt_op_binning_div;
|
||||
/*
|
||||
* Higher multipliers (and divisors) are often required than
|
||||
* necessitated by the external clock and the output clocks.
|
||||
* There are limits for all values in the clock tree. These
|
||||
* are the minimum and maximum multiplier for mul.
|
||||
*/
|
||||
uint32_t more_mul_min, more_mul_max;
|
||||
uint32_t more_mul_factor;
|
||||
uint32_t min_vt_div, max_vt_div, vt_div;
|
||||
uint32_t min_sys_div, max_sys_div;
|
||||
unsigned int i;
|
||||
|
||||
/*
|
||||
* Get pre_pll_clk_div so that our pll_op_clk_freq_hz won't be
|
||||
* too high.
|
||||
*/
|
||||
dev_dbg(dev, "pre_pll_clk_div %u\n", pll->pre_pll_clk_div);
|
||||
|
||||
/* Don't go above max pll multiplier. */
|
||||
more_mul_max = limits->max_pll_multiplier / mul;
|
||||
dev_dbg(dev, "more_mul_max: max_pll_multiplier check: %u\n",
|
||||
more_mul_max);
|
||||
/* Don't go above max pll op frequency. */
|
||||
more_mul_max =
|
||||
min_t(uint32_t,
|
||||
more_mul_max,
|
||||
limits->max_pll_op_freq_hz
|
||||
/ (pll->ext_clk_freq_hz / pll->pre_pll_clk_div * mul));
|
||||
dev_dbg(dev, "more_mul_max: max_pll_op_freq_hz check: %u\n",
|
||||
more_mul_max);
|
||||
/* Don't go above the division capability of op sys clock divider. */
|
||||
more_mul_max = min(more_mul_max,
|
||||
op_limits->max_sys_clk_div * pll->pre_pll_clk_div
|
||||
/ div);
|
||||
dev_dbg(dev, "more_mul_max: max_op_sys_clk_div check: %u\n",
|
||||
more_mul_max);
|
||||
/* Ensure we won't go above min_pll_multiplier. */
|
||||
more_mul_max = min(more_mul_max,
|
||||
DIV_ROUND_UP(limits->max_pll_multiplier, mul));
|
||||
dev_dbg(dev, "more_mul_max: min_pll_multiplier check: %u\n",
|
||||
more_mul_max);
|
||||
|
||||
/* Ensure we won't go below min_pll_op_freq_hz. */
|
||||
more_mul_min = DIV_ROUND_UP(limits->min_pll_op_freq_hz,
|
||||
pll->ext_clk_freq_hz / pll->pre_pll_clk_div
|
||||
* mul);
|
||||
dev_dbg(dev, "more_mul_min: min_pll_op_freq_hz check: %u\n",
|
||||
more_mul_min);
|
||||
/* Ensure we won't go below min_pll_multiplier. */
|
||||
more_mul_min = max(more_mul_min,
|
||||
DIV_ROUND_UP(limits->min_pll_multiplier, mul));
|
||||
dev_dbg(dev, "more_mul_min: min_pll_multiplier check: %u\n",
|
||||
more_mul_min);
|
||||
|
||||
if (more_mul_min > more_mul_max) {
|
||||
dev_dbg(dev,
|
||||
"unable to compute more_mul_min and more_mul_max\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
more_mul_factor = lcm(div, pll->pre_pll_clk_div) / div;
|
||||
dev_dbg(dev, "more_mul_factor: %u\n", more_mul_factor);
|
||||
more_mul_factor = lcm(more_mul_factor, op_limits->min_sys_clk_div);
|
||||
dev_dbg(dev, "more_mul_factor: min_op_sys_clk_div: %d\n",
|
||||
more_mul_factor);
|
||||
i = roundup(more_mul_min, more_mul_factor);
|
||||
if (!is_one_or_even(i))
|
||||
i <<= 1;
|
||||
|
||||
dev_dbg(dev, "final more_mul: %u\n", i);
|
||||
if (i > more_mul_max) {
|
||||
dev_dbg(dev, "final more_mul is bad, max %u\n", more_mul_max);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pll->pll_multiplier = mul * i;
|
||||
op_pll->sys_clk_div = div * i / pll->pre_pll_clk_div;
|
||||
dev_dbg(dev, "op_sys_clk_div: %u\n", op_pll->sys_clk_div);
|
||||
|
||||
pll->pll_ip_clk_freq_hz = pll->ext_clk_freq_hz
|
||||
/ pll->pre_pll_clk_div;
|
||||
|
||||
pll->pll_op_clk_freq_hz = pll->pll_ip_clk_freq_hz
|
||||
* pll->pll_multiplier;
|
||||
|
||||
/* Derive pll_op_clk_freq_hz. */
|
||||
op_pll->sys_clk_freq_hz =
|
||||
pll->pll_op_clk_freq_hz / op_pll->sys_clk_div;
|
||||
|
||||
op_pll->pix_clk_div = pll->bits_per_pixel;
|
||||
dev_dbg(dev, "op_pix_clk_div: %u\n", op_pll->pix_clk_div);
|
||||
|
||||
op_pll->pix_clk_freq_hz =
|
||||
op_pll->sys_clk_freq_hz / op_pll->pix_clk_div;
|
||||
|
||||
if (pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS) {
|
||||
/* No OP clocks --- VT clocks are used instead. */
|
||||
goto out_skip_vt_calc;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some sensors perform analogue binning and some do this
|
||||
* digitally. The ones doing this digitally can be roughly be
|
||||
* found out using this formula. The ones doing this digitally
|
||||
* should run at higher clock rate, so smaller divisor is used
|
||||
* on video timing side.
|
||||
*/
|
||||
if (limits->min_line_length_pck_bin > limits->min_line_length_pck
|
||||
/ pll->binning_horizontal)
|
||||
vt_op_binning_div = pll->binning_horizontal;
|
||||
else
|
||||
vt_op_binning_div = 1;
|
||||
dev_dbg(dev, "vt_op_binning_div: %u\n", vt_op_binning_div);
|
||||
|
||||
/*
|
||||
* Profile 2 supports vt_pix_clk_div E [4, 10]
|
||||
*
|
||||
* Horizontal binning can be used as a base for difference in
|
||||
* divisors. One must make sure that horizontal blanking is
|
||||
* enough to accommodate the CSI-2 sync codes.
|
||||
*
|
||||
* Take scaling factor into account as well.
|
||||
*
|
||||
* Find absolute limits for the factor of vt divider.
|
||||
*/
|
||||
dev_dbg(dev, "scale_m: %u\n", pll->scale_m);
|
||||
min_vt_div = DIV_ROUND_UP(op_pll->pix_clk_div * op_pll->sys_clk_div
|
||||
* pll->scale_n,
|
||||
lane_op_clock_ratio * vt_op_binning_div
|
||||
* pll->scale_m);
|
||||
|
||||
/* Find smallest and biggest allowed vt divisor. */
|
||||
dev_dbg(dev, "min_vt_div: %u\n", min_vt_div);
|
||||
min_vt_div = max(min_vt_div,
|
||||
DIV_ROUND_UP(pll->pll_op_clk_freq_hz,
|
||||
limits->vt.max_pix_clk_freq_hz));
|
||||
dev_dbg(dev, "min_vt_div: max_vt_pix_clk_freq_hz: %u\n",
|
||||
min_vt_div);
|
||||
min_vt_div = max_t(uint32_t, min_vt_div,
|
||||
limits->vt.min_pix_clk_div
|
||||
* limits->vt.min_sys_clk_div);
|
||||
dev_dbg(dev, "min_vt_div: min_vt_clk_div: %u\n", min_vt_div);
|
||||
|
||||
max_vt_div = limits->vt.max_sys_clk_div * limits->vt.max_pix_clk_div;
|
||||
dev_dbg(dev, "max_vt_div: %u\n", max_vt_div);
|
||||
max_vt_div = min(max_vt_div,
|
||||
DIV_ROUND_UP(pll->pll_op_clk_freq_hz,
|
||||
limits->vt.min_pix_clk_freq_hz));
|
||||
dev_dbg(dev, "max_vt_div: min_vt_pix_clk_freq_hz: %u\n",
|
||||
max_vt_div);
|
||||
|
||||
/*
|
||||
* Find limitsits for sys_clk_div. Not all values are possible
|
||||
* with all values of pix_clk_div.
|
||||
*/
|
||||
min_sys_div = limits->vt.min_sys_clk_div;
|
||||
dev_dbg(dev, "min_sys_div: %u\n", min_sys_div);
|
||||
min_sys_div = max(min_sys_div,
|
||||
DIV_ROUND_UP(min_vt_div,
|
||||
limits->vt.max_pix_clk_div));
|
||||
dev_dbg(dev, "min_sys_div: max_vt_pix_clk_div: %u\n", min_sys_div);
|
||||
min_sys_div = max(min_sys_div,
|
||||
pll->pll_op_clk_freq_hz
|
||||
/ limits->vt.max_sys_clk_freq_hz);
|
||||
dev_dbg(dev, "min_sys_div: max_pll_op_clk_freq_hz: %u\n", min_sys_div);
|
||||
min_sys_div = clk_div_even_up(min_sys_div);
|
||||
dev_dbg(dev, "min_sys_div: one or even: %u\n", min_sys_div);
|
||||
|
||||
max_sys_div = limits->vt.max_sys_clk_div;
|
||||
dev_dbg(dev, "max_sys_div: %u\n", max_sys_div);
|
||||
max_sys_div = min(max_sys_div,
|
||||
DIV_ROUND_UP(max_vt_div,
|
||||
limits->vt.min_pix_clk_div));
|
||||
dev_dbg(dev, "max_sys_div: min_vt_pix_clk_div: %u\n", max_sys_div);
|
||||
max_sys_div = min(max_sys_div,
|
||||
DIV_ROUND_UP(pll->pll_op_clk_freq_hz,
|
||||
limits->vt.min_pix_clk_freq_hz));
|
||||
dev_dbg(dev, "max_sys_div: min_vt_pix_clk_freq_hz: %u\n", max_sys_div);
|
||||
|
||||
/*
|
||||
* Find pix_div such that a legal pix_div * sys_div results
|
||||
* into a value which is not smaller than div, the desired
|
||||
* divisor.
|
||||
*/
|
||||
for (vt_div = min_vt_div; vt_div <= max_vt_div;
|
||||
vt_div += 2 - (vt_div & 1)) {
|
||||
for (sys_div = min_sys_div;
|
||||
sys_div <= max_sys_div;
|
||||
sys_div += 2 - (sys_div & 1)) {
|
||||
uint16_t pix_div = DIV_ROUND_UP(vt_div, sys_div);
|
||||
|
||||
if (pix_div < limits->vt.min_pix_clk_div
|
||||
|| pix_div > limits->vt.max_pix_clk_div) {
|
||||
dev_dbg(dev,
|
||||
"pix_div %u too small or too big (%u--%u)\n",
|
||||
pix_div,
|
||||
limits->vt.min_pix_clk_div,
|
||||
limits->vt.max_pix_clk_div);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check if this one is better. */
|
||||
if (pix_div * sys_div
|
||||
<= roundup(min_vt_div, best_pix_div))
|
||||
best_pix_div = pix_div;
|
||||
}
|
||||
if (best_pix_div < INT_MAX >> 1)
|
||||
break;
|
||||
}
|
||||
|
||||
pll->vt.sys_clk_div = DIV_ROUND_UP(min_vt_div, best_pix_div);
|
||||
pll->vt.pix_clk_div = best_pix_div;
|
||||
|
||||
pll->vt.sys_clk_freq_hz =
|
||||
pll->pll_op_clk_freq_hz / pll->vt.sys_clk_div;
|
||||
pll->vt.pix_clk_freq_hz =
|
||||
pll->vt.sys_clk_freq_hz / pll->vt.pix_clk_div;
|
||||
|
||||
out_skip_vt_calc:
|
||||
pll->pixel_rate_csi =
|
||||
op_pll->pix_clk_freq_hz * lane_op_clock_ratio;
|
||||
pll->pixel_rate_pixel_array = pll->vt.pix_clk_freq_hz;
|
||||
|
||||
return check_all_bounds(dev, limits, op_limits, pll, op_pll);
|
||||
}
|
||||
|
||||
int smiapp_pll_calculate(struct device *dev,
|
||||
const struct smiapp_pll_limits *limits,
|
||||
struct smiapp_pll *pll)
|
||||
{
|
||||
const struct smiapp_pll_branch_limits *op_limits = &limits->op;
|
||||
struct smiapp_pll_branch *op_pll = &pll->op;
|
||||
uint16_t min_pre_pll_clk_div;
|
||||
uint16_t max_pre_pll_clk_div;
|
||||
uint32_t lane_op_clock_ratio;
|
||||
|
@ -386,13 +409,23 @@ int smiapp_pll_calculate(struct device *dev,
|
|||
unsigned int i;
|
||||
int rval = -EINVAL;
|
||||
|
||||
if (pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS) {
|
||||
/*
|
||||
* If there's no OP PLL at all, use the VT values
|
||||
* instead. The OP values are ignored for the rest of
|
||||
* the PLL calculation.
|
||||
*/
|
||||
op_limits = &limits->vt;
|
||||
op_pll = &pll->vt;
|
||||
}
|
||||
|
||||
if (pll->flags & SMIAPP_PLL_FLAG_OP_PIX_CLOCK_PER_LANE)
|
||||
lane_op_clock_ratio = pll->csi2.lanes;
|
||||
else
|
||||
lane_op_clock_ratio = 1;
|
||||
dev_dbg(dev, "lane_op_clock_ratio: %d\n", lane_op_clock_ratio);
|
||||
dev_dbg(dev, "lane_op_clock_ratio: %u\n", lane_op_clock_ratio);
|
||||
|
||||
dev_dbg(dev, "binning: %dx%d\n", pll->binning_horizontal,
|
||||
dev_dbg(dev, "binning: %ux%u\n", pll->binning_horizontal,
|
||||
pll->binning_vertical);
|
||||
|
||||
switch (pll->bus_type) {
|
||||
|
@ -411,7 +444,7 @@ int smiapp_pll_calculate(struct device *dev,
|
|||
}
|
||||
|
||||
/* Figure out limits for pre-pll divider based on extclk */
|
||||
dev_dbg(dev, "min / max pre_pll_clk_div: %d / %d\n",
|
||||
dev_dbg(dev, "min / max pre_pll_clk_div: %u / %u\n",
|
||||
limits->min_pre_pll_clk_div, limits->max_pre_pll_clk_div);
|
||||
max_pre_pll_clk_div =
|
||||
min_t(uint16_t, limits->max_pre_pll_clk_div,
|
||||
|
@ -422,26 +455,27 @@ int smiapp_pll_calculate(struct device *dev,
|
|||
clk_div_even_up(
|
||||
DIV_ROUND_UP(pll->ext_clk_freq_hz,
|
||||
limits->max_pll_ip_freq_hz)));
|
||||
dev_dbg(dev, "pre-pll check: min / max pre_pll_clk_div: %d / %d\n",
|
||||
dev_dbg(dev, "pre-pll check: min / max pre_pll_clk_div: %u / %u\n",
|
||||
min_pre_pll_clk_div, max_pre_pll_clk_div);
|
||||
|
||||
i = gcd(pll->pll_op_clk_freq_hz, pll->ext_clk_freq_hz);
|
||||
mul = div_u64(pll->pll_op_clk_freq_hz, i);
|
||||
div = pll->ext_clk_freq_hz / i;
|
||||
dev_dbg(dev, "mul %d / div %d\n", mul, div);
|
||||
dev_dbg(dev, "mul %u / div %u\n", mul, div);
|
||||
|
||||
min_pre_pll_clk_div =
|
||||
max_t(uint16_t, min_pre_pll_clk_div,
|
||||
clk_div_even_up(
|
||||
DIV_ROUND_UP(mul * pll->ext_clk_freq_hz,
|
||||
limits->max_pll_op_freq_hz)));
|
||||
dev_dbg(dev, "pll_op check: min / max pre_pll_clk_div: %d / %d\n",
|
||||
dev_dbg(dev, "pll_op check: min / max pre_pll_clk_div: %u / %u\n",
|
||||
min_pre_pll_clk_div, max_pre_pll_clk_div);
|
||||
|
||||
for (pll->pre_pll_clk_div = min_pre_pll_clk_div;
|
||||
pll->pre_pll_clk_div <= max_pre_pll_clk_div;
|
||||
pll->pre_pll_clk_div += 2 - (pll->pre_pll_clk_div & 1)) {
|
||||
rval = __smiapp_pll_calculate(dev, limits, pll, mul, div,
|
||||
rval = __smiapp_pll_calculate(dev, limits, op_limits, pll,
|
||||
op_pll, mul, div,
|
||||
lane_op_clock_ratio);
|
||||
if (rval)
|
||||
continue;
|
||||
|
|
|
@ -35,6 +35,13 @@
|
|||
#define SMIAPP_PLL_FLAG_OP_PIX_CLOCK_PER_LANE (1 << 0)
|
||||
#define SMIAPP_PLL_FLAG_NO_OP_CLOCKS (1 << 1)
|
||||
|
||||
struct smiapp_pll_branch {
|
||||
uint16_t sys_clk_div;
|
||||
uint16_t pix_clk_div;
|
||||
uint32_t sys_clk_freq_hz;
|
||||
uint32_t pix_clk_freq_hz;
|
||||
};
|
||||
|
||||
struct smiapp_pll {
|
||||
/* input values */
|
||||
uint8_t bus_type;
|
||||
|
@ -53,24 +60,18 @@ struct smiapp_pll {
|
|||
uint8_t scale_n;
|
||||
uint8_t bits_per_pixel;
|
||||
uint32_t link_freq;
|
||||
uint32_t ext_clk_freq_hz;
|
||||
|
||||
/* output values */
|
||||
uint16_t pre_pll_clk_div;
|
||||
uint16_t pll_multiplier;
|
||||
uint16_t op_sys_clk_div;
|
||||
uint16_t op_pix_clk_div;
|
||||
uint16_t vt_sys_clk_div;
|
||||
uint16_t vt_pix_clk_div;
|
||||
|
||||
uint32_t ext_clk_freq_hz;
|
||||
uint32_t pll_ip_clk_freq_hz;
|
||||
uint32_t pll_op_clk_freq_hz;
|
||||
uint32_t op_sys_clk_freq_hz;
|
||||
uint32_t op_pix_clk_freq_hz;
|
||||
uint32_t vt_sys_clk_freq_hz;
|
||||
uint32_t vt_pix_clk_freq_hz;
|
||||
struct smiapp_pll_branch vt;
|
||||
struct smiapp_pll_branch op;
|
||||
|
||||
uint32_t pixel_rate_csi;
|
||||
uint32_t pixel_rate_pixel_array;
|
||||
};
|
||||
|
||||
struct smiapp_pll_branch_limits {
|
||||
|
|
|
@ -205,12 +205,12 @@ static int smiapp_pll_configure(struct smiapp_sensor *sensor)
|
|||
int rval;
|
||||
|
||||
rval = smiapp_write(
|
||||
sensor, SMIAPP_REG_U16_VT_PIX_CLK_DIV, pll->vt_pix_clk_div);
|
||||
sensor, SMIAPP_REG_U16_VT_PIX_CLK_DIV, pll->vt.pix_clk_div);
|
||||
if (rval < 0)
|
||||
return rval;
|
||||
|
||||
rval = smiapp_write(
|
||||
sensor, SMIAPP_REG_U16_VT_SYS_CLK_DIV, pll->vt_sys_clk_div);
|
||||
sensor, SMIAPP_REG_U16_VT_SYS_CLK_DIV, pll->vt.sys_clk_div);
|
||||
if (rval < 0)
|
||||
return rval;
|
||||
|
||||
|
@ -227,20 +227,21 @@ static int smiapp_pll_configure(struct smiapp_sensor *sensor)
|
|||
/* Lane op clock ratio does not apply here. */
|
||||
rval = smiapp_write(
|
||||
sensor, SMIAPP_REG_U32_REQUESTED_LINK_BIT_RATE_MBPS,
|
||||
DIV_ROUND_UP(pll->op_sys_clk_freq_hz, 1000000 / 256 / 256));
|
||||
DIV_ROUND_UP(pll->op.sys_clk_freq_hz, 1000000 / 256 / 256));
|
||||
if (rval < 0 || sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0)
|
||||
return rval;
|
||||
|
||||
rval = smiapp_write(
|
||||
sensor, SMIAPP_REG_U16_OP_PIX_CLK_DIV, pll->op_pix_clk_div);
|
||||
sensor, SMIAPP_REG_U16_OP_PIX_CLK_DIV, pll->op.pix_clk_div);
|
||||
if (rval < 0)
|
||||
return rval;
|
||||
|
||||
return smiapp_write(
|
||||
sensor, SMIAPP_REG_U16_OP_SYS_CLK_DIV, pll->op_sys_clk_div);
|
||||
sensor, SMIAPP_REG_U16_OP_SYS_CLK_DIV, pll->op.sys_clk_div);
|
||||
}
|
||||
|
||||
static int smiapp_pll_update(struct smiapp_sensor *sensor)
|
||||
static int smiapp_pll_try(struct smiapp_sensor *sensor,
|
||||
struct smiapp_pll *pll)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
|
||||
struct smiapp_pll_limits lim = {
|
||||
|
@ -274,19 +275,15 @@ static int smiapp_pll_update(struct smiapp_sensor *sensor)
|
|||
.min_line_length_pck_bin = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN],
|
||||
.min_line_length_pck = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK],
|
||||
};
|
||||
|
||||
return smiapp_pll_calculate(&client->dev, &lim, pll);
|
||||
}
|
||||
|
||||
static int smiapp_pll_update(struct smiapp_sensor *sensor)
|
||||
{
|
||||
struct smiapp_pll *pll = &sensor->pll;
|
||||
int rval;
|
||||
|
||||
if (sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0) {
|
||||
/*
|
||||
* Fill in operational clock divisors limits from the
|
||||
* video timing ones. On profile 0 sensors the
|
||||
* requirements regarding them are essentially the
|
||||
* same as on VT ones.
|
||||
*/
|
||||
lim.op = lim.vt;
|
||||
}
|
||||
|
||||
pll->binning_horizontal = sensor->binning_horizontal;
|
||||
pll->binning_vertical = sensor->binning_vertical;
|
||||
pll->link_freq =
|
||||
|
@ -294,12 +291,12 @@ static int smiapp_pll_update(struct smiapp_sensor *sensor)
|
|||
pll->scale_m = sensor->scale_m;
|
||||
pll->bits_per_pixel = sensor->csi_format->compressed;
|
||||
|
||||
rval = smiapp_pll_calculate(&client->dev, &lim, pll);
|
||||
rval = smiapp_pll_try(sensor, pll);
|
||||
if (rval < 0)
|
||||
return rval;
|
||||
|
||||
__v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_parray,
|
||||
pll->vt_pix_clk_freq_hz);
|
||||
pll->pixel_rate_pixel_array);
|
||||
__v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_csi, pll->pixel_rate_csi);
|
||||
|
||||
return 0;
|
||||
|
@ -333,22 +330,22 @@ static void __smiapp_update_exposure_limits(struct smiapp_sensor *sensor)
|
|||
* orders must be defined.
|
||||
*/
|
||||
static const struct smiapp_csi_data_format smiapp_csi_data_formats[] = {
|
||||
{ V4L2_MBUS_FMT_SGRBG12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_GRBG, },
|
||||
{ V4L2_MBUS_FMT_SRGGB12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_RGGB, },
|
||||
{ V4L2_MBUS_FMT_SBGGR12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_BGGR, },
|
||||
{ V4L2_MBUS_FMT_SGBRG12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_GBRG, },
|
||||
{ V4L2_MBUS_FMT_SGRBG10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_GRBG, },
|
||||
{ V4L2_MBUS_FMT_SRGGB10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_RGGB, },
|
||||
{ V4L2_MBUS_FMT_SBGGR10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_BGGR, },
|
||||
{ V4L2_MBUS_FMT_SGBRG10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_GBRG, },
|
||||
{ V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_GRBG, },
|
||||
{ V4L2_MBUS_FMT_SRGGB10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_RGGB, },
|
||||
{ V4L2_MBUS_FMT_SBGGR10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_BGGR, },
|
||||
{ V4L2_MBUS_FMT_SGBRG10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_GBRG, },
|
||||
{ V4L2_MBUS_FMT_SGRBG8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_GRBG, },
|
||||
{ V4L2_MBUS_FMT_SRGGB8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_RGGB, },
|
||||
{ V4L2_MBUS_FMT_SBGGR8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_BGGR, },
|
||||
{ V4L2_MBUS_FMT_SGBRG8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_GBRG, },
|
||||
{ MEDIA_BUS_FMT_SGRBG12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_GRBG, },
|
||||
{ MEDIA_BUS_FMT_SRGGB12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_RGGB, },
|
||||
{ MEDIA_BUS_FMT_SBGGR12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_BGGR, },
|
||||
{ MEDIA_BUS_FMT_SGBRG12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_GBRG, },
|
||||
{ MEDIA_BUS_FMT_SGRBG10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_GRBG, },
|
||||
{ MEDIA_BUS_FMT_SRGGB10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_RGGB, },
|
||||
{ MEDIA_BUS_FMT_SBGGR10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_BGGR, },
|
||||
{ MEDIA_BUS_FMT_SGBRG10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_GBRG, },
|
||||
{ MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_GRBG, },
|
||||
{ MEDIA_BUS_FMT_SRGGB10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_RGGB, },
|
||||
{ MEDIA_BUS_FMT_SBGGR10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_BGGR, },
|
||||
{ MEDIA_BUS_FMT_SGBRG10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_GBRG, },
|
||||
{ MEDIA_BUS_FMT_SGRBG8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_GRBG, },
|
||||
{ MEDIA_BUS_FMT_SRGGB8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_RGGB, },
|
||||
{ MEDIA_BUS_FMT_SBGGR8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_BGGR, },
|
||||
{ MEDIA_BUS_FMT_SGBRG8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_GBRG, },
|
||||
};
|
||||
|
||||
const char *pixel_order_str[] = { "GRBG", "RGGB", "BGGR", "GBRG" };
|
||||
|
@ -526,6 +523,8 @@ static const struct v4l2_ctrl_ops smiapp_ctrl_ops = {
|
|||
static int smiapp_init_controls(struct smiapp_sensor *sensor)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
|
||||
unsigned long *valid_link_freqs = &sensor->valid_link_freqs[
|
||||
sensor->csi_format->compressed - SMIAPP_COMPRESSED_BASE];
|
||||
unsigned int max, i;
|
||||
int rval;
|
||||
|
||||
|
@ -608,8 +607,8 @@ static int smiapp_init_controls(struct smiapp_sensor *sensor)
|
|||
|
||||
sensor->link_freq = v4l2_ctrl_new_int_menu(
|
||||
&sensor->src->ctrl_handler, &smiapp_ctrl_ops,
|
||||
V4L2_CID_LINK_FREQ, max, 0,
|
||||
sensor->platform_data->op_sys_clock);
|
||||
V4L2_CID_LINK_FREQ, __fls(*valid_link_freqs),
|
||||
__ffs(*valid_link_freqs), sensor->platform_data->op_sys_clock);
|
||||
|
||||
sensor->pixel_rate_csi = v4l2_ctrl_new_std(
|
||||
&sensor->src->ctrl_handler, &smiapp_ctrl_ops,
|
||||
|
@ -745,6 +744,7 @@ static int smiapp_get_limits_binning(struct smiapp_sensor *sensor)
|
|||
static int smiapp_get_mbus_formats(struct smiapp_sensor *sensor)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
|
||||
struct smiapp_pll *pll = &sensor->pll;
|
||||
unsigned int type, n;
|
||||
unsigned int i, pixel_order;
|
||||
int rval;
|
||||
|
@ -808,14 +808,57 @@ static int smiapp_get_mbus_formats(struct smiapp_sensor *sensor)
|
|||
dev_dbg(&client->dev, "jolly good! %d\n", j);
|
||||
|
||||
sensor->default_mbus_frame_fmts |= 1 << j;
|
||||
if (!sensor->csi_format
|
||||
|| f->width > sensor->csi_format->width
|
||||
|| (f->width == sensor->csi_format->width
|
||||
&& f->compressed
|
||||
> sensor->csi_format->compressed)) {
|
||||
sensor->csi_format = f;
|
||||
sensor->internal_csi_format = f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Figure out which BPP values can be used with which formats. */
|
||||
pll->binning_horizontal = 1;
|
||||
pll->binning_vertical = 1;
|
||||
pll->scale_m = sensor->scale_m;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(smiapp_csi_data_formats); i++) {
|
||||
const struct smiapp_csi_data_format *f =
|
||||
&smiapp_csi_data_formats[i];
|
||||
unsigned long *valid_link_freqs =
|
||||
&sensor->valid_link_freqs[
|
||||
f->compressed - SMIAPP_COMPRESSED_BASE];
|
||||
unsigned int j;
|
||||
|
||||
BUG_ON(f->compressed < SMIAPP_COMPRESSED_BASE);
|
||||
BUG_ON(f->compressed > SMIAPP_COMPRESSED_MAX);
|
||||
|
||||
if (!(sensor->default_mbus_frame_fmts & 1 << i))
|
||||
continue;
|
||||
|
||||
pll->bits_per_pixel = f->compressed;
|
||||
|
||||
for (j = 0; sensor->platform_data->op_sys_clock[j]; j++) {
|
||||
pll->link_freq = sensor->platform_data->op_sys_clock[j];
|
||||
|
||||
rval = smiapp_pll_try(sensor, pll);
|
||||
dev_dbg(&client->dev, "link freq %u Hz, bpp %u %s\n",
|
||||
pll->link_freq, pll->bits_per_pixel,
|
||||
rval ? "not ok" : "ok");
|
||||
if (rval)
|
||||
continue;
|
||||
|
||||
set_bit(j, valid_link_freqs);
|
||||
}
|
||||
|
||||
if (!*valid_link_freqs) {
|
||||
dev_info(&client->dev,
|
||||
"no valid link frequencies for %u bpp\n",
|
||||
f->compressed);
|
||||
sensor->default_mbus_frame_fmts &= ~BIT(i);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!sensor->csi_format
|
||||
|| f->width > sensor->csi_format->width
|
||||
|| (f->width == sensor->csi_format->width
|
||||
&& f->compressed > sensor->csi_format->compressed)) {
|
||||
sensor->csi_format = f;
|
||||
sensor->internal_csi_format = f;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -904,7 +947,7 @@ static int smiapp_update_mode(struct smiapp_sensor *sensor)
|
|||
dev_dbg(&client->dev, "hblank\t\t%d\n", sensor->hblank->val);
|
||||
|
||||
dev_dbg(&client->dev, "real timeperframe\t100/%d\n",
|
||||
sensor->pll.vt_pix_clk_freq_hz /
|
||||
sensor->pll.pixel_rate_pixel_array /
|
||||
((sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width
|
||||
+ sensor->hblank->val) *
|
||||
(sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height
|
||||
|
@ -1687,6 +1730,59 @@ static const struct smiapp_csi_data_format
|
|||
return csi_format;
|
||||
}
|
||||
|
||||
static int smiapp_set_format_source(struct v4l2_subdev *subdev,
|
||||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_format *fmt)
|
||||
{
|
||||
struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
|
||||
const struct smiapp_csi_data_format *csi_format,
|
||||
*old_csi_format = sensor->csi_format;
|
||||
unsigned long *valid_link_freqs;
|
||||
u32 code = fmt->format.code;
|
||||
unsigned int i;
|
||||
int rval;
|
||||
|
||||
rval = __smiapp_get_format(subdev, fh, fmt);
|
||||
if (rval)
|
||||
return rval;
|
||||
|
||||
/*
|
||||
* Media bus code is changeable on src subdev's source pad. On
|
||||
* other source pads we just get format here.
|
||||
*/
|
||||
if (subdev != &sensor->src->sd)
|
||||
return 0;
|
||||
|
||||
csi_format = smiapp_validate_csi_data_format(sensor, code);
|
||||
|
||||
fmt->format.code = csi_format->code;
|
||||
|
||||
if (fmt->which != V4L2_SUBDEV_FORMAT_ACTIVE)
|
||||
return 0;
|
||||
|
||||
sensor->csi_format = csi_format;
|
||||
|
||||
if (csi_format->width != old_csi_format->width)
|
||||
for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++)
|
||||
__v4l2_ctrl_modify_range(
|
||||
sensor->test_data[i], 0,
|
||||
(1 << csi_format->width) - 1, 1, 0);
|
||||
|
||||
if (csi_format->compressed == old_csi_format->compressed)
|
||||
return 0;
|
||||
|
||||
valid_link_freqs =
|
||||
&sensor->valid_link_freqs[sensor->csi_format->compressed
|
||||
- SMIAPP_COMPRESSED_BASE];
|
||||
|
||||
__v4l2_ctrl_modify_range(
|
||||
sensor->link_freq, 0,
|
||||
__fls(*valid_link_freqs), ~*valid_link_freqs,
|
||||
__ffs(*valid_link_freqs));
|
||||
|
||||
return smiapp_pll_update(sensor);
|
||||
}
|
||||
|
||||
static int smiapp_set_format(struct v4l2_subdev *subdev,
|
||||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_format *fmt)
|
||||
|
@ -1697,41 +1793,14 @@ static int smiapp_set_format(struct v4l2_subdev *subdev,
|
|||
|
||||
mutex_lock(&sensor->mutex);
|
||||
|
||||
/*
|
||||
* Media bus code is changeable on src subdev's source pad. On
|
||||
* other source pads we just get format here.
|
||||
*/
|
||||
if (fmt->pad == ssd->source_pad) {
|
||||
u32 code = fmt->format.code;
|
||||
int rval = __smiapp_get_format(subdev, fh, fmt);
|
||||
bool range_changed = false;
|
||||
unsigned int i;
|
||||
int rval;
|
||||
|
||||
if (!rval && subdev == &sensor->src->sd) {
|
||||
const struct smiapp_csi_data_format *csi_format =
|
||||
smiapp_validate_csi_data_format(sensor, code);
|
||||
|
||||
if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
|
||||
if (csi_format->width !=
|
||||
sensor->csi_format->width)
|
||||
range_changed = true;
|
||||
|
||||
sensor->csi_format = csi_format;
|
||||
}
|
||||
|
||||
fmt->format.code = csi_format->code;
|
||||
}
|
||||
rval = smiapp_set_format_source(subdev, fh, fmt);
|
||||
|
||||
mutex_unlock(&sensor->mutex);
|
||||
if (rval || !range_changed)
|
||||
return rval;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++)
|
||||
v4l2_ctrl_modify_range(
|
||||
sensor->test_data[i],
|
||||
0, (1 << sensor->csi_format->width) - 1, 1, 0);
|
||||
|
||||
return 0;
|
||||
return rval;
|
||||
}
|
||||
|
||||
/* Sink pad. Width and height are changeable here. */
|
||||
|
@ -2023,6 +2092,11 @@ static int __smiapp_sel_supported(struct v4l2_subdev *subdev,
|
|||
== SMIAPP_DIGITAL_CROP_CAPABILITY_INPUT_CROP)
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
case V4L2_SEL_TGT_NATIVE_SIZE:
|
||||
if (ssd == sensor->pixel_array
|
||||
&& sel->pad == SMIAPP_PA_PAD_SRC)
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
case V4L2_SEL_TGT_COMPOSE:
|
||||
case V4L2_SEL_TGT_COMPOSE_BOUNDS:
|
||||
if (sel->pad == ssd->source_pad)
|
||||
|
@ -2121,7 +2195,9 @@ static int __smiapp_get_selection(struct v4l2_subdev *subdev,
|
|||
|
||||
switch (sel->target) {
|
||||
case V4L2_SEL_TGT_CROP_BOUNDS:
|
||||
case V4L2_SEL_TGT_NATIVE_SIZE:
|
||||
if (ssd == sensor->pixel_array) {
|
||||
sel->r.left = sel->r.top = 0;
|
||||
sel->r.width =
|
||||
sensor->limits[SMIAPP_LIMIT_X_ADDR_MAX] + 1;
|
||||
sel->r.height =
|
||||
|
@ -2482,12 +2558,6 @@ static int smiapp_registered(struct v4l2_subdev *subdev)
|
|||
goto out_power_off;
|
||||
}
|
||||
|
||||
rval = smiapp_get_mbus_formats(sensor);
|
||||
if (rval) {
|
||||
rval = -ENODEV;
|
||||
goto out_power_off;
|
||||
}
|
||||
|
||||
if (sensor->limits[SMIAPP_LIMIT_BINNING_CAPABILITY]) {
|
||||
u32 val;
|
||||
|
||||
|
@ -2569,6 +2639,22 @@ static int smiapp_registered(struct v4l2_subdev *subdev)
|
|||
|
||||
sensor->scale_m = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN];
|
||||
|
||||
/* prepare PLL configuration input values */
|
||||
pll->bus_type = SMIAPP_PLL_BUS_TYPE_CSI2;
|
||||
pll->csi2.lanes = sensor->platform_data->lanes;
|
||||
pll->ext_clk_freq_hz = sensor->platform_data->ext_clk;
|
||||
pll->flags = smiapp_call_quirk(sensor, pll_flags);
|
||||
pll->scale_n = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN];
|
||||
/* Profile 0 sensors have no separate OP clock branch. */
|
||||
if (sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0)
|
||||
pll->flags |= SMIAPP_PLL_FLAG_NO_OP_CLOCKS;
|
||||
|
||||
rval = smiapp_get_mbus_formats(sensor);
|
||||
if (rval) {
|
||||
rval = -ENODEV;
|
||||
goto out_nvm_release;
|
||||
}
|
||||
|
||||
for (i = 0; i < SMIAPP_SUBDEVS; i++) {
|
||||
struct {
|
||||
struct smiapp_subdev *ssd;
|
||||
|
@ -2666,18 +2752,9 @@ static int smiapp_registered(struct v4l2_subdev *subdev)
|
|||
if (rval < 0)
|
||||
goto out_nvm_release;
|
||||
|
||||
/* prepare PLL configuration input values */
|
||||
pll->bus_type = SMIAPP_PLL_BUS_TYPE_CSI2;
|
||||
pll->csi2.lanes = sensor->platform_data->lanes;
|
||||
pll->ext_clk_freq_hz = sensor->platform_data->ext_clk;
|
||||
pll->flags = smiapp_call_quirk(sensor, pll_flags);
|
||||
|
||||
/* Profile 0 sensors have no separate OP clock branch. */
|
||||
if (sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0)
|
||||
pll->flags |= SMIAPP_PLL_FLAG_NO_OP_CLOCKS;
|
||||
pll->scale_n = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN];
|
||||
|
||||
mutex_lock(&sensor->mutex);
|
||||
rval = smiapp_update_mode(sensor);
|
||||
mutex_unlock(&sensor->mutex);
|
||||
if (rval) {
|
||||
dev_err(&client->dev, "update mode failed\n");
|
||||
goto out_nvm_release;
|
||||
|
|
|
@ -156,6 +156,11 @@ struct smiapp_csi_data_format {
|
|||
#define SMIAPP_PAD_SRC 1
|
||||
#define SMIAPP_PADS 2
|
||||
|
||||
#define SMIAPP_COMPRESSED_BASE 8
|
||||
#define SMIAPP_COMPRESSED_MAX 12
|
||||
#define SMIAPP_NR_OF_COMPRESSED (SMIAPP_COMPRESSED_MAX - \
|
||||
SMIAPP_COMPRESSED_BASE + 1)
|
||||
|
||||
struct smiapp_binning_subtype {
|
||||
u8 horizontal:4;
|
||||
u8 vertical:4;
|
||||
|
@ -232,6 +237,9 @@ struct smiapp_sensor {
|
|||
|
||||
struct smiapp_pll pll;
|
||||
|
||||
/* Is a default format supported for a given BPP? */
|
||||
unsigned long valid_link_freqs[SMIAPP_NR_OF_COMPRESSED];
|
||||
|
||||
/* Pixel array controls */
|
||||
struct v4l2_ctrl *analog_gain;
|
||||
struct v4l2_ctrl *exposure;
|
||||
|
|
|
@ -71,7 +71,7 @@
|
|||
|
||||
/* IMX074 has only one fixed colorspace per pixelcode */
|
||||
struct imx074_datafmt {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
};
|
||||
|
||||
|
@ -82,7 +82,7 @@ struct imx074 {
|
|||
};
|
||||
|
||||
static const struct imx074_datafmt imx074_colour_fmts[] = {
|
||||
{V4L2_MBUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
|
||||
};
|
||||
|
||||
static struct imx074 *to_imx074(const struct i2c_client *client)
|
||||
|
@ -91,7 +91,7 @@ static struct imx074 *to_imx074(const struct i2c_client *client)
|
|||
}
|
||||
|
||||
/* Find a data format by a pixel code in an array */
|
||||
static const struct imx074_datafmt *imx074_find_datafmt(enum v4l2_mbus_pixelcode code)
|
||||
static const struct imx074_datafmt *imx074_find_datafmt(u32 code)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -236,7 +236,7 @@ static int imx074_cropcap(struct v4l2_subdev *sd, struct v4l2_cropcap *a)
|
|||
}
|
||||
|
||||
static int imx074_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if ((unsigned int)index >= ARRAY_SIZE(imx074_colour_fmts))
|
||||
return -EINVAL;
|
||||
|
|
|
@ -53,13 +53,13 @@
|
|||
|
||||
/* MT9M001 has only one fixed colorspace per pixelcode */
|
||||
struct mt9m001_datafmt {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
};
|
||||
|
||||
/* Find a data format by a pixel code in an array */
|
||||
static const struct mt9m001_datafmt *mt9m001_find_datafmt(
|
||||
enum v4l2_mbus_pixelcode code, const struct mt9m001_datafmt *fmt,
|
||||
u32 code, const struct mt9m001_datafmt *fmt,
|
||||
int n)
|
||||
{
|
||||
int i;
|
||||
|
@ -75,14 +75,14 @@ static const struct mt9m001_datafmt mt9m001_colour_fmts[] = {
|
|||
* Order important: first natively supported,
|
||||
* second supported with a GPIO extender
|
||||
*/
|
||||
{V4L2_MBUS_FMT_SBGGR10_1X10, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_SBGGR10_1X10, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
|
||||
};
|
||||
|
||||
static const struct mt9m001_datafmt mt9m001_monochrome_fmts[] = {
|
||||
/* Order important - see above */
|
||||
{V4L2_MBUS_FMT_Y10_1X10, V4L2_COLORSPACE_JPEG},
|
||||
{V4L2_MBUS_FMT_Y8_1X8, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_Y10_1X10, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_Y8_1X8, V4L2_COLORSPACE_JPEG},
|
||||
};
|
||||
|
||||
struct mt9m001 {
|
||||
|
@ -563,7 +563,7 @@ static struct v4l2_subdev_core_ops mt9m001_subdev_core_ops = {
|
|||
};
|
||||
|
||||
static int mt9m001_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
struct mt9m001 *mt9m001 = to_mt9m001(client);
|
||||
|
|
|
@ -182,23 +182,23 @@ static struct mt9m111_context context_b = {
|
|||
|
||||
/* MT9M111 has only one fixed colorspace per pixelcode */
|
||||
struct mt9m111_datafmt {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
};
|
||||
|
||||
static const struct mt9m111_datafmt mt9m111_colour_fmts[] = {
|
||||
{V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{V4L2_MBUS_FMT_YVYU8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{V4L2_MBUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_RGB565_2X8_LE, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_RGB565_2X8_BE, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_BGR565_2X8_LE, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_BGR565_2X8_BE, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_YVYU8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_RGB565_2X8_LE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_RGB565_2X8_BE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_BGR565_2X8_LE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_BGR565_2X8_BE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
|
||||
};
|
||||
|
||||
struct mt9m111 {
|
||||
|
@ -218,7 +218,7 @@ struct mt9m111 {
|
|||
|
||||
/* Find a data format by a pixel code */
|
||||
static const struct mt9m111_datafmt *mt9m111_find_datafmt(struct mt9m111 *mt9m111,
|
||||
enum v4l2_mbus_pixelcode code)
|
||||
u32 code)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < ARRAY_SIZE(mt9m111_colour_fmts); i++)
|
||||
|
@ -331,7 +331,7 @@ static int mt9m111_setup_rect_ctx(struct mt9m111 *mt9m111,
|
|||
}
|
||||
|
||||
static int mt9m111_setup_geometry(struct mt9m111 *mt9m111, struct v4l2_rect *rect,
|
||||
int width, int height, enum v4l2_mbus_pixelcode code)
|
||||
int width, int height, u32 code)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
|
||||
int ret;
|
||||
|
@ -345,7 +345,7 @@ static int mt9m111_setup_geometry(struct mt9m111 *mt9m111, struct v4l2_rect *rec
|
|||
if (!ret)
|
||||
ret = reg_write(WINDOW_HEIGHT, rect->height);
|
||||
|
||||
if (code != V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE) {
|
||||
if (code != MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE) {
|
||||
/* IFP in use, down-scaling possible */
|
||||
if (!ret)
|
||||
ret = mt9m111_setup_rect_ctx(mt9m111, &context_b,
|
||||
|
@ -393,8 +393,8 @@ static int mt9m111_s_crop(struct v4l2_subdev *sd, const struct v4l2_crop *a)
|
|||
if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
||||
return -EINVAL;
|
||||
|
||||
if (mt9m111->fmt->code == V4L2_MBUS_FMT_SBGGR8_1X8 ||
|
||||
mt9m111->fmt->code == V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE) {
|
||||
if (mt9m111->fmt->code == MEDIA_BUS_FMT_SBGGR8_1X8 ||
|
||||
mt9m111->fmt->code == MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE) {
|
||||
/* Bayer format - even size lengths */
|
||||
rect.width = ALIGN(rect.width, 2);
|
||||
rect.height = ALIGN(rect.height, 2);
|
||||
|
@ -462,7 +462,7 @@ static int mt9m111_g_fmt(struct v4l2_subdev *sd,
|
|||
}
|
||||
|
||||
static int mt9m111_set_pixfmt(struct mt9m111 *mt9m111,
|
||||
enum v4l2_mbus_pixelcode code)
|
||||
u32 code)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
|
||||
u16 data_outfmt2, mask_outfmt2 = MT9M111_OUTFMT_PROCESSED_BAYER |
|
||||
|
@ -474,46 +474,46 @@ static int mt9m111_set_pixfmt(struct mt9m111 *mt9m111,
|
|||
int ret;
|
||||
|
||||
switch (code) {
|
||||
case V4L2_MBUS_FMT_SBGGR8_1X8:
|
||||
case MEDIA_BUS_FMT_SBGGR8_1X8:
|
||||
data_outfmt2 = MT9M111_OUTFMT_PROCESSED_BAYER |
|
||||
MT9M111_OUTFMT_RGB;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE:
|
||||
case MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE:
|
||||
data_outfmt2 = MT9M111_OUTFMT_BYPASS_IFP | MT9M111_OUTFMT_RGB;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE:
|
||||
case MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE:
|
||||
data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB555 |
|
||||
MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE:
|
||||
case MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE:
|
||||
data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB555;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_LE:
|
||||
data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB565 |
|
||||
MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_BE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_BE:
|
||||
data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB565;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_BGR565_2X8_BE:
|
||||
case MEDIA_BUS_FMT_BGR565_2X8_BE:
|
||||
data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB565 |
|
||||
MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_BGR565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_BGR565_2X8_LE:
|
||||
data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB565 |
|
||||
MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN |
|
||||
MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
data_outfmt2 = 0;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_VYUY8_2X8:
|
||||
case MEDIA_BUS_FMT_VYUY8_2X8:
|
||||
data_outfmt2 = MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
data_outfmt2 = MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_YVYU8_2X8:
|
||||
case MEDIA_BUS_FMT_YVYU8_2X8:
|
||||
data_outfmt2 = MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN |
|
||||
MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B;
|
||||
break;
|
||||
|
@ -542,8 +542,8 @@ static int mt9m111_try_fmt(struct v4l2_subdev *sd,
|
|||
|
||||
fmt = mt9m111_find_datafmt(mt9m111, mf->code);
|
||||
|
||||
bayer = fmt->code == V4L2_MBUS_FMT_SBGGR8_1X8 ||
|
||||
fmt->code == V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE;
|
||||
bayer = fmt->code == MEDIA_BUS_FMT_SBGGR8_1X8 ||
|
||||
fmt->code == MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE;
|
||||
|
||||
/*
|
||||
* With Bayer format enforce even side lengths, but let the user play
|
||||
|
@ -554,7 +554,7 @@ static int mt9m111_try_fmt(struct v4l2_subdev *sd,
|
|||
rect->height = ALIGN(rect->height, 2);
|
||||
}
|
||||
|
||||
if (fmt->code == V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE) {
|
||||
if (fmt->code == MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE) {
|
||||
/* IFP bypass mode, no scaling */
|
||||
mf->width = rect->width;
|
||||
mf->height = rect->height;
|
||||
|
@ -840,7 +840,7 @@ static struct v4l2_subdev_core_ops mt9m111_subdev_core_ops = {
|
|||
};
|
||||
|
||||
static int mt9m111_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index >= ARRAY_SIZE(mt9m111_colour_fmts))
|
||||
return -EINVAL;
|
||||
|
|
|
@ -345,7 +345,7 @@ static int mt9t031_g_fmt(struct v4l2_subdev *sd,
|
|||
|
||||
mf->width = mt9t031->rect.width / mt9t031->xskip;
|
||||
mf->height = mt9t031->rect.height / mt9t031->yskip;
|
||||
mf->code = V4L2_MBUS_FMT_SBGGR10_1X10;
|
||||
mf->code = MEDIA_BUS_FMT_SBGGR10_1X10;
|
||||
mf->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
mf->field = V4L2_FIELD_NONE;
|
||||
|
||||
|
@ -367,7 +367,7 @@ static int mt9t031_s_fmt(struct v4l2_subdev *sd,
|
|||
xskip = mt9t031_skip(&rect.width, mf->width, MT9T031_MAX_WIDTH);
|
||||
yskip = mt9t031_skip(&rect.height, mf->height, MT9T031_MAX_HEIGHT);
|
||||
|
||||
mf->code = V4L2_MBUS_FMT_SBGGR10_1X10;
|
||||
mf->code = MEDIA_BUS_FMT_SBGGR10_1X10;
|
||||
mf->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
|
||||
/* mt9t031_set_params() doesn't change width and height */
|
||||
|
@ -385,7 +385,7 @@ static int mt9t031_try_fmt(struct v4l2_subdev *sd,
|
|||
&mf->width, MT9T031_MIN_WIDTH, MT9T031_MAX_WIDTH, 1,
|
||||
&mf->height, MT9T031_MIN_HEIGHT, MT9T031_MAX_HEIGHT, 1, 0);
|
||||
|
||||
mf->code = V4L2_MBUS_FMT_SBGGR10_1X10;
|
||||
mf->code = MEDIA_BUS_FMT_SBGGR10_1X10;
|
||||
mf->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
|
||||
return 0;
|
||||
|
@ -673,12 +673,12 @@ static struct v4l2_subdev_core_ops mt9t031_subdev_core_ops = {
|
|||
};
|
||||
|
||||
static int mt9t031_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index)
|
||||
return -EINVAL;
|
||||
|
||||
*code = V4L2_MBUS_FMT_SBGGR10_1X10;
|
||||
*code = MEDIA_BUS_FMT_SBGGR10_1X10;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -77,7 +77,7 @@
|
|||
struct
|
||||
************************************************************************/
|
||||
struct mt9t112_format {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
u16 fmt;
|
||||
u16 order;
|
||||
|
@ -103,32 +103,32 @@ struct mt9t112_priv {
|
|||
|
||||
static const struct mt9t112_format mt9t112_cfmts[] = {
|
||||
{
|
||||
.code = V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
.code = MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.fmt = 1,
|
||||
.order = 0,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_VYUY8_2X8,
|
||||
.code = MEDIA_BUS_FMT_VYUY8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.fmt = 1,
|
||||
.order = 1,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_YUYV8_2X8,
|
||||
.code = MEDIA_BUS_FMT_YUYV8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.fmt = 1,
|
||||
.order = 2,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_YVYU8_2X8,
|
||||
.code = MEDIA_BUS_FMT_YVYU8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.fmt = 1,
|
||||
.order = 3,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE,
|
||||
.code = MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE,
|
||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||
.fmt = 8,
|
||||
.order = 2,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_RGB565_2X8_LE,
|
||||
.code = MEDIA_BUS_FMT_RGB565_2X8_LE,
|
||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||
.fmt = 4,
|
||||
.order = 2,
|
||||
|
@ -840,7 +840,7 @@ static int mt9t112_s_stream(struct v4l2_subdev *sd, int enable)
|
|||
|
||||
static int mt9t112_set_params(struct mt9t112_priv *priv,
|
||||
const struct v4l2_rect *rect,
|
||||
enum v4l2_mbus_pixelcode code)
|
||||
u32 code)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -953,7 +953,7 @@ static int mt9t112_try_fmt(struct v4l2_subdev *sd,
|
|||
break;
|
||||
|
||||
if (i == priv->num_formats) {
|
||||
mf->code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
mf->code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
mf->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
} else {
|
||||
mf->colorspace = mt9t112_cfmts[i].colorspace;
|
||||
|
@ -967,7 +967,7 @@ static int mt9t112_try_fmt(struct v4l2_subdev *sd,
|
|||
}
|
||||
|
||||
static int mt9t112_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
struct mt9t112_priv *priv = to_mt9t112(client);
|
||||
|
@ -1101,7 +1101,7 @@ static int mt9t112_probe(struct i2c_client *client,
|
|||
|
||||
/* Cannot fail: using the default supported pixel code */
|
||||
if (!ret)
|
||||
mt9t112_set_params(priv, &rect, V4L2_MBUS_FMT_UYVY8_2X8);
|
||||
mt9t112_set_params(priv, &rect, MEDIA_BUS_FMT_UYVY8_2X8);
|
||||
else
|
||||
v4l2_clk_put(priv->clk);
|
||||
|
||||
|
|
|
@ -85,13 +85,13 @@ MODULE_PARM_DESC(sensor_type, "Sensor type: \"colour\" or \"monochrome\"");
|
|||
|
||||
/* MT9V022 has only one fixed colorspace per pixelcode */
|
||||
struct mt9v022_datafmt {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
};
|
||||
|
||||
/* Find a data format by a pixel code in an array */
|
||||
static const struct mt9v022_datafmt *mt9v022_find_datafmt(
|
||||
enum v4l2_mbus_pixelcode code, const struct mt9v022_datafmt *fmt,
|
||||
u32 code, const struct mt9v022_datafmt *fmt,
|
||||
int n)
|
||||
{
|
||||
int i;
|
||||
|
@ -107,14 +107,14 @@ static const struct mt9v022_datafmt mt9v022_colour_fmts[] = {
|
|||
* Order important: first natively supported,
|
||||
* second supported with a GPIO extender
|
||||
*/
|
||||
{V4L2_MBUS_FMT_SBGGR10_1X10, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_SBGGR10_1X10, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
|
||||
};
|
||||
|
||||
static const struct mt9v022_datafmt mt9v022_monochrome_fmts[] = {
|
||||
/* Order important - see above */
|
||||
{V4L2_MBUS_FMT_Y10_1X10, V4L2_COLORSPACE_JPEG},
|
||||
{V4L2_MBUS_FMT_Y8_1X8, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_Y10_1X10, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_Y8_1X8, V4L2_COLORSPACE_JPEG},
|
||||
};
|
||||
|
||||
/* only registers with different addresses on different mt9v02x sensors */
|
||||
|
@ -410,13 +410,13 @@ static int mt9v022_s_fmt(struct v4l2_subdev *sd,
|
|||
* .try_mbus_fmt(), datawidth is from our supported format list
|
||||
*/
|
||||
switch (mf->code) {
|
||||
case V4L2_MBUS_FMT_Y8_1X8:
|
||||
case V4L2_MBUS_FMT_Y10_1X10:
|
||||
case MEDIA_BUS_FMT_Y8_1X8:
|
||||
case MEDIA_BUS_FMT_Y10_1X10:
|
||||
if (mt9v022->model != MT9V022IX7ATM)
|
||||
return -EINVAL;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_SBGGR8_1X8:
|
||||
case V4L2_MBUS_FMT_SBGGR10_1X10:
|
||||
case MEDIA_BUS_FMT_SBGGR8_1X8:
|
||||
case MEDIA_BUS_FMT_SBGGR10_1X10:
|
||||
if (mt9v022->model != MT9V022IX7ATC)
|
||||
return -EINVAL;
|
||||
break;
|
||||
|
@ -443,8 +443,8 @@ static int mt9v022_try_fmt(struct v4l2_subdev *sd,
|
|||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
struct mt9v022 *mt9v022 = to_mt9v022(client);
|
||||
const struct mt9v022_datafmt *fmt;
|
||||
int align = mf->code == V4L2_MBUS_FMT_SBGGR8_1X8 ||
|
||||
mf->code == V4L2_MBUS_FMT_SBGGR10_1X10;
|
||||
int align = mf->code == MEDIA_BUS_FMT_SBGGR8_1X8 ||
|
||||
mf->code == MEDIA_BUS_FMT_SBGGR10_1X10;
|
||||
|
||||
v4l_bound_align_image(&mf->width, MT9V022_MIN_WIDTH,
|
||||
MT9V022_MAX_WIDTH, align,
|
||||
|
@ -759,7 +759,7 @@ static struct v4l2_subdev_core_ops mt9v022_subdev_core_ops = {
|
|||
};
|
||||
|
||||
static int mt9v022_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
struct mt9v022 *mt9v022 = to_mt9v022(client);
|
||||
|
|
|
@ -302,7 +302,7 @@ struct ov2640_win_size {
|
|||
struct ov2640_priv {
|
||||
struct v4l2_subdev subdev;
|
||||
struct v4l2_ctrl_handler hdl;
|
||||
enum v4l2_mbus_pixelcode cfmt_code;
|
||||
u32 cfmt_code;
|
||||
struct v4l2_clk *clk;
|
||||
const struct ov2640_win_size *win;
|
||||
};
|
||||
|
@ -623,11 +623,11 @@ static const struct regval_list ov2640_rgb565_le_regs[] = {
|
|||
ENDMARKER,
|
||||
};
|
||||
|
||||
static enum v4l2_mbus_pixelcode ov2640_codes[] = {
|
||||
V4L2_MBUS_FMT_YUYV8_2X8,
|
||||
V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
V4L2_MBUS_FMT_RGB565_2X8_BE,
|
||||
V4L2_MBUS_FMT_RGB565_2X8_LE,
|
||||
static u32 ov2640_codes[] = {
|
||||
MEDIA_BUS_FMT_YUYV8_2X8,
|
||||
MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
MEDIA_BUS_FMT_RGB565_2X8_BE,
|
||||
MEDIA_BUS_FMT_RGB565_2X8_LE,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -785,7 +785,7 @@ static const struct ov2640_win_size *ov2640_select_win(u32 *width, u32 *height)
|
|||
}
|
||||
|
||||
static int ov2640_set_params(struct i2c_client *client, u32 *width, u32 *height,
|
||||
enum v4l2_mbus_pixelcode code)
|
||||
u32 code)
|
||||
{
|
||||
struct ov2640_priv *priv = to_ov2640(client);
|
||||
const struct regval_list *selected_cfmt_regs;
|
||||
|
@ -797,20 +797,20 @@ static int ov2640_set_params(struct i2c_client *client, u32 *width, u32 *height,
|
|||
/* select format */
|
||||
priv->cfmt_code = 0;
|
||||
switch (code) {
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_BE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_BE:
|
||||
dev_dbg(&client->dev, "%s: Selected cfmt RGB565 BE", __func__);
|
||||
selected_cfmt_regs = ov2640_rgb565_be_regs;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_LE:
|
||||
dev_dbg(&client->dev, "%s: Selected cfmt RGB565 LE", __func__);
|
||||
selected_cfmt_regs = ov2640_rgb565_le_regs;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
dev_dbg(&client->dev, "%s: Selected cfmt YUYV (YUV422)", __func__);
|
||||
selected_cfmt_regs = ov2640_yuyv_regs;
|
||||
break;
|
||||
default:
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
dev_dbg(&client->dev, "%s: Selected cfmt UYVY", __func__);
|
||||
selected_cfmt_regs = ov2640_uyvy_regs;
|
||||
}
|
||||
|
@ -869,7 +869,7 @@ static int ov2640_g_fmt(struct v4l2_subdev *sd,
|
|||
if (!priv->win) {
|
||||
u32 width = W_SVGA, height = H_SVGA;
|
||||
priv->win = ov2640_select_win(&width, &height);
|
||||
priv->cfmt_code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
priv->cfmt_code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
}
|
||||
|
||||
mf->width = priv->win->width;
|
||||
|
@ -877,13 +877,13 @@ static int ov2640_g_fmt(struct v4l2_subdev *sd,
|
|||
mf->code = priv->cfmt_code;
|
||||
|
||||
switch (mf->code) {
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_BE:
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_BE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_LE:
|
||||
mf->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
break;
|
||||
default:
|
||||
case V4L2_MBUS_FMT_YUYV8_2X8:
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
mf->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
}
|
||||
mf->field = V4L2_FIELD_NONE;
|
||||
|
@ -899,14 +899,14 @@ static int ov2640_s_fmt(struct v4l2_subdev *sd,
|
|||
|
||||
|
||||
switch (mf->code) {
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_BE:
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_BE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_LE:
|
||||
mf->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
break;
|
||||
default:
|
||||
mf->code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
case V4L2_MBUS_FMT_YUYV8_2X8:
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
mf->code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
mf->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
}
|
||||
|
||||
|
@ -926,14 +926,14 @@ static int ov2640_try_fmt(struct v4l2_subdev *sd,
|
|||
mf->field = V4L2_FIELD_NONE;
|
||||
|
||||
switch (mf->code) {
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_BE:
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_BE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_LE:
|
||||
mf->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
break;
|
||||
default:
|
||||
mf->code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
case V4L2_MBUS_FMT_YUYV8_2X8:
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
mf->code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
mf->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
}
|
||||
|
||||
|
@ -941,7 +941,7 @@ static int ov2640_try_fmt(struct v4l2_subdev *sd,
|
|||
}
|
||||
|
||||
static int ov2640_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index >= ARRAY_SIZE(ov2640_codes))
|
||||
return -EINVAL;
|
||||
|
|
|
@ -602,7 +602,7 @@ static struct regval_list ov5642_default_regs_finalise[] = {
|
|||
};
|
||||
|
||||
struct ov5642_datafmt {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
};
|
||||
|
||||
|
@ -618,7 +618,7 @@ struct ov5642 {
|
|||
};
|
||||
|
||||
static const struct ov5642_datafmt ov5642_colour_fmts[] = {
|
||||
{V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
};
|
||||
|
||||
static struct ov5642 *to_ov5642(const struct i2c_client *client)
|
||||
|
@ -628,7 +628,7 @@ static struct ov5642 *to_ov5642(const struct i2c_client *client)
|
|||
|
||||
/* Find a data format by a pixel code in an array */
|
||||
static const struct ov5642_datafmt
|
||||
*ov5642_find_datafmt(enum v4l2_mbus_pixelcode code)
|
||||
*ov5642_find_datafmt(u32 code)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -840,7 +840,7 @@ static int ov5642_g_fmt(struct v4l2_subdev *sd,
|
|||
}
|
||||
|
||||
static int ov5642_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index >= ARRAY_SIZE(ov5642_colour_fmts))
|
||||
return -EINVAL;
|
||||
|
|
|
@ -202,18 +202,18 @@ struct ov6650 {
|
|||
unsigned long pclk_limit; /* from host */
|
||||
unsigned long pclk_max; /* from resolution and format */
|
||||
struct v4l2_fract tpf; /* as requested with s_parm */
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
};
|
||||
|
||||
|
||||
static enum v4l2_mbus_pixelcode ov6650_codes[] = {
|
||||
V4L2_MBUS_FMT_YUYV8_2X8,
|
||||
V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
V4L2_MBUS_FMT_YVYU8_2X8,
|
||||
V4L2_MBUS_FMT_VYUY8_2X8,
|
||||
V4L2_MBUS_FMT_SBGGR8_1X8,
|
||||
V4L2_MBUS_FMT_Y8_1X8,
|
||||
static u32 ov6650_codes[] = {
|
||||
MEDIA_BUS_FMT_YUYV8_2X8,
|
||||
MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
MEDIA_BUS_FMT_YVYU8_2X8,
|
||||
MEDIA_BUS_FMT_VYUY8_2X8,
|
||||
MEDIA_BUS_FMT_SBGGR8_1X8,
|
||||
MEDIA_BUS_FMT_Y8_1X8,
|
||||
};
|
||||
|
||||
/* read a register */
|
||||
|
@ -555,29 +555,29 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
|||
.height = mf->height << half_scale,
|
||||
},
|
||||
};
|
||||
enum v4l2_mbus_pixelcode code = mf->code;
|
||||
u32 code = mf->code;
|
||||
unsigned long mclk, pclk;
|
||||
u8 coma_set = 0, coma_mask = 0, coml_set, coml_mask, clkrc;
|
||||
int ret;
|
||||
|
||||
/* select color matrix configuration for given color encoding */
|
||||
switch (code) {
|
||||
case V4L2_MBUS_FMT_Y8_1X8:
|
||||
case MEDIA_BUS_FMT_Y8_1X8:
|
||||
dev_dbg(&client->dev, "pixel format GREY8_1X8\n");
|
||||
coma_mask |= COMA_RGB | COMA_WORD_SWAP | COMA_BYTE_SWAP;
|
||||
coma_set |= COMA_BW;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
dev_dbg(&client->dev, "pixel format YUYV8_2X8_LE\n");
|
||||
coma_mask |= COMA_RGB | COMA_BW | COMA_BYTE_SWAP;
|
||||
coma_set |= COMA_WORD_SWAP;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_YVYU8_2X8:
|
||||
case MEDIA_BUS_FMT_YVYU8_2X8:
|
||||
dev_dbg(&client->dev, "pixel format YVYU8_2X8_LE (untested)\n");
|
||||
coma_mask |= COMA_RGB | COMA_BW | COMA_WORD_SWAP |
|
||||
COMA_BYTE_SWAP;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
dev_dbg(&client->dev, "pixel format YUYV8_2X8_BE\n");
|
||||
if (half_scale) {
|
||||
coma_mask |= COMA_RGB | COMA_BW | COMA_WORD_SWAP;
|
||||
|
@ -587,7 +587,7 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
|||
coma_set |= COMA_BYTE_SWAP | COMA_WORD_SWAP;
|
||||
}
|
||||
break;
|
||||
case V4L2_MBUS_FMT_VYUY8_2X8:
|
||||
case MEDIA_BUS_FMT_VYUY8_2X8:
|
||||
dev_dbg(&client->dev, "pixel format YVYU8_2X8_BE (untested)\n");
|
||||
if (half_scale) {
|
||||
coma_mask |= COMA_RGB | COMA_BW;
|
||||
|
@ -597,7 +597,7 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
|||
coma_set |= COMA_BYTE_SWAP;
|
||||
}
|
||||
break;
|
||||
case V4L2_MBUS_FMT_SBGGR8_1X8:
|
||||
case MEDIA_BUS_FMT_SBGGR8_1X8:
|
||||
dev_dbg(&client->dev, "pixel format SBGGR8_1X8 (untested)\n");
|
||||
coma_mask |= COMA_BW | COMA_BYTE_SWAP | COMA_WORD_SWAP;
|
||||
coma_set |= COMA_RAW_RGB | COMA_RGB;
|
||||
|
@ -608,8 +608,8 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
|||
}
|
||||
priv->code = code;
|
||||
|
||||
if (code == V4L2_MBUS_FMT_Y8_1X8 ||
|
||||
code == V4L2_MBUS_FMT_SBGGR8_1X8) {
|
||||
if (code == MEDIA_BUS_FMT_Y8_1X8 ||
|
||||
code == MEDIA_BUS_FMT_SBGGR8_1X8) {
|
||||
coml_mask = COML_ONE_CHANNEL;
|
||||
coml_set = 0;
|
||||
priv->pclk_max = 4000000;
|
||||
|
@ -619,7 +619,7 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
|||
priv->pclk_max = 8000000;
|
||||
}
|
||||
|
||||
if (code == V4L2_MBUS_FMT_SBGGR8_1X8)
|
||||
if (code == MEDIA_BUS_FMT_SBGGR8_1X8)
|
||||
priv->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
else if (code != 0)
|
||||
priv->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
|
@ -697,18 +697,18 @@ static int ov6650_try_fmt(struct v4l2_subdev *sd,
|
|||
mf->field = V4L2_FIELD_NONE;
|
||||
|
||||
switch (mf->code) {
|
||||
case V4L2_MBUS_FMT_Y10_1X10:
|
||||
mf->code = V4L2_MBUS_FMT_Y8_1X8;
|
||||
case V4L2_MBUS_FMT_Y8_1X8:
|
||||
case V4L2_MBUS_FMT_YVYU8_2X8:
|
||||
case V4L2_MBUS_FMT_YUYV8_2X8:
|
||||
case V4L2_MBUS_FMT_VYUY8_2X8:
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
case MEDIA_BUS_FMT_Y10_1X10:
|
||||
mf->code = MEDIA_BUS_FMT_Y8_1X8;
|
||||
case MEDIA_BUS_FMT_Y8_1X8:
|
||||
case MEDIA_BUS_FMT_YVYU8_2X8:
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_VYUY8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
mf->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
break;
|
||||
default:
|
||||
mf->code = V4L2_MBUS_FMT_SBGGR8_1X8;
|
||||
case V4L2_MBUS_FMT_SBGGR8_1X8:
|
||||
mf->code = MEDIA_BUS_FMT_SBGGR8_1X8;
|
||||
case MEDIA_BUS_FMT_SBGGR8_1X8:
|
||||
mf->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
break;
|
||||
}
|
||||
|
@ -717,7 +717,7 @@ static int ov6650_try_fmt(struct v4l2_subdev *sd,
|
|||
}
|
||||
|
||||
static int ov6650_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index >= ARRAY_SIZE(ov6650_codes))
|
||||
return -EINVAL;
|
||||
|
@ -1013,7 +1013,7 @@ static int ov6650_probe(struct i2c_client *client,
|
|||
priv->rect.width = W_CIF;
|
||||
priv->rect.height = H_CIF;
|
||||
priv->half_scale = false;
|
||||
priv->code = V4L2_MBUS_FMT_YUYV8_2X8;
|
||||
priv->code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
priv->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
|
||||
priv->clk = v4l2_clk_get(&client->dev, "mclk");
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue