media updates for v4.6-rc1
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJW5+iQAAoJEAhfPr2O5OEVGVMP/RIMdvf6FHt/rOfLqK5CU1Qv Tieu0eN+/Fv3eDR+R7hstMn6ux/nqV96D0squtbuI7OQ6onGNtVivRjUMjggOCrQ tkydcweW1reGyYrEA5PyQG0P9/mKxj3XDNw+e+e5rWHRlsoA1QPW0h8CKpdPOmEf Inbpx7ZX7rOMIFW4IYbdiKhRPKsRwHWADJ2e3vBbKy+rUnmHzYSgwnqhq1Ph+dkF XOPyLp4QEnl+SxD9iOhu9UJmF2SShZyn9gnzJ6xqum5AZhixms81ORPJ8a94QuGN H4MtH/M32/7gSZNM6idi158WSOyPQX4Q6Nt8XtjQjrYHiKe1rCK/R1XEwpyS0a6T CNxDjmocnEc9q17vHjVyCF+jqcVk5dvHvWgj8LRELLbZ+WlXZY7tJrffr2UZcJDh 0G0Xaj7CGfdyD86SySHiyyeBLgbGv2xrieMaD5K/2rUxDrQSheeFo9i3Eg0KrYmX 9Kjk5YoUAK8i5az+5DoHPNWNpGn1XaKN2aE3tFDWIgvD05pEb949kjE+KOFP603i QXBLk0NKRMMPf0RsZNT5OXgGGij7/2IewsKsvJ4PuuSwagJ+RiW6c7+y9VMbSjYW ikMTH6lMpTrGXE+i9DxA+wIieXIW012GCxSVJzPB6HKK1OoWPngX3/LUasSc6JMv kO7/EZLiPRMa4URwB8Nm =tPgH -----END PGP SIGNATURE----- Merge tag 'media/v4.6-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media Pull media updates from Mauro Carvalho Chehab: - Added support for some new video formats - mn88473 DVB frontend driver got promoted from staging - several improvements at the VSP1 driver - several cleanups and improvements at the Media Controller - added Media Controller support to snd-usb-audio. Currently, enabled only for au0828-based V4L2/DVB boards - Several improvements at nuvoton-cir: it now supports wake up codes - Add media controller support to em28xx and saa7134 drivers - coda driver now accepts NXP distributed firmware files - Some legacy SoC camera drivers will be moving to staging, as they're outdated and nobody so far is willing to fix and convert them to use the current media framework - As usual, lots of cleanups, improvements and new board additions. * tag 'media/v4.6-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (381 commits) media: au0828 disable tuner to demod link in au0828_media_device_register() [media] touptek: cast char types on %x printk [media] touptek: don't DMA at the stack [media] mceusb: use %*ph for small buffer dumps [media] v4l: exynos4-is: Drop unneeded check when setting up fimc-lite links [media] v4l: vsp1: Check if an entity is a subdev with the right function [media] hide unused functions for !MEDIA_CONTROLLER [media] em28xx: fix Terratec Grabby AC97 codec detection [media] media: add prefixes to interface types [media] media: rc: nuvoton: switch attribute wakeup_data to text [media] v4l2-ioctl: fix YUV422P pixel format description [media] media: fix null pointer dereference in v4l_vb2q_enable_media_source() [media] v4l2-mc.h: fix yet more compiler errors [media] staging/media: add missing TODO files [media] media.h: always start with 1 for the audio entities [media] sound/usb: Use meaninful names for goto labels [media] v4l2-mc.h: fix compiler warnings [media] media: au0828 audio mixer isn't connected to decoder [media] sound/usb: Use Media Controller API to share media resources [media] dw2102: add support for TeVii S662 ...
This commit is contained in:
commit
bace3db5da
|
@ -0,0 +1,15 @@
|
|||
What: /sys/class/rc/rcN/wakeup_data
|
||||
Date: Mar 2016
|
||||
KernelVersion: 4.6
|
||||
Contact: Mauro Carvalho Chehab <m.chehab@samsung.com>
|
||||
Description:
|
||||
Reading this file returns the stored CIR wakeup sequence.
|
||||
It starts with a pulse, followed by a space, pulse etc.
|
||||
All values are in microseconds.
|
||||
The same format can be used to store a wakeup sequence
|
||||
in the Nuvoton chip by writing to this file.
|
||||
|
||||
Note: Some systems reset the stored wakeup sequence to a
|
||||
factory default on each boot. On such systems store the
|
||||
wakeup sequence in a file and set it on boot using e.g.
|
||||
a udev rule.
|
|
@ -229,6 +229,7 @@ X!Isound/sound_firmware.c
|
|||
!Iinclude/media/v4l2-dv-timings.h
|
||||
!Iinclude/media/v4l2-event.h
|
||||
!Iinclude/media/v4l2-flash-led-class.h
|
||||
!Iinclude/media/v4l2-mc.h
|
||||
!Iinclude/media/v4l2-mediabus.h
|
||||
!Iinclude/media/v4l2-mem2mem.h
|
||||
!Iinclude/media/v4l2-of.h
|
||||
|
|
|
@ -2329,6 +2329,14 @@ to search and match for the present Macroblock (MB) in the reference picture. Th
|
|||
vertical search range for motion estimation module in video encoder.</entry>
|
||||
</row>
|
||||
|
||||
<row><entry></entry></row>
|
||||
<row id="v4l2-mpeg-video-force-key-frame">
|
||||
<entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME</constant> </entry>
|
||||
<entry>button</entry>
|
||||
</row><row><entry spanname="descr">Force a key frame for the next queued buffer. Applicable to encoders.
|
||||
This is a general, codec-agnostic keyframe control.</entry>
|
||||
</row>
|
||||
|
||||
<row><entry></entry></row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE</constant> </entry>
|
||||
|
@ -5069,6 +5077,46 @@ interface and may change in the future.</para>
|
|||
This control is applicable to VGA, DVI-A/D, HDMI and DisplayPort connectors.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_DV_TX_IT_CONTENT_TYPE</constant></entry>
|
||||
<entry id="v4l2-dv-content-type">enum v4l2_dv_it_content_type</entry>
|
||||
</row>
|
||||
<row><entry spanname="descr">Configures the IT Content Type
|
||||
of the transmitted video. This information is sent over HDMI and DisplayPort connectors
|
||||
as part of the AVI InfoFrame. The term 'IT Content' is used for content that originates
|
||||
from a computer as opposed to content from a TV broadcast or an analog source. The
|
||||
enum v4l2_dv_it_content_type defines the possible content types:</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entrytbl spanname="descr" cols="2">
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
<entry><constant>V4L2_DV_IT_CONTENT_TYPE_GRAPHICS</constant> </entry>
|
||||
<entry>Graphics content. Pixel data should be passed unfiltered and without
|
||||
analog reconstruction.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_DV_IT_CONTENT_TYPE_PHOTO</constant> </entry>
|
||||
<entry>Photo content. The content is derived from digital still pictures.
|
||||
The content should be passed through with minimal scaling and picture
|
||||
enhancements.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_DV_IT_CONTENT_TYPE_CINEMA</constant> </entry>
|
||||
<entry>Cinema content.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_DV_IT_CONTENT_TYPE_GAME</constant> </entry>
|
||||
<entry>Game content. Audio and video latency should be minimized.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_DV_IT_CONTENT_TYPE_NO_ITC</constant> </entry>
|
||||
<entry>No IT Content information is available and the ITC bit in the AVI
|
||||
InfoFrame is set to 0.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</entrytbl>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_DV_RX_POWER_PRESENT</constant></entry>
|
||||
<entry>bitmask</entry>
|
||||
|
@ -5098,6 +5146,16 @@ interface and may change in the future.</para>
|
|||
This control is applicable to VGA, DVI-A/D, HDMI and DisplayPort connectors.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry spanname="id"><constant>V4L2_CID_DV_RX_IT_CONTENT_TYPE</constant></entry>
|
||||
<entry>enum v4l2_dv_it_content_type</entry>
|
||||
</row>
|
||||
<row><entry spanname="descr">Reads the IT Content Type
|
||||
of the received video. This information is sent over HDMI and DisplayPort connectors
|
||||
as part of the AVI InfoFrame. The term 'IT Content' is used for content that originates
|
||||
from a computer as opposed to content from a TV broadcast or an analog source. See
|
||||
<constant>V4L2_CID_DV_TX_IT_CONTENT_TYPE</constant> for the available content types.</entry>
|
||||
</row>
|
||||
<row><entry></entry></row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
|
|
|
@ -48,9 +48,6 @@
|
|||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para><emphasis role="bold">NOTE:</emphasis> This new ioctl is programmed to be added on Kernel 4.6. Its definition/arguments may change until its final version.</para>
|
||||
|
||||
<para>The typical usage of this ioctl is to call it twice.
|
||||
On the first call, the structure defined at &media-v2-topology; should
|
||||
be zeroed. At return, if no errors happen, this ioctl will return the
|
||||
|
|
|
@ -80,7 +80,46 @@
|
|||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_ENT_F_TUNER</constant></entry>
|
||||
<entry>Digital TV, analog TV, radio and/or software radio tuner.</entry>
|
||||
<entry>Digital TV, analog TV, radio and/or software radio tuner,
|
||||
with consists on a PLL tuning stage that converts radio
|
||||
frequency (RF) signal into an Intermediate Frequency (IF).
|
||||
Modern tuners have internally IF-PLL decoders for audio
|
||||
and video, but older models have those stages implemented
|
||||
on separate entities.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_ENT_F_IF_VID_DECODER</constant></entry>
|
||||
<entry>IF-PLL video decoder. It receives the IF from a PLL
|
||||
and decodes the analog TV video signal. This is commonly
|
||||
found on some very old analog tuners, like Philips MK3
|
||||
designs. They all contain a tda9887 (or some software
|
||||
compatible similar chip, like tda9885). Those devices
|
||||
use a different I2C address than the tuner PLL.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_ENT_F_IF_AUD_DECODER</constant></entry>
|
||||
<entry>IF-PLL sound decoder. It receives the IF from a PLL
|
||||
and decodes the analog TV audio signal. This is commonly
|
||||
found on some very old analog hardware, like Micronas
|
||||
msp3400, Philips tda9840, tda985x, etc. Those devices
|
||||
use a different I2C address than the tuner PLL and
|
||||
should be controlled together with the IF-PLL video
|
||||
decoder.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_ENT_F_AUDIO_CAPTURE</constant></entry>
|
||||
<entry>Audio Capture Function Entity.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_ENT_F_AUDIO_PLAYBACK</constant></entry>
|
||||
<entry>Audio Playback Function Entity.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_ENT_F_AUDIO_MIXER</constant></entry>
|
||||
<entry>Audio Mixer Function Entity.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
|
@ -162,6 +201,46 @@
|
|||
<entry>Device node interface for Software Defined Radio (V4L)</entry>
|
||||
<entry>typically, /dev/swradio?</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_INTF_T_ALSA_PCM_CAPTURE</constant></entry>
|
||||
<entry>Device node interface for ALSA PCM Capture</entry>
|
||||
<entry>typically, /dev/snd/pcmC?D?c</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_INTF_T_ALSA_PCM_PLAYBACK</constant></entry>
|
||||
<entry>Device node interface for ALSA PCM Playback</entry>
|
||||
<entry>typically, /dev/snd/pcmC?D?p</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_INTF_T_ALSA_CONTROL</constant></entry>
|
||||
<entry>Device node interface for ALSA Control</entry>
|
||||
<entry>typically, /dev/snd/controlC?</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_INTF_T_ALSA_COMPRESS</constant></entry>
|
||||
<entry>Device node interface for ALSA Compress</entry>
|
||||
<entry>typically, /dev/snd/compr?</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_INTF_T_ALSA_RAWMIDI</constant></entry>
|
||||
<entry>Device node interface for ALSA Raw MIDI</entry>
|
||||
<entry>typically, /dev/snd/midi?</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_INTF_T_ALSA_HWDEP</constant></entry>
|
||||
<entry>Device node interface for ALSA Hardware Dependent</entry>
|
||||
<entry>typically, /dev/snd/hwC?D?</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_INTF_T_ALSA_SEQUENCER</constant></entry>
|
||||
<entry>Device node interface for ALSA Sequencer</entry>
|
||||
<entry>typically, /dev/snd/seq</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_INTF_T_ALSA_TIMER</constant></entry>
|
||||
<entry>Device node interface for ALSA Timer</entry>
|
||||
<entry>typically, /dev/snd/timer</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
<refentry id="V4L2-PIX-FMT-Y12I">
|
||||
<refmeta>
|
||||
<refentrytitle>V4L2_PIX_FMT_Y12I ('Y12I')</refentrytitle>
|
||||
&manvol;
|
||||
</refmeta>
|
||||
<refnamediv>
|
||||
<refname><constant>V4L2_PIX_FMT_Y12I</constant></refname>
|
||||
<refpurpose>Interleaved grey-scale image, e.g. from a stereo-pair</refpurpose>
|
||||
</refnamediv>
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>This is a grey-scale image with a depth of 12 bits per pixel, but with
|
||||
pixels from 2 sources interleaved and bit-packed. Each pixel is stored in a
|
||||
24-bit word in the little-endian order. On a little-endian machine these pixels
|
||||
can be deinterlaced using</para>
|
||||
|
||||
<para>
|
||||
<programlisting>
|
||||
__u8 *buf;
|
||||
left0 = 0xfff & *(__u16 *)buf;
|
||||
right0 = *(__u16 *)(buf + 1) >> 4;
|
||||
</programlisting>
|
||||
</para>
|
||||
|
||||
<example>
|
||||
<title><constant>V4L2_PIX_FMT_Y12I</constant> 2 pixel data stream taking 3 bytes</title>
|
||||
|
||||
<formalpara>
|
||||
<title>Bit-packed representation</title>
|
||||
<para>pixels cross the byte boundary and have a ratio of 3 bytes for each
|
||||
interleaved pixel.
|
||||
<informaltable frame="all">
|
||||
<tgroup cols="3" align="center">
|
||||
<colspec align="left" colwidth="2*" />
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
<entry>Y'<subscript>0left[7:0]</subscript></entry>
|
||||
<entry>Y'<subscript>0right[3:0]</subscript>Y'<subscript>0left[11:8]</subscript></entry>
|
||||
<entry>Y'<subscript>0right[11:4]</subscript></entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</informaltable>
|
||||
</para>
|
||||
</formalpara>
|
||||
</example>
|
||||
</refsect1>
|
||||
</refentry>
|
|
@ -0,0 +1,80 @@
|
|||
<refentry id="V4L2-PIX-FMT-Y8I">
|
||||
<refmeta>
|
||||
<refentrytitle>V4L2_PIX_FMT_Y8I ('Y8I ')</refentrytitle>
|
||||
&manvol;
|
||||
</refmeta>
|
||||
<refnamediv>
|
||||
<refname><constant>V4L2_PIX_FMT_Y8I</constant></refname>
|
||||
<refpurpose>Interleaved grey-scale image, e.g. from a stereo-pair</refpurpose>
|
||||
</refnamediv>
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>This is a grey-scale image with a depth of 8 bits per pixel, but with
|
||||
pixels from 2 sources interleaved. Each pixel is stored in a 16-bit word. E.g.
|
||||
the R200 RealSense camera stores pixel from the left sensor in lower and from
|
||||
the right sensor in the higher 8 bits.</para>
|
||||
|
||||
<example>
|
||||
<title><constant>V4L2_PIX_FMT_Y8I</constant> 4 × 4
|
||||
pixel image</title>
|
||||
|
||||
<formalpara>
|
||||
<title>Byte Order.</title>
|
||||
<para>Each cell is one byte.
|
||||
<informaltable frame="none">
|
||||
<tgroup cols="9" align="center">
|
||||
<colspec align="left" colwidth="2*" />
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
<entry>start + 0:</entry>
|
||||
<entry>Y'<subscript>00left</subscript></entry>
|
||||
<entry>Y'<subscript>00right</subscript></entry>
|
||||
<entry>Y'<subscript>01left</subscript></entry>
|
||||
<entry>Y'<subscript>01right</subscript></entry>
|
||||
<entry>Y'<subscript>02left</subscript></entry>
|
||||
<entry>Y'<subscript>02right</subscript></entry>
|
||||
<entry>Y'<subscript>03left</subscript></entry>
|
||||
<entry>Y'<subscript>03right</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start + 8:</entry>
|
||||
<entry>Y'<subscript>10left</subscript></entry>
|
||||
<entry>Y'<subscript>10right</subscript></entry>
|
||||
<entry>Y'<subscript>11left</subscript></entry>
|
||||
<entry>Y'<subscript>11right</subscript></entry>
|
||||
<entry>Y'<subscript>12left</subscript></entry>
|
||||
<entry>Y'<subscript>12right</subscript></entry>
|
||||
<entry>Y'<subscript>13left</subscript></entry>
|
||||
<entry>Y'<subscript>13right</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start + 16:</entry>
|
||||
<entry>Y'<subscript>20left</subscript></entry>
|
||||
<entry>Y'<subscript>20right</subscript></entry>
|
||||
<entry>Y'<subscript>21left</subscript></entry>
|
||||
<entry>Y'<subscript>21right</subscript></entry>
|
||||
<entry>Y'<subscript>22left</subscript></entry>
|
||||
<entry>Y'<subscript>22right</subscript></entry>
|
||||
<entry>Y'<subscript>23left</subscript></entry>
|
||||
<entry>Y'<subscript>23right</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start + 24:</entry>
|
||||
<entry>Y'<subscript>30left</subscript></entry>
|
||||
<entry>Y'<subscript>30right</subscript></entry>
|
||||
<entry>Y'<subscript>31left</subscript></entry>
|
||||
<entry>Y'<subscript>31right</subscript></entry>
|
||||
<entry>Y'<subscript>32left</subscript></entry>
|
||||
<entry>Y'<subscript>32right</subscript></entry>
|
||||
<entry>Y'<subscript>33left</subscript></entry>
|
||||
<entry>Y'<subscript>33right</subscript></entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</informaltable>
|
||||
</para>
|
||||
</formalpara>
|
||||
</example>
|
||||
</refsect1>
|
||||
</refentry>
|
|
@ -1,35 +1,43 @@
|
|||
<refentry id="V4L2-PIX-FMT-YUV420M">
|
||||
<refentry>
|
||||
<refmeta>
|
||||
<refentrytitle>V4L2_PIX_FMT_YUV420M ('YM12')</refentrytitle>
|
||||
<refentrytitle>V4L2_PIX_FMT_YUV420M ('YM12'), V4L2_PIX_FMT_YVU420M ('YM21')</refentrytitle>
|
||||
&manvol;
|
||||
</refmeta>
|
||||
<refnamediv>
|
||||
<refname> <constant>V4L2_PIX_FMT_YUV420M</constant></refname>
|
||||
<refpurpose>Variation of <constant>V4L2_PIX_FMT_YUV420</constant>
|
||||
with planes non contiguous in memory. </refpurpose>
|
||||
<refname id="V4L2-PIX-FMT-YUV420M"><constant>V4L2_PIX_FMT_YUV420M</constant></refname>
|
||||
<refname id="V4L2-PIX-FMT-YVU420M"><constant>V4L2_PIX_FMT_YVU420M</constant></refname>
|
||||
<refpurpose>Variation of <constant>V4L2_PIX_FMT_YUV420</constant> and
|
||||
<constant>V4L2_PIX_FMT_YVU420</constant> with planes non contiguous
|
||||
in memory.</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>This is a multi-planar format, as opposed to a packed format.
|
||||
The three components are separated into three sub- images or planes.
|
||||
The three components are separated into three sub-images or planes.</para>
|
||||
|
||||
The Y plane is first. The Y plane has one byte per pixel. The Cb data
|
||||
<para>The Y plane is first. The Y plane has one byte per pixel.
|
||||
For <constant>V4L2_PIX_FMT_YUV420M</constant> the Cb data
|
||||
constitutes the second plane which is half the width and half
|
||||
the height of the Y plane (and of the image). Each Cb belongs to four
|
||||
pixels, a two-by-two square of the image. For example,
|
||||
Cb<subscript>0</subscript> belongs to Y'<subscript>00</subscript>,
|
||||
Y'<subscript>01</subscript>, Y'<subscript>10</subscript>, and
|
||||
Y'<subscript>11</subscript>. The Cr data, just like the Cb plane, is
|
||||
in the third plane. </para>
|
||||
in the third plane.</para>
|
||||
|
||||
<para><constant>V4L2_PIX_FMT_YVU420M</constant> is the same except
|
||||
the Cr data is stored in the second plane and the Cb data in the third plane.
|
||||
</para>
|
||||
|
||||
<para>If the Y plane has pad bytes after each row, then the Cb
|
||||
and Cr planes have half as many pad bytes after their rows. In other
|
||||
words, two Cx rows (including padding) is exactly as long as one Y row
|
||||
(including padding).</para>
|
||||
|
||||
<para><constant>V4L2_PIX_FMT_YUV420M</constant> is intended to be
|
||||
<para><constant>V4L2_PIX_FMT_YUV420M</constant> and
|
||||
<constant>V4L2_PIX_FMT_YVU420M</constant> are intended to be
|
||||
used only in drivers and applications that support the multi-planar API,
|
||||
described in <xref linkend="planar-apis"/>. </para>
|
||||
|
||||
|
|
|
@ -1,40 +1,45 @@
|
|||
<refentry id="V4L2-PIX-FMT-YVU420M">
|
||||
<refentry>
|
||||
<refmeta>
|
||||
<refentrytitle>V4L2_PIX_FMT_YVU420M ('YM21')</refentrytitle>
|
||||
<refentrytitle>V4L2_PIX_FMT_YUV422M ('YM16'), V4L2_PIX_FMT_YVU422M ('YM61')</refentrytitle>
|
||||
&manvol;
|
||||
</refmeta>
|
||||
<refnamediv>
|
||||
<refname> <constant>V4L2_PIX_FMT_YVU420M</constant></refname>
|
||||
<refpurpose>Variation of <constant>V4L2_PIX_FMT_YVU420</constant>
|
||||
with planes non contiguous in memory. </refpurpose>
|
||||
<refname id="V4L2-PIX-FMT-YUV422M"><constant>V4L2_PIX_FMT_YUV422M</constant></refname>
|
||||
<refname id="V4L2-PIX-FMT-YVU422M"><constant>V4L2_PIX_FMT_YVU422M</constant></refname>
|
||||
<refpurpose>Planar formats with ½ horizontal resolution, also
|
||||
known as YUV and YVU 4:2:2</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>This is a multi-planar format, as opposed to a packed format.
|
||||
The three components are separated into three sub-images or planes.
|
||||
The three components are separated into three sub-images or planes.</para>
|
||||
|
||||
The Y plane is first. The Y plane has one byte per pixel. The Cr data
|
||||
constitutes the second plane which is half the width and half
|
||||
the height of the Y plane (and of the image). Each Cr belongs to four
|
||||
pixels, a two-by-two square of the image. For example,
|
||||
Cr<subscript>0</subscript> belongs to Y'<subscript>00</subscript>,
|
||||
Y'<subscript>01</subscript>, Y'<subscript>10</subscript>, and
|
||||
Y'<subscript>11</subscript>. The Cb data, just like the Cr plane, constitutes
|
||||
the third plane. </para>
|
||||
<para>The Y plane is first. The Y plane has one byte per pixel.
|
||||
For <constant>V4L2_PIX_FMT_YUV422M</constant> the Cb data
|
||||
constitutes the second plane which is half the width of the Y plane (and of the
|
||||
image). Each Cb belongs to two pixels. For example,
|
||||
Cb<subscript>0</subscript> belongs to Y'<subscript>00</subscript>,
|
||||
Y'<subscript>01</subscript>. The Cr data, just like the Cb plane, is
|
||||
in the third plane. </para>
|
||||
|
||||
<para>If the Y plane has pad bytes after each row, then the Cr
|
||||
and Cb planes have half as many pad bytes after their rows. In other
|
||||
<para><constant>V4L2_PIX_FMT_YVU422M</constant> is the same except
|
||||
the Cr data is stored in the second plane and the Cb data in the third plane.
|
||||
</para>
|
||||
|
||||
<para>If the Y plane has pad bytes after each row, then the Cb
|
||||
and Cr planes have half as many pad bytes after their rows. In other
|
||||
words, two Cx rows (including padding) is exactly as long as one Y row
|
||||
(including padding).</para>
|
||||
|
||||
<para><constant>V4L2_PIX_FMT_YVU420M</constant> is intended to be
|
||||
<para><constant>V4L2_PIX_FMT_YUV422M</constant> and
|
||||
<constant>V4L2_PIX_FMT_YVU422M</constant> are intended to be
|
||||
used only in drivers and applications that support the multi-planar API,
|
||||
described in <xref linkend="planar-apis"/>. </para>
|
||||
|
||||
<example>
|
||||
<title><constant>V4L2_PIX_FMT_YVU420M</constant> 4 × 4
|
||||
<title><constant>V4L2_PIX_FMT_YUV422M</constant> 4 × 4
|
||||
pixel image</title>
|
||||
|
||||
<formalpara>
|
||||
|
@ -75,25 +80,45 @@ pixel image</title>
|
|||
<row><entry></entry></row>
|
||||
<row>
|
||||
<entry>start1 + 0:</entry>
|
||||
<entry>Cr<subscript>00</subscript></entry>
|
||||
<entry>Cr<subscript>01</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start1 + 2:</entry>
|
||||
<entry>Cr<subscript>10</subscript></entry>
|
||||
<entry>Cr<subscript>11</subscript></entry>
|
||||
</row>
|
||||
<row><entry></entry></row>
|
||||
<row>
|
||||
<entry>start2 + 0:</entry>
|
||||
<entry>Cb<subscript>00</subscript></entry>
|
||||
<entry>Cb<subscript>01</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start2 + 2:</entry>
|
||||
<entry>start1 + 2:</entry>
|
||||
<entry>Cb<subscript>10</subscript></entry>
|
||||
<entry>Cb<subscript>11</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start1 + 4:</entry>
|
||||
<entry>Cb<subscript>20</subscript></entry>
|
||||
<entry>Cb<subscript>21</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start1 + 6:</entry>
|
||||
<entry>Cb<subscript>30</subscript></entry>
|
||||
<entry>Cb<subscript>31</subscript></entry>
|
||||
</row>
|
||||
<row><entry></entry></row>
|
||||
<row>
|
||||
<entry>start2 + 0:</entry>
|
||||
<entry>Cr<subscript>00</subscript></entry>
|
||||
<entry>Cr<subscript>01</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start2 + 2:</entry>
|
||||
<entry>Cr<subscript>10</subscript></entry>
|
||||
<entry>Cr<subscript>11</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start2 + 4:</entry>
|
||||
<entry>Cr<subscript>20</subscript></entry>
|
||||
<entry>Cr<subscript>21</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start2 + 6:</entry>
|
||||
<entry>Cr<subscript>30</subscript></entry>
|
||||
<entry>Cr<subscript>31</subscript></entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</informaltable>
|
||||
|
@ -113,36 +138,23 @@ pixel image</title>
|
|||
</row>
|
||||
<row>
|
||||
<entry>0</entry>
|
||||
<entry>Y</entry><entry></entry><entry>Y</entry><entry></entry>
|
||||
<entry>Y</entry><entry></entry><entry>Y</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry></entry><entry>C</entry><entry></entry><entry></entry>
|
||||
<entry></entry><entry>C</entry><entry></entry>
|
||||
<entry>Y</entry><entry>C</entry><entry>Y</entry><entry></entry>
|
||||
<entry>Y</entry><entry>C</entry><entry>Y</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>1</entry>
|
||||
<entry>Y</entry><entry></entry><entry>Y</entry><entry></entry>
|
||||
<entry>Y</entry><entry></entry><entry>Y</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry>Y</entry><entry>C</entry><entry>Y</entry><entry></entry>
|
||||
<entry>Y</entry><entry>C</entry><entry>Y</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>2</entry>
|
||||
<entry>Y</entry><entry></entry><entry>Y</entry><entry></entry>
|
||||
<entry>Y</entry><entry></entry><entry>Y</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry></entry><entry>C</entry><entry></entry><entry></entry>
|
||||
<entry></entry><entry>C</entry><entry></entry>
|
||||
<entry>Y</entry><entry>C</entry><entry>Y</entry><entry></entry>
|
||||
<entry>Y</entry><entry>C</entry><entry>Y</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>3</entry>
|
||||
<entry>Y</entry><entry></entry><entry>Y</entry><entry></entry>
|
||||
<entry>Y</entry><entry></entry><entry>Y</entry>
|
||||
<entry>Y</entry><entry>C</entry><entry>Y</entry><entry></entry>
|
||||
<entry>Y</entry><entry>C</entry><entry>Y</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
|
@ -0,0 +1,177 @@
|
|||
<refentry>
|
||||
<refmeta>
|
||||
<refentrytitle>V4L2_PIX_FMT_YUV444M ('YM24'), V4L2_PIX_FMT_YVU444M ('YM42')</refentrytitle>
|
||||
&manvol;
|
||||
</refmeta>
|
||||
<refnamediv>
|
||||
<refname id="V4L2-PIX-FMT-YUV444M"><constant>V4L2_PIX_FMT_YUV444M</constant></refname>
|
||||
<refname id="V4L2-PIX-FMT-YVU444M"><constant>V4L2_PIX_FMT_YVU444M</constant></refname>
|
||||
<refpurpose>Planar formats with full horizontal resolution, also
|
||||
known as YUV and YVU 4:4:4</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>This is a multi-planar format, as opposed to a packed format.
|
||||
The three components are separated into three sub-images or planes.</para>
|
||||
|
||||
<para>The Y plane is first. The Y plane has one byte per pixel.
|
||||
For <constant>V4L2_PIX_FMT_YUV444M</constant> the Cb data
|
||||
constitutes the second plane which is the same width and height as the Y plane
|
||||
(and as the image). The Cr data, just like the Cb plane, is in the third plane.
|
||||
</para>
|
||||
|
||||
<para><constant>V4L2_PIX_FMT_YVU444M</constant> is the same except
|
||||
the Cr data is stored in the second plane and the Cb data in the third plane.
|
||||
</para>
|
||||
<para>If the Y plane has pad bytes after each row, then the Cb
|
||||
and Cr planes have the same number of pad bytes after their rows.</para>
|
||||
|
||||
<para><constant>V4L2_PIX_FMT_YUV444M</constant> and
|
||||
<constant>V4L2_PIX_FMT_YUV444M</constant> are intended to be
|
||||
used only in drivers and applications that support the multi-planar API,
|
||||
described in <xref linkend="planar-apis"/>. </para>
|
||||
|
||||
<example>
|
||||
<title><constant>V4L2_PIX_FMT_YUV444M</constant> 4 × 4
|
||||
pixel image</title>
|
||||
|
||||
<formalpara>
|
||||
<title>Byte Order.</title>
|
||||
<para>Each cell is one byte.
|
||||
<informaltable frame="none">
|
||||
<tgroup cols="5" align="center">
|
||||
<colspec align="left" colwidth="2*" />
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
<entry>start0 + 0:</entry>
|
||||
<entry>Y'<subscript>00</subscript></entry>
|
||||
<entry>Y'<subscript>01</subscript></entry>
|
||||
<entry>Y'<subscript>02</subscript></entry>
|
||||
<entry>Y'<subscript>03</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start0 + 4:</entry>
|
||||
<entry>Y'<subscript>10</subscript></entry>
|
||||
<entry>Y'<subscript>11</subscript></entry>
|
||||
<entry>Y'<subscript>12</subscript></entry>
|
||||
<entry>Y'<subscript>13</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start0 + 8:</entry>
|
||||
<entry>Y'<subscript>20</subscript></entry>
|
||||
<entry>Y'<subscript>21</subscript></entry>
|
||||
<entry>Y'<subscript>22</subscript></entry>
|
||||
<entry>Y'<subscript>23</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start0 + 12:</entry>
|
||||
<entry>Y'<subscript>30</subscript></entry>
|
||||
<entry>Y'<subscript>31</subscript></entry>
|
||||
<entry>Y'<subscript>32</subscript></entry>
|
||||
<entry>Y'<subscript>33</subscript></entry>
|
||||
</row>
|
||||
<row><entry></entry></row>
|
||||
<row>
|
||||
<entry>start1 + 0:</entry>
|
||||
<entry>Cb<subscript>00</subscript></entry>
|
||||
<entry>Cb<subscript>01</subscript></entry>
|
||||
<entry>Cb<subscript>02</subscript></entry>
|
||||
<entry>Cb<subscript>03</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start1 + 4:</entry>
|
||||
<entry>Cb<subscript>10</subscript></entry>
|
||||
<entry>Cb<subscript>11</subscript></entry>
|
||||
<entry>Cb<subscript>12</subscript></entry>
|
||||
<entry>Cb<subscript>13</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start1 + 8:</entry>
|
||||
<entry>Cb<subscript>20</subscript></entry>
|
||||
<entry>Cb<subscript>21</subscript></entry>
|
||||
<entry>Cb<subscript>22</subscript></entry>
|
||||
<entry>Cb<subscript>23</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start1 + 12:</entry>
|
||||
<entry>Cb<subscript>20</subscript></entry>
|
||||
<entry>Cb<subscript>21</subscript></entry>
|
||||
<entry>Cb<subscript>32</subscript></entry>
|
||||
<entry>Cb<subscript>33</subscript></entry>
|
||||
</row>
|
||||
<row><entry></entry></row>
|
||||
<row>
|
||||
<entry>start2 + 0:</entry>
|
||||
<entry>Cr<subscript>00</subscript></entry>
|
||||
<entry>Cr<subscript>01</subscript></entry>
|
||||
<entry>Cr<subscript>02</subscript></entry>
|
||||
<entry>Cr<subscript>03</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start2 + 4:</entry>
|
||||
<entry>Cr<subscript>10</subscript></entry>
|
||||
<entry>Cr<subscript>11</subscript></entry>
|
||||
<entry>Cr<subscript>12</subscript></entry>
|
||||
<entry>Cr<subscript>13</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start2 + 8:</entry>
|
||||
<entry>Cr<subscript>20</subscript></entry>
|
||||
<entry>Cr<subscript>21</subscript></entry>
|
||||
<entry>Cr<subscript>22</subscript></entry>
|
||||
<entry>Cr<subscript>23</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start2 + 12:</entry>
|
||||
<entry>Cr<subscript>30</subscript></entry>
|
||||
<entry>Cr<subscript>31</subscript></entry>
|
||||
<entry>Cr<subscript>32</subscript></entry>
|
||||
<entry>Cr<subscript>33</subscript></entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</informaltable>
|
||||
</para>
|
||||
</formalpara>
|
||||
|
||||
<formalpara>
|
||||
<title>Color Sample Location.</title>
|
||||
<para>
|
||||
<informaltable frame="none">
|
||||
<tgroup cols="7" align="center">
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry>0</entry><entry></entry><entry>1</entry><entry></entry>
|
||||
<entry>2</entry><entry></entry><entry>3</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>0</entry>
|
||||
<entry>YC</entry><entry></entry><entry>YC</entry><entry></entry>
|
||||
<entry>YC</entry><entry></entry><entry>YC</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>1</entry>
|
||||
<entry>YC</entry><entry></entry><entry>YC</entry><entry></entry>
|
||||
<entry>YC</entry><entry></entry><entry>YC</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>2</entry>
|
||||
<entry>YC</entry><entry></entry><entry>YC</entry><entry></entry>
|
||||
<entry>YC</entry><entry></entry><entry>YC</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>3</entry>
|
||||
<entry>YC</entry><entry></entry><entry>YC</entry><entry></entry>
|
||||
<entry>YC</entry><entry></entry><entry>YC</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</informaltable>
|
||||
</para>
|
||||
</formalpara>
|
||||
</example>
|
||||
</refsect1>
|
||||
</refentry>
|
|
@ -0,0 +1,81 @@
|
|||
<refentry id="V4L2-PIX-FMT-Z16">
|
||||
<refmeta>
|
||||
<refentrytitle>V4L2_PIX_FMT_Z16 ('Z16 ')</refentrytitle>
|
||||
&manvol;
|
||||
</refmeta>
|
||||
<refnamediv>
|
||||
<refname><constant>V4L2_PIX_FMT_Z16</constant></refname>
|
||||
<refpurpose>Interleaved grey-scale image, e.g. from a stereo-pair</refpurpose>
|
||||
</refnamediv>
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>This is a 16-bit format, representing depth data. Each pixel is a
|
||||
distance to the respective point in the image coordinates. Distance unit can
|
||||
vary and has to be negotiated with the device separately. Each pixel is stored
|
||||
in a 16-bit word in the little endian byte order.
|
||||
</para>
|
||||
|
||||
<example>
|
||||
<title><constant>V4L2_PIX_FMT_Z16</constant> 4 × 4
|
||||
pixel image</title>
|
||||
|
||||
<formalpara>
|
||||
<title>Byte Order.</title>
|
||||
<para>Each cell is one byte.
|
||||
<informaltable frame="none">
|
||||
<tgroup cols="9" align="center">
|
||||
<colspec align="left" colwidth="2*" />
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
<entry>start + 0:</entry>
|
||||
<entry>Z<subscript>00low</subscript></entry>
|
||||
<entry>Z<subscript>00high</subscript></entry>
|
||||
<entry>Z<subscript>01low</subscript></entry>
|
||||
<entry>Z<subscript>01high</subscript></entry>
|
||||
<entry>Z<subscript>02low</subscript></entry>
|
||||
<entry>Z<subscript>02high</subscript></entry>
|
||||
<entry>Z<subscript>03low</subscript></entry>
|
||||
<entry>Z<subscript>03high</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start + 8:</entry>
|
||||
<entry>Z<subscript>10low</subscript></entry>
|
||||
<entry>Z<subscript>10high</subscript></entry>
|
||||
<entry>Z<subscript>11low</subscript></entry>
|
||||
<entry>Z<subscript>11high</subscript></entry>
|
||||
<entry>Z<subscript>12low</subscript></entry>
|
||||
<entry>Z<subscript>12high</subscript></entry>
|
||||
<entry>Z<subscript>13low</subscript></entry>
|
||||
<entry>Z<subscript>13high</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start + 16:</entry>
|
||||
<entry>Z<subscript>20low</subscript></entry>
|
||||
<entry>Z<subscript>20high</subscript></entry>
|
||||
<entry>Z<subscript>21low</subscript></entry>
|
||||
<entry>Z<subscript>21high</subscript></entry>
|
||||
<entry>Z<subscript>22low</subscript></entry>
|
||||
<entry>Z<subscript>22high</subscript></entry>
|
||||
<entry>Z<subscript>23low</subscript></entry>
|
||||
<entry>Z<subscript>23high</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start + 24:</entry>
|
||||
<entry>Z<subscript>30low</subscript></entry>
|
||||
<entry>Z<subscript>30high</subscript></entry>
|
||||
<entry>Z<subscript>31low</subscript></entry>
|
||||
<entry>Z<subscript>31high</subscript></entry>
|
||||
<entry>Z<subscript>32low</subscript></entry>
|
||||
<entry>Z<subscript>32high</subscript></entry>
|
||||
<entry>Z<subscript>33low</subscript></entry>
|
||||
<entry>Z<subscript>33high</subscript></entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</informaltable>
|
||||
</para>
|
||||
</formalpara>
|
||||
</example>
|
||||
</refsect1>
|
||||
</refentry>
|
|
@ -1620,6 +1620,8 @@ information.</para>
|
|||
&sub-y10b;
|
||||
&sub-y16;
|
||||
&sub-y16-be;
|
||||
&sub-y8i;
|
||||
&sub-y12i;
|
||||
&sub-uv8;
|
||||
&sub-yuyv;
|
||||
&sub-uyvy;
|
||||
|
@ -1628,7 +1630,8 @@ information.</para>
|
|||
&sub-y41p;
|
||||
&sub-yuv420;
|
||||
&sub-yuv420m;
|
||||
&sub-yvu420m;
|
||||
&sub-yuv422m;
|
||||
&sub-yuv444m;
|
||||
&sub-yuv410;
|
||||
&sub-yuv422p;
|
||||
&sub-yuv411p;
|
||||
|
@ -1641,6 +1644,14 @@ information.</para>
|
|||
&sub-m420;
|
||||
</section>
|
||||
|
||||
<section id="depth-formats">
|
||||
<title>Depth Formats</title>
|
||||
<para>Depth data provides distance to points, mapped onto the image plane
|
||||
</para>
|
||||
|
||||
&sub-z16;
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title>Compressed Formats</title>
|
||||
|
||||
|
|
|
@ -60,9 +60,19 @@ input</refpurpose>
|
|||
automatically, similar to sensing the video standard. To do so, applications
|
||||
call <constant>VIDIOC_QUERY_DV_TIMINGS</constant> with a pointer to a
|
||||
&v4l2-dv-timings;. Once the hardware detects the timings, it will fill in the
|
||||
timings structure.
|
||||
timings structure.</para>
|
||||
|
||||
If the timings could not be detected because there was no signal, then
|
||||
<para>Please note that drivers shall <emphasis>not</emphasis> switch timings automatically
|
||||
if new timings are detected. Instead, drivers should send the
|
||||
<constant>V4L2_EVENT_SOURCE_CHANGE</constant> event (if they support this) and expect
|
||||
that userspace will take action by calling <constant>VIDIOC_QUERY_DV_TIMINGS</constant>.
|
||||
The reason is that new timings usually mean different buffer sizes as well, and you
|
||||
cannot change buffer sizes on the fly. In general, applications that receive the
|
||||
Source Change event will have to call <constant>VIDIOC_QUERY_DV_TIMINGS</constant>,
|
||||
and if the detected timings are valid they will have to stop streaming, set the new
|
||||
timings, allocate new buffers and start streaming again.</para>
|
||||
|
||||
<para>If the timings could not be detected because there was no signal, then
|
||||
<errorcode>ENOLINK</errorcode> is returned. If a signal was detected, but
|
||||
it was unstable and the receiver could not lock to the signal, then
|
||||
<errorcode>ENOLCK</errorcode> is returned. If the receiver could lock to the signal,
|
||||
|
|
|
@ -59,6 +59,16 @@ then the driver will return V4L2_STD_UNKNOWN. When detection is not
|
|||
possible or fails, the set must contain all standards supported by the
|
||||
current video input or output.</para>
|
||||
|
||||
<para>Please note that drivers shall <emphasis>not</emphasis> switch the video standard
|
||||
automatically if a new video standard is detected. Instead, drivers should send the
|
||||
<constant>V4L2_EVENT_SOURCE_CHANGE</constant> event (if they support this) and expect
|
||||
that userspace will take action by calling <constant>VIDIOC_QUERYSTD</constant>.
|
||||
The reason is that a new video standard can mean different buffer sizes as well, and you
|
||||
cannot change buffer sizes on the fly. In general, applications that receive the
|
||||
Source Change event will have to call <constant>VIDIOC_QUERYSTD</constant>,
|
||||
and if the detected video standard is valid they will have to stop streaming, set the new
|
||||
standard, allocate new buffers and start streaming again.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
|
|
|
@ -20,6 +20,8 @@ Optional Properties:
|
|||
|
||||
- link-frequencies: List of allowed link frequencies in Hz. Each frequency is
|
||||
expressed as a 64-bit big-endian integer.
|
||||
- reset-gpios: GPIO handle which is connected to the reset pin of the chip.
|
||||
- standby-gpios: GPIO handle which is connected to the standby pin of the chip.
|
||||
|
||||
For further reading on port node refer to
|
||||
Documentation/devicetree/bindings/media/video-interfaces.txt.
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
* Texas Instruments TVP5150 and TVP5151 video decoders
|
||||
|
||||
The TVP5150 and TVP5151 are video decoders that convert baseband NTSC and PAL
|
||||
(and also SECAM in the TVP5151 case) video signals to either 8-bit 4:2:2 YUV
|
||||
with discrete syncs or 8-bit ITU-R BT.656 with embedded syncs output formats.
|
||||
|
||||
Required Properties:
|
||||
- compatible: value must be "ti,tvp5150"
|
||||
- reg: I2C slave address
|
||||
|
||||
Optional Properties:
|
||||
- pdn-gpios: phandle for the GPIO connected to the PDN pin, if any.
|
||||
- reset-gpios: phandle for the GPIO connected to the RESETB pin, if any.
|
||||
|
||||
The device node must contain one 'port' child node for its digital output
|
||||
video port, in accordance with the video interface bindings defined in
|
||||
Documentation/devicetree/bindings/media/video-interfaces.txt.
|
||||
|
||||
Required Endpoint Properties for parallel synchronization:
|
||||
|
||||
- hsync-active: active state of the HSYNC signal. Must be <1> (HIGH).
|
||||
- vsync-active: active state of the VSYNC signal. Must be <1> (HIGH).
|
||||
- field-even-active: field signal level during the even field data
|
||||
transmission. Must be <0>.
|
||||
|
||||
If none of hsync-active, vsync-active and field-even-active is specified,
|
||||
the endpoint is assumed to use embedded BT.656 synchronization.
|
||||
|
||||
Example:
|
||||
|
||||
&i2c2 {
|
||||
...
|
||||
tvp5150@5c {
|
||||
compatible = "ti,tvp5150";
|
||||
reg = <0x5c>;
|
||||
pdn-gpios = <&gpio4 30 GPIO_ACTIVE_LOW>;
|
||||
reset-gpios = <&gpio6 7 GPIO_ACTIVE_LOW>;
|
||||
|
||||
port {
|
||||
tvp5150_1: endpoint {
|
||||
remote-endpoint = <&ccdc_ep>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
|
@ -6,6 +6,7 @@ family of devices. The current blocks are always slaves and suppot one input
|
|||
channel which can be either RGB, YUYV or BT656.
|
||||
|
||||
- compatible: Must be one of the following
|
||||
- "renesas,vin-r8a7795" for the R8A7795 device
|
||||
- "renesas,vin-r8a7794" for the R8A7794 device
|
||||
- "renesas,vin-r8a7793" for the R8A7793 device
|
||||
- "renesas,vin-r8a7791" for the R8A7791 device
|
||||
|
|
|
@ -5,11 +5,12 @@ and decoding function conforming to the JPEG baseline process, so that the JPU
|
|||
can encode image data and decode JPEG data quickly.
|
||||
|
||||
Required properties:
|
||||
- compatible: should containg one of the following:
|
||||
- "renesas,jpu-r8a7790" for R-Car H2
|
||||
- "renesas,jpu-r8a7791" for R-Car M2-W
|
||||
- "renesas,jpu-r8a7792" for R-Car V2H
|
||||
- "renesas,jpu-r8a7793" for R-Car M2-N
|
||||
- compatible: "renesas,jpu-<soctype>", "renesas,rcar-gen2-jpu" as fallback.
|
||||
Examples with soctypes are:
|
||||
- "renesas,jpu-r8a7790" for R-Car H2
|
||||
- "renesas,jpu-r8a7791" for R-Car M2-W
|
||||
- "renesas,jpu-r8a7792" for R-Car V2H
|
||||
- "renesas,jpu-r8a7793" for R-Car M2-N
|
||||
|
||||
- reg: Base address and length of the registers block for the JPU.
|
||||
- interrupts: JPU interrupt specifier.
|
||||
|
@ -17,7 +18,7 @@ Required properties:
|
|||
|
||||
Example: R8A7790 (R-Car H2) JPU node
|
||||
jpeg-codec@fe980000 {
|
||||
compatible = "renesas,jpu-r8a7790";
|
||||
compatible = "renesas,jpu-r8a7790", "renesas,rcar-gen2-jpu";
|
||||
reg = <0 0xfe980000 0 0x10300>;
|
||||
interrupts = <0 272 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&mstp1_clks R8A7790_CLK_JPU>;
|
||||
|
|
|
@ -1,30 +1,18 @@
|
|||
* Renesas VSP1 Video Processing Engine
|
||||
* Renesas VSP Video Processing Engine
|
||||
|
||||
The VSP1 is a video processing engine that supports up-/down-scaling, alpha
|
||||
The VSP is a video processing engine that supports up-/down-scaling, alpha
|
||||
blending, color space conversion and various other image processing features.
|
||||
It can be found in the Renesas R-Car second generation SoCs.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible: Must contain "renesas,vsp1"
|
||||
- compatible: Must contain one of the following values
|
||||
- "renesas,vsp1" for the R-Car Gen2 VSP1
|
||||
- "renesas,vsp2" for the R-Car Gen3 VSP2
|
||||
|
||||
- reg: Base address and length of the registers block for the VSP1.
|
||||
- interrupts: VSP1 interrupt specifier.
|
||||
- clocks: A phandle + clock-specifier pair for the VSP1 functional clock.
|
||||
|
||||
- renesas,#rpf: Number of Read Pixel Formatter (RPF) modules in the VSP1.
|
||||
- renesas,#uds: Number of Up Down Scaler (UDS) modules in the VSP1.
|
||||
- renesas,#wpf: Number of Write Pixel Formatter (WPF) modules in the VSP1.
|
||||
|
||||
|
||||
Optional properties:
|
||||
|
||||
- renesas,has-lif: Boolean, indicates that the LCD Interface (LIF) module is
|
||||
available.
|
||||
- renesas,has-lut: Boolean, indicates that the Look Up Table (LUT) module is
|
||||
available.
|
||||
- renesas,has-sru: Boolean, indicates that the Super Resolution Unit (SRU)
|
||||
module is available.
|
||||
- reg: Base address and length of the registers block for the VSP.
|
||||
- interrupts: VSP interrupt specifier.
|
||||
- clocks: A phandle + clock-specifier pair for the VSP functional clock.
|
||||
|
||||
|
||||
Example: R8A7790 (R-Car H2) VSP1-S node
|
||||
|
@ -34,10 +22,4 @@ Example: R8A7790 (R-Car H2) VSP1-S node
|
|||
reg = <0 0xfe928000 0 0x8000>;
|
||||
interrupts = <0 267 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&mstp1_clks R8A7790_CLK_VSP1_S>;
|
||||
|
||||
renesas,has-lut;
|
||||
renesas,has-sru;
|
||||
renesas,#rpf = <5>;
|
||||
renesas,#uds = <3>;
|
||||
renesas,#wpf = <4>;
|
||||
};
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
Texas Instruments DRA72x CAMERA ADAPTATION LAYER (CAL)
|
||||
------------------------------------------------------
|
||||
|
||||
The Camera Adaptation Layer (CAL) is a key component for image capture
|
||||
applications. The capture module provides the system interface and the
|
||||
processing capability to connect CSI2 image-sensor modules to the
|
||||
DRA72x device.
|
||||
|
||||
Required properties:
|
||||
- compatible: must be "ti,dra72-cal"
|
||||
- reg: CAL Top level, Receiver Core #0, Receiver Core #1 and Camera RX
|
||||
control address space
|
||||
- reg-names: cal_top, cal_rx_core0, cal_rx_core1, and camerrx_control
|
||||
registers
|
||||
- interrupts: should contain IRQ line for the CAL;
|
||||
|
||||
CAL supports 2 camera port nodes on MIPI bus. Each CSI2 camera port nodes
|
||||
should contain a 'port' child node with child 'endpoint' node. Please
|
||||
refer to the bindings defined in
|
||||
Documentation/devicetree/bindings/media/video-interfaces.txt.
|
||||
|
||||
Example:
|
||||
cal: cal@4845b000 {
|
||||
compatible = "ti,dra72-cal";
|
||||
ti,hwmods = "cal";
|
||||
reg = <0x4845B000 0x400>,
|
||||
<0x4845B800 0x40>,
|
||||
<0x4845B900 0x40>,
|
||||
<0x4A002e94 0x4>;
|
||||
reg-names = "cal_top",
|
||||
"cal_rx_core0",
|
||||
"cal_rx_core1",
|
||||
"camerrx_control";
|
||||
interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
csi2_0: port@0 {
|
||||
reg = <0>;
|
||||
endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ar0330_1>;
|
||||
};
|
||||
};
|
||||
csi2_1: port@1 {
|
||||
reg = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
i2c5: i2c@4807c000 {
|
||||
ar0330@10 {
|
||||
compatible = "ti,ar0330";
|
||||
reg = <0x10>;
|
||||
|
||||
port {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
ar0330_1: endpoint {
|
||||
reg = <0>;
|
||||
clock-lanes = <1>;
|
||||
data-lanes = <0 2 3 4>;
|
||||
remote-endpoint = <&csi2_0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
|
@ -190,7 +190,7 @@ and watch another one.
|
|||
Patches, comments and suggestions are very very welcome.
|
||||
|
||||
3. Acknowledgements
|
||||
Amaury Demol (ademol@dibcom.fr) and Francois Kanounnikoff from DiBcom for
|
||||
Amaury Demol (Amaury.Demol@parrot.com) and Francois Kanounnikoff from DiBcom for
|
||||
providing specs, code and help, on which the dvb-dibusb, dib3000mb and
|
||||
dib3000mc are based.
|
||||
|
||||
|
|
|
@ -194,3 +194,4 @@
|
|||
193 -> WIS Voyager or compatible [1905:7007]
|
||||
194 -> AverMedia AverTV/505 [1461:a10a]
|
||||
195 -> Leadtek Winfast TV2100 FM [107d:6f3a]
|
||||
196 -> SnaZio* TVPVR PRO [1779:13cf]
|
||||
|
|
|
@ -647,7 +647,6 @@ Or you can add specific controls to a handler:
|
|||
volume = v4l2_ctrl_new_std(&video_ctrl_handler, &ops, V4L2_CID_AUDIO_VOLUME, ...);
|
||||
v4l2_ctrl_new_std(&video_ctrl_handler, &ops, V4L2_CID_BRIGHTNESS, ...);
|
||||
v4l2_ctrl_new_std(&video_ctrl_handler, &ops, V4L2_CID_CONTRAST, ...);
|
||||
v4l2_ctrl_add_ctrl(&radio_ctrl_handler, volume);
|
||||
|
||||
What you should not do is make two identical controls for two handlers.
|
||||
For example:
|
||||
|
|
12
MAINTAINERS
12
MAINTAINERS
|
@ -7236,10 +7236,8 @@ L: linux-media@vger.kernel.org
|
|||
W: https://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
|
||||
F: drivers/media/dvb-frontends/mn88473*
|
||||
|
||||
MODULE SUPPORT
|
||||
M: Rusty Russell <rusty@rustcorp.com.au>
|
||||
|
@ -10897,6 +10895,14 @@ L: linux-omap@vger.kernel.org
|
|||
S: Maintained
|
||||
F: drivers/thermal/ti-soc-thermal/
|
||||
|
||||
TI VPE/CAL DRIVERS
|
||||
M: Benoit Parrot <bparrot@ti.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
S: Maintained
|
||||
F: drivers/media/platform/ti-vpe/
|
||||
|
||||
TI CDCE706 CLOCK DRIVER
|
||||
M: Max Filippov <jcmvbkbc@gmail.com>
|
||||
S: Maintained
|
||||
|
|
|
@ -38,7 +38,7 @@ static int flexcop_fe_request_firmware(struct dvb_frontend *fe,
|
|||
#endif
|
||||
|
||||
/* lnb control */
|
||||
#if FE_SUPPORTED(MT312) || FE_SUPPORTED(STV0299)
|
||||
#if (FE_SUPPORTED(MT312) || FE_SUPPORTED(STV0299)) && FE_SUPPORTED(PLL)
|
||||
static int flexcop_set_voltage(struct dvb_frontend *fe,
|
||||
enum fe_sec_voltage voltage)
|
||||
{
|
||||
|
@ -68,7 +68,7 @@ static int flexcop_set_voltage(struct dvb_frontend *fe,
|
|||
#endif
|
||||
|
||||
#if FE_SUPPORTED(S5H1420) || FE_SUPPORTED(STV0299) || FE_SUPPORTED(MT312)
|
||||
static int flexcop_sleep(struct dvb_frontend* fe)
|
||||
static int __maybe_unused flexcop_sleep(struct dvb_frontend* fe)
|
||||
{
|
||||
struct flexcop_device *fc = fe->dvb->priv;
|
||||
if (fc->fe_sleep)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Linux driver for digital TV devices equipped with B2C2 FlexcopII(b)/III
|
||||
* flexcop.c - main module part
|
||||
* Copyright (C) 2004-9 Patrick Boettcher <patrick.boettcher@desy.de>
|
||||
* Copyright (C) 2004-9 Patrick Boettcher <patrick.boettcher@posteo.de>
|
||||
* based on skystar2-driver Copyright (C) 2003 Vadim Catana, skystar@moldova.cc
|
||||
*
|
||||
* Acknowledgements:
|
||||
|
@ -34,7 +34,7 @@
|
|||
#include "flexcop.h"
|
||||
|
||||
#define DRIVER_NAME "B2C2 FlexcopII/II(b)/III digital TV receiver chip"
|
||||
#define DRIVER_AUTHOR "Patrick Boettcher <patrick.boettcher@desy.de"
|
||||
#define DRIVER_AUTHOR "Patrick Boettcher <patrick.boettcher@posteo.de"
|
||||
|
||||
#ifdef CONFIG_DVB_B2C2_FLEXCOP_DEBUG
|
||||
#define DEBSTATUS ""
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* cypress_firmware.c is part of the DVB USB library.
|
||||
*
|
||||
* Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@desy.de)
|
||||
* Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@posteo.de)
|
||||
* see dvb-usb-init.c for copyright information.
|
||||
*
|
||||
* This file contains functions for downloading the firmware to Cypress FX 1
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@desy.de)
|
||||
* Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@posteo.de)
|
||||
* see dvb-usb-init.c for copyright information.
|
||||
*
|
||||
* This file contains functions for downloading the firmware to Cypress FX 1
|
||||
|
|
|
@ -1167,8 +1167,8 @@ static int smscore_load_firmware_from_file(struct smscore_device_t *coredev,
|
|||
return rc;
|
||||
}
|
||||
pr_debug("read fw %s, buffer size=0x%zx\n", fw_filename, fw->size);
|
||||
fw_buf = kmalloc(ALIGN(fw->size, SMS_ALLOC_ALIGNMENT),
|
||||
GFP_KERNEL | GFP_DMA);
|
||||
fw_buf = kmalloc(ALIGN(fw->size + sizeof(struct sms_firmware),
|
||||
SMS_ALLOC_ALIGNMENT), GFP_KERNEL | GFP_DMA);
|
||||
if (!fw_buf) {
|
||||
pr_err("failed to allocate firmware buffer\n");
|
||||
rc = -ENOMEM;
|
||||
|
|
|
@ -1015,12 +1015,6 @@ static int smsdvb_set_frontend(struct dvb_frontend *fe)
|
|||
}
|
||||
}
|
||||
|
||||
/* Nothing to do here, as stats are automatically updated */
|
||||
static int smsdvb_get_frontend(struct dvb_frontend *fe)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int smsdvb_init(struct dvb_frontend *fe)
|
||||
{
|
||||
struct smsdvb_client_t *client =
|
||||
|
@ -1069,7 +1063,6 @@ static struct dvb_frontend_ops smsdvb_fe_ops = {
|
|||
.release = smsdvb_release,
|
||||
|
||||
.set_frontend = smsdvb_set_frontend,
|
||||
.get_frontend = smsdvb_get_frontend,
|
||||
.get_tune_settings = smsdvb_get_tune_settings,
|
||||
|
||||
.read_status = smsdvb_read_status,
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* dvb-usb-ids.h is part of the DVB USB library.
|
||||
*
|
||||
* Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de) see
|
||||
* Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@posteo.de) see
|
||||
* dvb-usb-init.c for copyright information.
|
||||
*
|
||||
* a header file containing define's for the USB device supported by the
|
||||
|
@ -118,6 +118,7 @@
|
|||
#define USB_PID_DIBCOM_STK807XP 0x1f90
|
||||
#define USB_PID_DIBCOM_STK807XPVR 0x1f98
|
||||
#define USB_PID_DIBCOM_STK8096GP 0x1fa0
|
||||
#define USB_PID_DIBCOM_STK8096PVR 0x1faa
|
||||
#define USB_PID_DIBCOM_NIM8096MD 0x1fa8
|
||||
#define USB_PID_DIBCOM_TFE8096P 0x1f9C
|
||||
#define USB_PID_DIBCOM_ANCHOR_2135_COLD 0x2131
|
||||
|
@ -241,12 +242,14 @@
|
|||
#define USB_PID_AVERMEDIA_1867 0x1867
|
||||
#define USB_PID_AVERMEDIA_A867 0xa867
|
||||
#define USB_PID_AVERMEDIA_H335 0x0335
|
||||
#define USB_PID_AVERMEDIA_TD110 0xa110
|
||||
#define USB_PID_AVERMEDIA_TWINSTAR 0x0825
|
||||
#define USB_PID_TECHNOTREND_CONNECT_S2400 0x3006
|
||||
#define USB_PID_TECHNOTREND_CONNECT_S2400_8KEEPROM 0x3009
|
||||
#define USB_PID_TECHNOTREND_CONNECT_CT3650 0x300d
|
||||
#define USB_PID_TECHNOTREND_CONNECT_S2_4600 0x3011
|
||||
#define USB_PID_TECHNOTREND_CONNECT_CT2_4650_CI 0x3012
|
||||
#define USB_PID_TECHNOTREND_CONNECT_CT2_4650_CI_2 0x3015
|
||||
#define USB_PID_TECHNOTREND_TVSTICK_CT2_4400 0x3014
|
||||
#define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY 0x005a
|
||||
#define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2 0x0081
|
||||
|
@ -255,6 +258,10 @@
|
|||
#define USB_PID_TERRATEC_CINERGY_T_EXPRESS 0x0062
|
||||
#define USB_PID_TERRATEC_CINERGY_T_XXS 0x0078
|
||||
#define USB_PID_TERRATEC_CINERGY_T_XXS_2 0x00ab
|
||||
#define USB_PID_TERRATEC_CINERGY_S2_R1 0x00a8
|
||||
#define USB_PID_TERRATEC_CINERGY_S2_R2 0x00b0
|
||||
#define USB_PID_TERRATEC_CINERGY_S2_R3 0x0102
|
||||
#define USB_PID_TERRATEC_CINERGY_S2_R4 0x0105
|
||||
#define USB_PID_TERRATEC_H7 0x10b4
|
||||
#define USB_PID_TERRATEC_H7_2 0x10a3
|
||||
#define USB_PID_TERRATEC_H7_3 0x10a5
|
||||
|
|
|
@ -134,15 +134,17 @@ struct dvb_frontend_private {
|
|||
|
||||
#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
|
||||
struct media_pipeline pipe;
|
||||
struct media_entity *pipe_start_entity;
|
||||
#endif
|
||||
};
|
||||
|
||||
static void dvb_frontend_wakeup(struct dvb_frontend *fe);
|
||||
static int dtv_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c,
|
||||
struct dvb_frontend_parameters *p_out);
|
||||
static int dtv_property_legacy_params_sync(struct dvb_frontend *fe,
|
||||
struct dvb_frontend_parameters *p);
|
||||
static int
|
||||
dtv_property_legacy_params_sync(struct dvb_frontend *fe,
|
||||
const struct dtv_frontend_properties *c,
|
||||
struct dvb_frontend_parameters *p);
|
||||
|
||||
static bool has_get_frontend(struct dvb_frontend *fe)
|
||||
{
|
||||
|
@ -202,6 +204,7 @@ static void dvb_frontend_add_event(struct dvb_frontend *fe,
|
|||
enum fe_status status)
|
||||
{
|
||||
struct dvb_frontend_private *fepriv = fe->frontend_priv;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
struct dvb_fe_events *events = &fepriv->events;
|
||||
struct dvb_frontend_event *e;
|
||||
int wp;
|
||||
|
@ -209,7 +212,7 @@ static void dvb_frontend_add_event(struct dvb_frontend *fe,
|
|||
dev_dbg(fe->dvb->device, "%s:\n", __func__);
|
||||
|
||||
if ((status & FE_HAS_LOCK) && has_get_frontend(fe))
|
||||
dtv_get_frontend(fe, &fepriv->parameters_out);
|
||||
dtv_get_frontend(fe, c, &fepriv->parameters_out);
|
||||
|
||||
mutex_lock(&events->mtx);
|
||||
|
||||
|
@ -596,104 +599,13 @@ static void dvb_frontend_wakeup(struct dvb_frontend *fe)
|
|||
wake_up_interruptible(&fepriv->wait_queue);
|
||||
}
|
||||
|
||||
/**
|
||||
* dvb_enable_media_tuner() - tries to enable the DVB tuner
|
||||
*
|
||||
* @fe: struct dvb_frontend pointer
|
||||
*
|
||||
* This function ensures that just one media tuner is enabled for a given
|
||||
* frontend. It has two different behaviors:
|
||||
* - For trivial devices with just one tuner:
|
||||
* it just enables the existing tuner->fe link
|
||||
* - For devices with more than one tuner:
|
||||
* It is up to the driver to implement the logic that will enable one tuner
|
||||
* and disable the other ones. However, if more than one tuner is enabled for
|
||||
* the same frontend, it will print an error message and return -EINVAL.
|
||||
*
|
||||
* At return, it will return the error code returned by media_entity_setup_link,
|
||||
* or 0 if everything is OK, if no tuner is linked to the frontend or if the
|
||||
* mdev is NULL.
|
||||
*/
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER_DVB
|
||||
static int dvb_enable_media_tuner(struct dvb_frontend *fe)
|
||||
{
|
||||
struct dvb_frontend_private *fepriv = fe->frontend_priv;
|
||||
struct dvb_adapter *adapter = fe->dvb;
|
||||
struct media_device *mdev = adapter->mdev;
|
||||
struct media_entity *entity, *source;
|
||||
struct media_link *link, *found_link = NULL;
|
||||
int ret, n_links = 0, active_links = 0;
|
||||
|
||||
fepriv->pipe_start_entity = NULL;
|
||||
|
||||
if (!mdev)
|
||||
return 0;
|
||||
|
||||
entity = fepriv->dvbdev->entity;
|
||||
fepriv->pipe_start_entity = entity;
|
||||
|
||||
list_for_each_entry(link, &entity->links, list) {
|
||||
if (link->sink->entity == entity) {
|
||||
found_link = link;
|
||||
n_links++;
|
||||
if (link->flags & MEDIA_LNK_FL_ENABLED)
|
||||
active_links++;
|
||||
}
|
||||
}
|
||||
|
||||
if (!n_links || active_links == 1 || !found_link)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* If a frontend has more than one tuner linked, it is up to the driver
|
||||
* to select with one will be the active one, as the frontend core can't
|
||||
* guess. If the driver doesn't do that, it is a bug.
|
||||
*/
|
||||
if (n_links > 1 && active_links != 1) {
|
||||
dev_err(fe->dvb->device,
|
||||
"WARNING: there are %d active links among %d tuners. This is a driver's bug!\n",
|
||||
active_links, n_links);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
source = found_link->source->entity;
|
||||
fepriv->pipe_start_entity = source;
|
||||
list_for_each_entry(link, &source->links, list) {
|
||||
struct media_entity *sink;
|
||||
int flags = 0;
|
||||
|
||||
sink = link->sink->entity;
|
||||
if (sink == entity)
|
||||
flags = MEDIA_LNK_FL_ENABLED;
|
||||
|
||||
ret = media_entity_setup_link(link, flags);
|
||||
if (ret) {
|
||||
dev_err(fe->dvb->device,
|
||||
"Couldn't change link %s->%s to %s. Error %d\n",
|
||||
source->name, sink->name,
|
||||
flags ? "enabled" : "disabled",
|
||||
ret);
|
||||
return ret;
|
||||
} else
|
||||
dev_dbg(fe->dvb->device,
|
||||
"link %s->%s was %s\n",
|
||||
source->name, sink->name,
|
||||
flags ? "ENABLED" : "disabled");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int dvb_frontend_thread(void *data)
|
||||
{
|
||||
struct dvb_frontend *fe = data;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
struct dvb_frontend_private *fepriv = fe->frontend_priv;
|
||||
enum fe_status s;
|
||||
enum dvbfe_algo algo;
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER_DVB
|
||||
int ret;
|
||||
#endif
|
||||
|
||||
bool re_tune = false;
|
||||
bool semheld = false;
|
||||
|
||||
|
@ -706,20 +618,6 @@ static int dvb_frontend_thread(void *data)
|
|||
fepriv->wakeup = 0;
|
||||
fepriv->reinitialise = 0;
|
||||
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER_DVB
|
||||
ret = dvb_enable_media_tuner(fe);
|
||||
if (ret) {
|
||||
/* FIXME: return an error if it fails */
|
||||
dev_info(fe->dvb->device,
|
||||
"proceeding with FE task\n");
|
||||
} else if (fepriv->pipe_start_entity) {
|
||||
ret = media_entity_pipeline_start(fepriv->pipe_start_entity,
|
||||
&fepriv->pipe);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
dvb_frontend_init(fe);
|
||||
|
||||
set_freezable();
|
||||
|
@ -807,7 +705,7 @@ restart:
|
|||
fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
|
||||
fepriv->delay = HZ / 2;
|
||||
}
|
||||
dtv_property_legacy_params_sync(fe, &fepriv->parameters_out);
|
||||
dtv_property_legacy_params_sync(fe, c, &fepriv->parameters_out);
|
||||
fe->ops.read_status(fe, &s);
|
||||
if (s != fepriv->status) {
|
||||
dvb_frontend_add_event(fe, s); /* update event list */
|
||||
|
@ -829,12 +727,6 @@ restart:
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER_DVB
|
||||
if (fepriv->pipe_start_entity)
|
||||
media_entity_pipeline_stop(fepriv->pipe_start_entity);
|
||||
fepriv->pipe_start_entity = NULL;
|
||||
#endif
|
||||
|
||||
if (dvb_powerdown_on_sleep) {
|
||||
if (fe->ops.set_voltage)
|
||||
fe->ops.set_voltage(fe, SEC_VOLTAGE_OFF);
|
||||
|
@ -899,10 +791,10 @@ void dvb_frontend_sleep_until(ktime_t *waketime, u32 add_usec)
|
|||
s32 delta;
|
||||
|
||||
*waketime = ktime_add_us(*waketime, add_usec);
|
||||
delta = ktime_us_delta(ktime_get_real(), *waketime);
|
||||
delta = ktime_us_delta(ktime_get_boottime(), *waketime);
|
||||
if (delta > 2500) {
|
||||
msleep((delta - 1500) / 1000);
|
||||
delta = ktime_us_delta(ktime_get_real(), *waketime);
|
||||
delta = ktime_us_delta(ktime_get_boottime(), *waketime);
|
||||
}
|
||||
if (delta > 0)
|
||||
udelay(delta);
|
||||
|
@ -1162,18 +1054,24 @@ static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = {
|
|||
_DTV_CMD(DTV_STAT_TOTAL_BLOCK_COUNT, 0, 0),
|
||||
};
|
||||
|
||||
static void dtv_property_dump(struct dvb_frontend *fe, struct dtv_property *tvp)
|
||||
static void dtv_property_dump(struct dvb_frontend *fe,
|
||||
bool is_set,
|
||||
struct dtv_property *tvp)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (tvp->cmd <= 0 || tvp->cmd > DTV_MAX_COMMAND) {
|
||||
dev_warn(fe->dvb->device, "%s: tvp.cmd = 0x%08x undefined\n",
|
||||
__func__, tvp->cmd);
|
||||
dev_warn(fe->dvb->device, "%s: %s tvp.cmd = 0x%08x undefined\n",
|
||||
__func__,
|
||||
is_set ? "SET" : "GET",
|
||||
tvp->cmd);
|
||||
return;
|
||||
}
|
||||
|
||||
dev_dbg(fe->dvb->device, "%s: tvp.cmd = 0x%08x (%s)\n", __func__,
|
||||
tvp->cmd, dtv_cmds[tvp->cmd].name);
|
||||
dev_dbg(fe->dvb->device, "%s: %s tvp.cmd = 0x%08x (%s)\n", __func__,
|
||||
is_set ? "SET" : "GET",
|
||||
tvp->cmd,
|
||||
dtv_cmds[tvp->cmd].name);
|
||||
|
||||
if (dtv_cmds[tvp->cmd].buffer) {
|
||||
dev_dbg(fe->dvb->device, "%s: tvp.u.buffer.len = 0x%02x\n",
|
||||
|
@ -1268,11 +1166,11 @@ static int dtv_property_cache_sync(struct dvb_frontend *fe,
|
|||
/* Ensure the cached values are set correctly in the frontend
|
||||
* legacy tuning structures, for the advanced tuning API.
|
||||
*/
|
||||
static int dtv_property_legacy_params_sync(struct dvb_frontend *fe,
|
||||
struct dvb_frontend_parameters *p)
|
||||
static int
|
||||
dtv_property_legacy_params_sync(struct dvb_frontend *fe,
|
||||
const struct dtv_frontend_properties *c,
|
||||
struct dvb_frontend_parameters *p)
|
||||
{
|
||||
const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
|
||||
p->frequency = c->frequency;
|
||||
p->inversion = c->inversion;
|
||||
|
||||
|
@ -1344,16 +1242,17 @@ static int dtv_property_legacy_params_sync(struct dvb_frontend *fe,
|
|||
* If p_out is not null, it will update the DVBv3 params pointed by it.
|
||||
*/
|
||||
static int dtv_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c,
|
||||
struct dvb_frontend_parameters *p_out)
|
||||
{
|
||||
int r;
|
||||
|
||||
if (fe->ops.get_frontend) {
|
||||
r = fe->ops.get_frontend(fe);
|
||||
r = fe->ops.get_frontend(fe, c);
|
||||
if (unlikely(r < 0))
|
||||
return r;
|
||||
if (p_out)
|
||||
dtv_property_legacy_params_sync(fe, p_out);
|
||||
dtv_property_legacy_params_sync(fe, c, p_out);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1589,7 +1488,7 @@ static int dtv_property_process_get(struct dvb_frontend *fe,
|
|||
return r;
|
||||
}
|
||||
|
||||
dtv_property_dump(fe, tvp);
|
||||
dtv_property_dump(fe, false, tvp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1830,6 +1729,8 @@ static int dtv_property_process_set(struct dvb_frontend *fe,
|
|||
return r;
|
||||
}
|
||||
|
||||
dtv_property_dump(fe, true, tvp);
|
||||
|
||||
switch(tvp->cmd) {
|
||||
case DTV_CLEAR:
|
||||
/*
|
||||
|
@ -2073,6 +1974,8 @@ static int dvb_frontend_ioctl_properties(struct file *file,
|
|||
dev_dbg(fe->dvb->device, "%s: Property cache is full, tuning\n", __func__);
|
||||
|
||||
} else if (cmd == FE_GET_PROPERTY) {
|
||||
struct dtv_frontend_properties getp = fe->dtv_property_cache;
|
||||
|
||||
dev_dbg(fe->dvb->device, "%s: properties.num = %d\n", __func__, tvps->num);
|
||||
dev_dbg(fe->dvb->device, "%s: properties.props = %p\n", __func__, tvps->props);
|
||||
|
||||
|
@ -2094,17 +1997,18 @@ static int dvb_frontend_ioctl_properties(struct file *file,
|
|||
}
|
||||
|
||||
/*
|
||||
* Fills the cache out struct with the cache contents, plus
|
||||
* the data retrieved from get_frontend, if the frontend
|
||||
* is not idle. Otherwise, returns the cached content
|
||||
* Let's use our own copy of property cache, in order to
|
||||
* avoid mangling with DTV zigzag logic, as drivers might
|
||||
* return crap, if they don't check if the data is available
|
||||
* before updating the properties cache.
|
||||
*/
|
||||
if (fepriv->state != FESTATE_IDLE) {
|
||||
err = dtv_get_frontend(fe, NULL);
|
||||
err = dtv_get_frontend(fe, &getp, NULL);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
}
|
||||
for (i = 0; i < tvps->num; i++) {
|
||||
err = dtv_property_process_get(fe, c, tvp + i, file);
|
||||
err = dtv_property_process_get(fe, &getp, tvp + i, file);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
(tvp + i)->result = err;
|
||||
|
@ -2139,7 +2043,7 @@ static int dtv_set_frontend(struct dvb_frontend *fe)
|
|||
* the user. FE_SET_FRONTEND triggers an initial frontend event
|
||||
* with status = 0, which copies output parameters to userspace.
|
||||
*/
|
||||
dtv_property_legacy_params_sync(fe, &fepriv->parameters_out);
|
||||
dtv_property_legacy_params_sync(fe, c, &fepriv->parameters_out);
|
||||
|
||||
/*
|
||||
* Be sure that the bandwidth will be filled for all
|
||||
|
@ -2451,7 +2355,7 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
|
|||
u8 last = 1;
|
||||
if (dvb_frontend_debug)
|
||||
printk("%s switch command: 0x%04lx\n", __func__, swcmd);
|
||||
nexttime = ktime_get_real();
|
||||
nexttime = ktime_get_boottime();
|
||||
if (dvb_frontend_debug)
|
||||
tv[0] = nexttime;
|
||||
/* before sending a command, initialize by sending
|
||||
|
@ -2462,7 +2366,7 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
|
|||
|
||||
for (i = 0; i < 9; i++) {
|
||||
if (dvb_frontend_debug)
|
||||
tv[i+1] = ktime_get_real();
|
||||
tv[i+1] = ktime_get_boottime();
|
||||
if ((swcmd & 0x01) != last) {
|
||||
/* set voltage to (last ? 13V : 18V) */
|
||||
fe->ops.set_voltage(fe, (last) ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18);
|
||||
|
@ -2509,10 +2413,18 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
|
|||
err = dvb_frontend_get_event (fe, parg, file->f_flags);
|
||||
break;
|
||||
|
||||
case FE_GET_FRONTEND:
|
||||
err = dtv_get_frontend(fe, parg);
|
||||
break;
|
||||
case FE_GET_FRONTEND: {
|
||||
struct dtv_frontend_properties getp = fe->dtv_property_cache;
|
||||
|
||||
/*
|
||||
* Let's use our own copy of property cache, in order to
|
||||
* avoid mangling with DTV zigzag logic, as drivers might
|
||||
* return crap, if they don't check if the data is available
|
||||
* before updating the properties cache.
|
||||
*/
|
||||
err = dtv_get_frontend(fe, &getp, parg);
|
||||
break;
|
||||
}
|
||||
case FE_SET_FRONTEND_TUNE_MODE:
|
||||
fepriv->tune_mode_flags = (unsigned long) parg;
|
||||
err = 0;
|
||||
|
@ -2612,9 +2524,20 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
|
|||
fepriv->tone = -1;
|
||||
fepriv->voltage = -1;
|
||||
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER_DVB
|
||||
if (fe->dvb->mdev && fe->dvb->mdev->enable_source) {
|
||||
ret = fe->dvb->mdev->enable_source(dvbdev->entity,
|
||||
&fepriv->pipe);
|
||||
if (ret) {
|
||||
dev_err(fe->dvb->device,
|
||||
"Tuner is busy. Error %d\n", ret);
|
||||
goto err2;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
ret = dvb_frontend_start (fe);
|
||||
if (ret)
|
||||
goto err2;
|
||||
goto err3;
|
||||
|
||||
/* empty event queue */
|
||||
fepriv->events.eventr = fepriv->events.eventw = 0;
|
||||
|
@ -2624,7 +2547,12 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
|
|||
mutex_unlock (&adapter->mfe_lock);
|
||||
return ret;
|
||||
|
||||
err3:
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER_DVB
|
||||
if (fe->dvb->mdev && fe->dvb->mdev->disable_source)
|
||||
fe->dvb->mdev->disable_source(dvbdev->entity);
|
||||
err2:
|
||||
#endif
|
||||
dvb_generic_release(inode, file);
|
||||
err1:
|
||||
if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl)
|
||||
|
@ -2653,6 +2581,10 @@ static int dvb_frontend_release(struct inode *inode, struct file *file)
|
|||
|
||||
if (dvbdev->users == -1) {
|
||||
wake_up(&fepriv->wait_queue);
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER_DVB
|
||||
if (fe->dvb->mdev && fe->dvb->mdev->disable_source)
|
||||
fe->dvb->mdev->disable_source(dvbdev->entity);
|
||||
#endif
|
||||
if (fe->exit != DVB_FE_NO_EXIT)
|
||||
wake_up(&dvbdev->wait_queue);
|
||||
if (fe->ops.ts_bus_ctrl)
|
||||
|
|
|
@ -449,7 +449,8 @@ struct dvb_frontend_ops {
|
|||
int (*set_frontend)(struct dvb_frontend *fe);
|
||||
int (*get_tune_settings)(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* settings);
|
||||
|
||||
int (*get_frontend)(struct dvb_frontend *fe);
|
||||
int (*get_frontend)(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *props);
|
||||
|
||||
int (*read_status)(struct dvb_frontend *fe, enum fe_status *status);
|
||||
int (*read_ber)(struct dvb_frontend* fe, u32* ber);
|
||||
|
|
|
@ -58,7 +58,7 @@ static const char * const dnames[] = {
|
|||
#define DVB_MAX_IDS MAX_DVB_MINORS
|
||||
#else
|
||||
#define DVB_MAX_IDS 4
|
||||
#define nums2minor(num,type,id) ((num << 6) | (id << 4) | type)
|
||||
#define nums2minor(num, type, id) ((num << 6) | (id << 4) | type)
|
||||
#define MAX_DVB_MINORS (DVB_MAX_ADAPTERS*64)
|
||||
#endif
|
||||
|
||||
|
@ -85,7 +85,7 @@ static int dvb_device_open(struct inode *inode, struct file *file)
|
|||
file->private_data = dvbdev;
|
||||
replace_fops(file, new_fops);
|
||||
if (file->f_op->open)
|
||||
err = file->f_op->open(inode,file);
|
||||
err = file->f_op->open(inode, file);
|
||||
up_read(&minor_rwsem);
|
||||
mutex_unlock(&dvbdev_mutex);
|
||||
return err;
|
||||
|
@ -352,7 +352,7 @@ static int dvb_create_media_entity(struct dvb_device *dvbdev,
|
|||
ret = media_device_register_entity(dvbdev->adapter->mdev,
|
||||
dvbdev->entity);
|
||||
if (ret)
|
||||
return (ret);
|
||||
return ret;
|
||||
|
||||
printk(KERN_DEBUG "%s: media entity '%s' registered.\n",
|
||||
__func__, dvbdev->entity->name);
|
||||
|
@ -620,8 +620,7 @@ int dvb_create_media_graph(struct dvb_adapter *adap,
|
|||
return -ENOMEM;
|
||||
adap->conn = conn;
|
||||
|
||||
adap->conn_pads = kcalloc(1, sizeof(*adap->conn_pads),
|
||||
GFP_KERNEL);
|
||||
adap->conn_pads = kzalloc(sizeof(*adap->conn_pads), GFP_KERNEL);
|
||||
if (!adap->conn_pads)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -661,7 +660,7 @@ int dvb_create_media_graph(struct dvb_adapter *adap,
|
|||
if (ntuner && ndemod) {
|
||||
ret = media_create_pad_links(mdev,
|
||||
MEDIA_ENT_F_TUNER,
|
||||
tuner, TUNER_PAD_IF_OUTPUT,
|
||||
tuner, TUNER_PAD_OUTPUT,
|
||||
MEDIA_ENT_F_DTV_DEMOD,
|
||||
demod, 0, MEDIA_LNK_FL_ENABLED,
|
||||
false);
|
||||
|
@ -682,7 +681,7 @@ int dvb_create_media_graph(struct dvb_adapter *adap,
|
|||
if (demux && ca) {
|
||||
ret = media_create_pad_link(demux, 1, ca,
|
||||
0, MEDIA_LNK_FL_ENABLED);
|
||||
if (!ret)
|
||||
if (ret)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -868,7 +867,7 @@ int dvb_usercopy(struct file *file,
|
|||
parg = sbuf;
|
||||
} else {
|
||||
/* too big to allocate from stack */
|
||||
mbuf = kmalloc(_IOC_SIZE(cmd),GFP_KERNEL);
|
||||
mbuf = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL);
|
||||
if (NULL == mbuf)
|
||||
return -ENOMEM;
|
||||
parg = mbuf;
|
||||
|
|
|
@ -73,6 +73,14 @@ config DVB_SI2165
|
|||
|
||||
Say Y when you want to support this frontend.
|
||||
|
||||
config DVB_MN88473
|
||||
tristate "Panasonic MN88473"
|
||||
depends on DVB_CORE && I2C
|
||||
select REGMAP_I2C
|
||||
default m if !MEDIA_SUBDRV_AUTOSELECT
|
||||
help
|
||||
Say Y when you want to support this frontend.
|
||||
|
||||
comment "DVB-S (satellite) frontends"
|
||||
depends on DVB_CORE
|
||||
|
||||
|
|
|
@ -95,6 +95,7 @@ obj-$(CONFIG_DVB_STV0900) += stv0900.o
|
|||
obj-$(CONFIG_DVB_STV090x) += stv090x.o
|
||||
obj-$(CONFIG_DVB_STV6110x) += stv6110x.o
|
||||
obj-$(CONFIG_DVB_M88DS3103) += m88ds3103.o
|
||||
obj-$(CONFIG_DVB_MN88473) += mn88473.o
|
||||
obj-$(CONFIG_DVB_ISL6423) += isl6423.o
|
||||
obj-$(CONFIG_DVB_EC100) += ec100.o
|
||||
obj-$(CONFIG_DVB_HD29L2) += hd29l2.o
|
||||
|
|
|
@ -866,9 +866,9 @@ err:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int af9013_get_frontend(struct dvb_frontend *fe)
|
||||
static int af9013_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
struct af9013_state *state = fe->demodulator_priv;
|
||||
int ret;
|
||||
u8 buf[3];
|
||||
|
@ -1344,6 +1344,10 @@ err:
|
|||
static void af9013_release(struct dvb_frontend *fe)
|
||||
{
|
||||
struct af9013_state *state = fe->demodulator_priv;
|
||||
|
||||
/* stop statistics polling */
|
||||
cancel_delayed_work_sync(&state->statistics_work);
|
||||
|
||||
kfree(state);
|
||||
}
|
||||
|
||||
|
|
|
@ -691,10 +691,10 @@ err:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int af9033_get_frontend(struct dvb_frontend *fe)
|
||||
static int af9033_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct af9033_dev *dev = fe->demodulator_priv;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
int ret;
|
||||
u8 buf[8];
|
||||
|
||||
|
@ -1372,6 +1372,9 @@ static int af9033_remove(struct i2c_client *client)
|
|||
|
||||
dev_dbg(&dev->client->dev, "\n");
|
||||
|
||||
/* stop statistics polling */
|
||||
cancel_delayed_work_sync(&dev->stat_work);
|
||||
|
||||
dev->fe.ops.release = NULL;
|
||||
dev->fe.demodulator_priv = NULL;
|
||||
kfree(dev);
|
||||
|
|
|
@ -190,10 +190,10 @@ static int as102_fe_set_frontend(struct dvb_frontend *fe)
|
|||
return state->ops->set_tune(state->priv, &tune_args);
|
||||
}
|
||||
|
||||
static int as102_fe_get_frontend(struct dvb_frontend *fe)
|
||||
static int as102_fe_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct as102_state *state = fe->demodulator_priv;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
int ret = 0;
|
||||
struct as10x_tps tps = { 0 };
|
||||
|
||||
|
|
|
@ -297,9 +297,9 @@ static int atbm8830_set_fe(struct dvb_frontend *fe)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int atbm8830_get_fe(struct dvb_frontend *fe)
|
||||
static int atbm8830_get_fe(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
dprintk("%s\n", __func__);
|
||||
|
||||
/* TODO: get real readings from device */
|
||||
|
|
|
@ -89,5 +89,4 @@ enum au8522_audio_input {
|
|||
AU8522_AUDIO_NONE,
|
||||
AU8522_AUDIO_SIF,
|
||||
};
|
||||
|
||||
#endif /* __AU8522_H__ */
|
||||
|
|
|
@ -763,9 +763,10 @@ static int au8522_probe(struct i2c_client *client,
|
|||
v4l2_i2c_subdev_init(sd, client, &au8522_ops);
|
||||
#if defined(CONFIG_MEDIA_CONTROLLER)
|
||||
|
||||
state->pads[AU8522_PAD_INPUT].flags = MEDIA_PAD_FL_SINK;
|
||||
state->pads[AU8522_PAD_VID_OUT].flags = MEDIA_PAD_FL_SOURCE;
|
||||
state->pads[AU8522_PAD_VBI_OUT].flags = MEDIA_PAD_FL_SOURCE;
|
||||
state->pads[DEMOD_PAD_IF_INPUT].flags = MEDIA_PAD_FL_SINK;
|
||||
state->pads[DEMOD_PAD_VID_OUT].flags = MEDIA_PAD_FL_SOURCE;
|
||||
state->pads[DEMOD_PAD_VBI_OUT].flags = MEDIA_PAD_FL_SOURCE;
|
||||
state->pads[DEMOD_PAD_AUDIO_OUT].flags = MEDIA_PAD_FL_SOURCE;
|
||||
sd->entity.function = MEDIA_ENT_F_ATV_DECODER;
|
||||
|
||||
ret = media_entity_pads_init(&sd->entity, ARRAY_SIZE(state->pads),
|
||||
|
|
|
@ -816,9 +816,9 @@ static int au8522_read_ber(struct dvb_frontend *fe, u32 *ber)
|
|||
return au8522_read_ucblocks(fe, ber);
|
||||
}
|
||||
|
||||
static int au8522_get_frontend(struct dvb_frontend *fe)
|
||||
static int au8522_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
struct au8522_state *state = fe->demodulator_priv;
|
||||
|
||||
c->frequency = state->current_frequency;
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <linux/videodev2.h>
|
||||
#include <media/v4l2-device.h>
|
||||
#include <media/v4l2-ctrls.h>
|
||||
#include <media/v4l2-mc.h>
|
||||
#include <linux/i2c.h>
|
||||
#include "dvb_frontend.h"
|
||||
#include "au8522.h"
|
||||
|
@ -39,14 +40,6 @@
|
|||
#define AU8522_DIGITAL_MODE 1
|
||||
#define AU8522_SUSPEND_MODE 2
|
||||
|
||||
enum au8522_media_pads {
|
||||
AU8522_PAD_INPUT,
|
||||
AU8522_PAD_VID_OUT,
|
||||
AU8522_PAD_VBI_OUT,
|
||||
|
||||
AU8522_NUM_PADS
|
||||
};
|
||||
|
||||
struct au8522_state {
|
||||
struct i2c_client *c;
|
||||
struct i2c_adapter *i2c;
|
||||
|
@ -78,7 +71,7 @@ struct au8522_state {
|
|||
struct v4l2_ctrl_handler hdl;
|
||||
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER
|
||||
struct media_pad pads[AU8522_NUM_PADS];
|
||||
struct media_pad pads[DEMOD_NUM_PADS];
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright (C) 2001-5, B2C2 inc.
|
||||
*
|
||||
* GPL/Linux driver written by Patrick Boettcher <patrick.boettcher@desy.de>
|
||||
* GPL/Linux driver written by Patrick Boettcher <patrick.boettcher@posteo.de>
|
||||
*
|
||||
* This driver is "hard-coded" to be used with the 1st generation of
|
||||
* Technisat/B2C2's Air2PC ATSC PCI/USB cards/boxes. The pll-programming
|
||||
|
@ -865,5 +865,5 @@ static struct dvb_frontend_ops bcm3510_ops = {
|
|||
};
|
||||
|
||||
MODULE_DESCRIPTION("Broadcom BCM3510 ATSC (8VSB/16VSB & ITU J83 AnnexB FEC QAM64/256) demodulator driver");
|
||||
MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>");
|
||||
MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright (C) 2001-5, B2C2 inc.
|
||||
*
|
||||
* GPL/Linux driver written by Patrick Boettcher <patrick.boettcher@desy.de>
|
||||
* GPL/Linux driver written by Patrick Boettcher <patrick.boettcher@posteo.de>
|
||||
*
|
||||
* 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
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright (C) 2001-5, B2C2 inc.
|
||||
*
|
||||
* GPL/Linux driver written by Patrick Boettcher <patrick.boettcher@desy.de>
|
||||
* GPL/Linux driver written by Patrick Boettcher <patrick.boettcher@posteo.de>
|
||||
*
|
||||
* 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
|
||||
|
|
|
@ -345,9 +345,9 @@ static int cx22700_set_frontend(struct dvb_frontend *fe)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cx22700_get_frontend(struct dvb_frontend *fe)
|
||||
static int cx22700_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
struct cx22700_state* state = fe->demodulator_priv;
|
||||
u8 reg09 = cx22700_readreg (state, 0x09);
|
||||
|
||||
|
|
|
@ -562,9 +562,9 @@ static int cx22702_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cx22702_get_frontend(struct dvb_frontend *fe)
|
||||
static int cx22702_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
struct cx22702_state *state = fe->demodulator_priv;
|
||||
|
||||
u8 reg0C = cx22702_readreg(state, 0x0C);
|
||||
|
|
|
@ -550,9 +550,9 @@ static int cx24110_set_frontend(struct dvb_frontend *fe)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cx24110_get_frontend(struct dvb_frontend *fe)
|
||||
static int cx24110_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *p)
|
||||
{
|
||||
struct dtv_frontend_properties *p = &fe->dtv_property_cache;
|
||||
struct cx24110_state *state = fe->demodulator_priv;
|
||||
s32 afc; unsigned sclk;
|
||||
|
||||
|
|
|
@ -1560,10 +1560,10 @@ static int cx24117_get_algo(struct dvb_frontend *fe)
|
|||
return DVBFE_ALGO_HW;
|
||||
}
|
||||
|
||||
static int cx24117_get_frontend(struct dvb_frontend *fe)
|
||||
static int cx24117_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct cx24117_state *state = fe->demodulator_priv;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
struct cx24117_cmd cmd;
|
||||
u8 reg, st, inv;
|
||||
int ret, idx;
|
||||
|
|
|
@ -1502,16 +1502,18 @@ static int cx24120_sleep(struct dvb_frontend *fe)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cx24120_get_frontend(struct dvb_frontend *fe)
|
||||
static int cx24120_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
struct cx24120_state *state = fe->demodulator_priv;
|
||||
u8 freq1, freq2, freq3;
|
||||
int status;
|
||||
|
||||
dev_dbg(&state->i2c->dev, "\n");
|
||||
|
||||
/* don't return empty data if we're not tuned in */
|
||||
if ((state->fe_status & FE_HAS_LOCK) == 0)
|
||||
status = cx24120_readreg(state, CX24120_REG_STATUS);
|
||||
if (!(status & CX24120_HAS_LOCK))
|
||||
return 0;
|
||||
|
||||
/* Get frequency */
|
||||
|
|
|
@ -945,9 +945,9 @@ static int cx24123_set_frontend(struct dvb_frontend *fe)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cx24123_get_frontend(struct dvb_frontend *fe)
|
||||
static int cx24123_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *p)
|
||||
{
|
||||
struct dtv_frontend_properties *p = &fe->dtv_property_cache;
|
||||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
|
||||
dprintk("\n");
|
||||
|
|
|
@ -101,10 +101,10 @@ error:
|
|||
return ret;
|
||||
}
|
||||
|
||||
int cxd2820r_get_frontend_c(struct dvb_frontend *fe)
|
||||
int cxd2820r_get_frontend_c(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct cxd2820r_priv *priv = fe->demodulator_priv;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
int ret;
|
||||
u8 buf[2];
|
||||
|
||||
|
|
|
@ -313,7 +313,8 @@ static int cxd2820r_read_status(struct dvb_frontend *fe, enum fe_status *status)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int cxd2820r_get_frontend(struct dvb_frontend *fe)
|
||||
static int cxd2820r_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *p)
|
||||
{
|
||||
struct cxd2820r_priv *priv = fe->demodulator_priv;
|
||||
int ret;
|
||||
|
@ -326,13 +327,13 @@ static int cxd2820r_get_frontend(struct dvb_frontend *fe)
|
|||
|
||||
switch (fe->dtv_property_cache.delivery_system) {
|
||||
case SYS_DVBT:
|
||||
ret = cxd2820r_get_frontend_t(fe);
|
||||
ret = cxd2820r_get_frontend_t(fe, p);
|
||||
break;
|
||||
case SYS_DVBT2:
|
||||
ret = cxd2820r_get_frontend_t2(fe);
|
||||
ret = cxd2820r_get_frontend_t2(fe, p);
|
||||
break;
|
||||
case SYS_DVBC_ANNEX_A:
|
||||
ret = cxd2820r_get_frontend_c(fe);
|
||||
ret = cxd2820r_get_frontend_c(fe, p);
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
|
@ -606,8 +607,7 @@ static int cxd2820r_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
|
|||
static int cxd2820r_gpio_direction_output(struct gpio_chip *chip, unsigned nr,
|
||||
int val)
|
||||
{
|
||||
struct cxd2820r_priv *priv =
|
||||
container_of(chip, struct cxd2820r_priv, gpio_chip);
|
||||
struct cxd2820r_priv *priv = gpiochip_get_data(chip);
|
||||
u8 gpio[GPIO_COUNT];
|
||||
|
||||
dev_dbg(&priv->i2c->dev, "%s: nr=%d val=%d\n", __func__, nr, val);
|
||||
|
@ -620,8 +620,7 @@ static int cxd2820r_gpio_direction_output(struct gpio_chip *chip, unsigned nr,
|
|||
|
||||
static void cxd2820r_gpio_set(struct gpio_chip *chip, unsigned nr, int val)
|
||||
{
|
||||
struct cxd2820r_priv *priv =
|
||||
container_of(chip, struct cxd2820r_priv, gpio_chip);
|
||||
struct cxd2820r_priv *priv = gpiochip_get_data(chip);
|
||||
u8 gpio[GPIO_COUNT];
|
||||
|
||||
dev_dbg(&priv->i2c->dev, "%s: nr=%d val=%d\n", __func__, nr, val);
|
||||
|
@ -636,8 +635,7 @@ static void cxd2820r_gpio_set(struct gpio_chip *chip, unsigned nr, int val)
|
|||
|
||||
static int cxd2820r_gpio_get(struct gpio_chip *chip, unsigned nr)
|
||||
{
|
||||
struct cxd2820r_priv *priv =
|
||||
container_of(chip, struct cxd2820r_priv, gpio_chip);
|
||||
struct cxd2820r_priv *priv = gpiochip_get_data(chip);
|
||||
|
||||
dev_dbg(&priv->i2c->dev, "%s: nr=%d\n", __func__, nr);
|
||||
|
||||
|
@ -731,7 +729,7 @@ struct dvb_frontend *cxd2820r_attach(const struct cxd2820r_config *cfg,
|
|||
priv->gpio_chip.base = -1; /* dynamic allocation */
|
||||
priv->gpio_chip.ngpio = GPIO_COUNT;
|
||||
priv->gpio_chip.can_sleep = 1;
|
||||
ret = gpiochip_add(&priv->gpio_chip);
|
||||
ret = gpiochip_add_data(&priv->gpio_chip, priv);
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -76,7 +76,8 @@ int cxd2820r_rd_reg(struct cxd2820r_priv *priv, u32 reg, u8 *val);
|
|||
|
||||
/* cxd2820r_c.c */
|
||||
|
||||
int cxd2820r_get_frontend_c(struct dvb_frontend *fe);
|
||||
int cxd2820r_get_frontend_c(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *p);
|
||||
|
||||
int cxd2820r_set_frontend_c(struct dvb_frontend *fe);
|
||||
|
||||
|
@ -99,7 +100,8 @@ int cxd2820r_get_tune_settings_c(struct dvb_frontend *fe,
|
|||
|
||||
/* cxd2820r_t.c */
|
||||
|
||||
int cxd2820r_get_frontend_t(struct dvb_frontend *fe);
|
||||
int cxd2820r_get_frontend_t(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *p);
|
||||
|
||||
int cxd2820r_set_frontend_t(struct dvb_frontend *fe);
|
||||
|
||||
|
@ -122,7 +124,8 @@ int cxd2820r_get_tune_settings_t(struct dvb_frontend *fe,
|
|||
|
||||
/* cxd2820r_t2.c */
|
||||
|
||||
int cxd2820r_get_frontend_t2(struct dvb_frontend *fe);
|
||||
int cxd2820r_get_frontend_t2(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *p);
|
||||
|
||||
int cxd2820r_set_frontend_t2(struct dvb_frontend *fe);
|
||||
|
||||
|
|
|
@ -138,10 +138,10 @@ error:
|
|||
return ret;
|
||||
}
|
||||
|
||||
int cxd2820r_get_frontend_t(struct dvb_frontend *fe)
|
||||
int cxd2820r_get_frontend_t(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct cxd2820r_priv *priv = fe->demodulator_priv;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
int ret;
|
||||
u8 buf[2];
|
||||
|
||||
|
|
|
@ -23,8 +23,8 @@
|
|||
|
||||
int cxd2820r_set_frontend_t2(struct dvb_frontend *fe)
|
||||
{
|
||||
struct cxd2820r_priv *priv = fe->demodulator_priv;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
struct cxd2820r_priv *priv = fe->demodulator_priv;
|
||||
int ret, i, bw_i;
|
||||
u32 if_freq, if_ctl;
|
||||
u64 num;
|
||||
|
@ -169,10 +169,10 @@ error:
|
|||
|
||||
}
|
||||
|
||||
int cxd2820r_get_frontend_t2(struct dvb_frontend *fe)
|
||||
int cxd2820r_get_frontend_t2(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct cxd2820r_priv *priv = fe->demodulator_priv;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
int ret;
|
||||
u8 buf[2];
|
||||
|
||||
|
|
|
@ -2090,13 +2090,13 @@ static int cxd2841er_sleep_tc_to_active_c(struct cxd2841er_priv *priv,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cxd2841er_get_frontend(struct dvb_frontend *fe)
|
||||
static int cxd2841er_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *p)
|
||||
{
|
||||
enum fe_status status = 0;
|
||||
u16 strength = 0, snr = 0;
|
||||
u32 errors = 0, ber = 0;
|
||||
struct cxd2841er_priv *priv = fe->demodulator_priv;
|
||||
struct dtv_frontend_properties *p = &fe->dtv_property_cache;
|
||||
|
||||
dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
|
||||
if (priv->state == STATE_ACTIVE_S)
|
||||
|
|
|
@ -774,6 +774,6 @@ free_mem:
|
|||
}
|
||||
EXPORT_SYMBOL(dib0070_attach);
|
||||
|
||||
MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
|
||||
MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
|
||||
MODULE_DESCRIPTION("Driver for the DiBcom 0070 base-band RF Tuner");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -1115,9 +1115,15 @@ void dib0090_pwm_gain_reset(struct dvb_frontend *fe)
|
|||
dib0090_set_bbramp_pwm(state, bb_ramp);
|
||||
|
||||
/* activate the ramp generator using PWM control */
|
||||
dprintk("ramp RF gain = %d BAND = %s version = %d", state->rf_ramp[0], (state->current_band == BAND_CBAND) ? "CBAND" : "NOT CBAND", state->identity.version & 0x1f);
|
||||
if (state->rf_ramp)
|
||||
dprintk("ramp RF gain = %d BAND = %s version = %d",
|
||||
state->rf_ramp[0],
|
||||
(state->current_band == BAND_CBAND) ? "CBAND" : "NOT CBAND",
|
||||
state->identity.version & 0x1f);
|
||||
|
||||
if ((state->rf_ramp[0] == 0) || (state->current_band == BAND_CBAND && (state->identity.version & 0x1f) <= P1D_E_F)) {
|
||||
if (rf_ramp && ((state->rf_ramp[0] == 0) ||
|
||||
(state->current_band == BAND_CBAND &&
|
||||
(state->identity.version & 0x1f) <= P1D_E_F))) {
|
||||
dprintk("DE-Engage mux for direct gain reg control");
|
||||
en_pwm_rf_mux = 0;
|
||||
} else
|
||||
|
@ -2669,7 +2675,7 @@ free_mem:
|
|||
}
|
||||
EXPORT_SYMBOL(dib0090_fw_register);
|
||||
|
||||
MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
|
||||
MODULE_AUTHOR("Olivier Grenie <olivier.grenie@dibcom.fr>");
|
||||
MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
|
||||
MODULE_AUTHOR("Olivier Grenie <olivier.grenie@parrot.com>");
|
||||
MODULE_DESCRIPTION("Driver for the DiBcom 0090 base-band RF Tuner");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -2,11 +2,11 @@
|
|||
* public header file of the frontend drivers for mobile DVB-T demodulators
|
||||
* DiBcom 3000M-B and DiBcom 3000P/M-C (http://www.dibcom.fr/)
|
||||
*
|
||||
* Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de)
|
||||
* Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@posteo.de)
|
||||
*
|
||||
* based on GPL code from DibCom, which has
|
||||
*
|
||||
* Copyright (C) 2004 Amaury Demol for DiBcom (ademol@dibcom.fr)
|
||||
* Copyright (C) 2004 Amaury Demol for DiBcom
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
|
@ -14,7 +14,7 @@
|
|||
*
|
||||
* Acknowledgements
|
||||
*
|
||||
* Amaury Demol (ademol@dibcom.fr) from DiBcom for providing specs and driver
|
||||
* Amaury Demol from DiBcom for providing specs and driver
|
||||
* sources, on which this driver (and the dvb-dibusb) are based.
|
||||
*
|
||||
* see Documentation/dvb/README.dvb-usb for more information
|
||||
|
|
|
@ -2,11 +2,11 @@
|
|||
* Frontend driver for mobile DVB-T demodulator DiBcom 3000M-B
|
||||
* DiBcom (http://www.dibcom.fr/)
|
||||
*
|
||||
* Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de)
|
||||
* Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@posteo.de)
|
||||
*
|
||||
* based on GPL code from DibCom, which has
|
||||
*
|
||||
* Copyright (C) 2004 Amaury Demol for DiBcom (ademol@dibcom.fr)
|
||||
* Copyright (C) 2004 Amaury Demol for DiBcom
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
|
@ -14,7 +14,7 @@
|
|||
*
|
||||
* Acknowledgements
|
||||
*
|
||||
* Amaury Demol (ademol@dibcom.fr) from DiBcom for providing specs and driver
|
||||
* Amaury Demol from DiBcom for providing specs and driver
|
||||
* sources, on which this driver (and the dvb-dibusb) are based.
|
||||
*
|
||||
* see Documentation/dvb/README.dvb-usb for more information
|
||||
|
@ -36,7 +36,7 @@
|
|||
/* Version information */
|
||||
#define DRIVER_VERSION "0.1"
|
||||
#define DRIVER_DESC "DiBcom 3000M-B DVB-T demodulator"
|
||||
#define DRIVER_AUTHOR "Patrick Boettcher, patrick.boettcher@desy.de"
|
||||
#define DRIVER_AUTHOR "Patrick Boettcher, patrick.boettcher@posteo.de"
|
||||
|
||||
static int debug;
|
||||
module_param(debug, int, 0644);
|
||||
|
@ -112,7 +112,8 @@ static u16 dib3000_seq[2][2][2] = /* fft,gua, inv */
|
|||
}
|
||||
};
|
||||
|
||||
static int dib3000mb_get_frontend(struct dvb_frontend* fe);
|
||||
static int dib3000mb_get_frontend(struct dvb_frontend* fe,
|
||||
struct dtv_frontend_properties *c);
|
||||
|
||||
static int dib3000mb_set_frontend(struct dvb_frontend *fe, int tuner)
|
||||
{
|
||||
|
@ -359,7 +360,7 @@ static int dib3000mb_set_frontend(struct dvb_frontend *fe, int tuner)
|
|||
deb_setf("search_state after autosearch %d after %d checks\n",search_state,as_count);
|
||||
|
||||
if (search_state == 1) {
|
||||
if (dib3000mb_get_frontend(fe) == 0) {
|
||||
if (dib3000mb_get_frontend(fe, c) == 0) {
|
||||
deb_setf("reading tuning data from frontend succeeded.\n");
|
||||
return dib3000mb_set_frontend(fe, 0);
|
||||
}
|
||||
|
@ -450,9 +451,9 @@ static int dib3000mb_fe_init(struct dvb_frontend* fe, int mobile_mode)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int dib3000mb_get_frontend(struct dvb_frontend* fe)
|
||||
static int dib3000mb_get_frontend(struct dvb_frontend* fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
struct dib3000_state* state = fe->demodulator_priv;
|
||||
enum fe_code_rate *cr;
|
||||
u16 tps_val;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* dib3000mb_priv.h
|
||||
*
|
||||
* Copyright (C) 2004 Patrick Boettcher (patrick.boettcher@desy.de)
|
||||
* Copyright (C) 2004 Patrick Boettcher (patrick.boettcher@posteo.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* Driver for DiBcom DiB3000MC/P-demodulator.
|
||||
*
|
||||
* Copyright (C) 2004-7 DiBcom (http://www.dibcom.fr/)
|
||||
* Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de)
|
||||
* Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@posteo.de)
|
||||
*
|
||||
* This code is partially based on the previous dib3000mc.c .
|
||||
*
|
||||
|
@ -636,9 +636,9 @@ struct i2c_adapter * dib3000mc_get_tuner_i2c_master(struct dvb_frontend *demod,
|
|||
|
||||
EXPORT_SYMBOL(dib3000mc_get_tuner_i2c_master);
|
||||
|
||||
static int dib3000mc_get_frontend(struct dvb_frontend* fe)
|
||||
static int dib3000mc_get_frontend(struct dvb_frontend* fe,
|
||||
struct dtv_frontend_properties *fep)
|
||||
{
|
||||
struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
|
||||
struct dib3000mc_state *state = fe->demodulator_priv;
|
||||
u16 tps = dib3000mc_read_word(state,458);
|
||||
|
||||
|
@ -726,7 +726,7 @@ static int dib3000mc_set_frontend(struct dvb_frontend *fe)
|
|||
if (found == 0 || found == 1)
|
||||
return 0; // no channel found
|
||||
|
||||
dib3000mc_get_frontend(fe);
|
||||
dib3000mc_get_frontend(fe, fep);
|
||||
}
|
||||
|
||||
ret = dib3000mc_tune(fe);
|
||||
|
@ -939,6 +939,6 @@ static struct dvb_frontend_ops dib3000mc_ops = {
|
|||
.read_ucblocks = dib3000mc_read_unc_blocks,
|
||||
};
|
||||
|
||||
MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
|
||||
MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
|
||||
MODULE_DESCRIPTION("Driver for the DiBcom 3000MC/P COFDM demodulator");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* Driver for DiBcom DiB3000MC/P-demodulator.
|
||||
*
|
||||
* Copyright (C) 2004-6 DiBcom (http://www.dibcom.fr/)
|
||||
* Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher\@desy.de)
|
||||
* Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@posteo.de)
|
||||
*
|
||||
* This code is partially based on the previous dib3000mc.c .
|
||||
*
|
||||
|
|
|
@ -1151,9 +1151,9 @@ static int dib7000m_identify(struct dib7000m_state *state)
|
|||
}
|
||||
|
||||
|
||||
static int dib7000m_get_frontend(struct dvb_frontend* fe)
|
||||
static int dib7000m_get_frontend(struct dvb_frontend* fe,
|
||||
struct dtv_frontend_properties *fep)
|
||||
{
|
||||
struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
|
||||
struct dib7000m_state *state = fe->demodulator_priv;
|
||||
u16 tps = dib7000m_read_word(state,480);
|
||||
|
||||
|
@ -1246,7 +1246,7 @@ static int dib7000m_set_frontend(struct dvb_frontend *fe)
|
|||
if (found == 0 || found == 1)
|
||||
return 0; // no channel found
|
||||
|
||||
dib7000m_get_frontend(fe);
|
||||
dib7000m_get_frontend(fe, fep);
|
||||
}
|
||||
|
||||
ret = dib7000m_tune(fe);
|
||||
|
@ -1465,6 +1465,6 @@ static struct dvb_frontend_ops dib7000m_ops = {
|
|||
.read_ucblocks = dib7000m_read_unc_blocks,
|
||||
};
|
||||
|
||||
MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
|
||||
MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
|
||||
MODULE_DESCRIPTION("Driver for the DiBcom 7000MA/MB/PA/PB/MC COFDM demodulator");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -1405,9 +1405,9 @@ static int dib7000p_identify(struct dib7000p_state *st)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int dib7000p_get_frontend(struct dvb_frontend *fe)
|
||||
static int dib7000p_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *fep)
|
||||
{
|
||||
struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
|
||||
struct dib7000p_state *state = fe->demodulator_priv;
|
||||
u16 tps = dib7000p_read_word(state, 463);
|
||||
|
||||
|
@ -1540,7 +1540,7 @@ static int dib7000p_set_frontend(struct dvb_frontend *fe)
|
|||
if (found == 0 || found == 1)
|
||||
return 0;
|
||||
|
||||
dib7000p_get_frontend(fe);
|
||||
dib7000p_get_frontend(fe, fep);
|
||||
}
|
||||
|
||||
ret = dib7000p_tune(fe);
|
||||
|
@ -2834,7 +2834,7 @@ static struct dvb_frontend_ops dib7000p_ops = {
|
|||
.read_ucblocks = dib7000p_read_unc_blocks,
|
||||
};
|
||||
|
||||
MODULE_AUTHOR("Olivier Grenie <ogrenie@dibcom.fr>");
|
||||
MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
|
||||
MODULE_AUTHOR("Olivier Grenie <olivie.grenie@parrot.com>");
|
||||
MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
|
||||
MODULE_DESCRIPTION("Driver for the DiBcom 7000PC COFDM demodulator");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -3382,14 +3382,15 @@ static int dib8000_sleep(struct dvb_frontend *fe)
|
|||
|
||||
static int dib8000_read_status(struct dvb_frontend *fe, enum fe_status *stat);
|
||||
|
||||
static int dib8000_get_frontend(struct dvb_frontend *fe)
|
||||
static int dib8000_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct dib8000_state *state = fe->demodulator_priv;
|
||||
u16 i, val = 0;
|
||||
enum fe_status stat = 0;
|
||||
u8 index_frontend, sub_index_frontend;
|
||||
|
||||
fe->dtv_property_cache.bandwidth_hz = 6000000;
|
||||
c->bandwidth_hz = 6000000;
|
||||
|
||||
/*
|
||||
* If called to early, get_frontend makes dib8000_tune to either
|
||||
|
@ -3406,7 +3407,7 @@ static int dib8000_get_frontend(struct dvb_frontend *fe)
|
|||
if (stat&FE_HAS_SYNC) {
|
||||
dprintk("TMCC lock on the slave%i", index_frontend);
|
||||
/* synchronize the cache with the other frontends */
|
||||
state->fe[index_frontend]->ops.get_frontend(state->fe[index_frontend]);
|
||||
state->fe[index_frontend]->ops.get_frontend(state->fe[index_frontend], c);
|
||||
for (sub_index_frontend = 0; (sub_index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[sub_index_frontend] != NULL); sub_index_frontend++) {
|
||||
if (sub_index_frontend != index_frontend) {
|
||||
state->fe[sub_index_frontend]->dtv_property_cache.isdbt_sb_mode = state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode;
|
||||
|
@ -3426,57 +3427,57 @@ static int dib8000_get_frontend(struct dvb_frontend *fe)
|
|||
}
|
||||
}
|
||||
|
||||
fe->dtv_property_cache.isdbt_sb_mode = dib8000_read_word(state, 508) & 0x1;
|
||||
c->isdbt_sb_mode = dib8000_read_word(state, 508) & 0x1;
|
||||
|
||||
if (state->revision == 0x8090)
|
||||
val = dib8000_read_word(state, 572);
|
||||
else
|
||||
val = dib8000_read_word(state, 570);
|
||||
fe->dtv_property_cache.inversion = (val & 0x40) >> 6;
|
||||
c->inversion = (val & 0x40) >> 6;
|
||||
switch ((val & 0x30) >> 4) {
|
||||
case 1:
|
||||
fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_2K;
|
||||
c->transmission_mode = TRANSMISSION_MODE_2K;
|
||||
dprintk("dib8000_get_frontend: transmission mode 2K");
|
||||
break;
|
||||
case 2:
|
||||
fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_4K;
|
||||
c->transmission_mode = TRANSMISSION_MODE_4K;
|
||||
dprintk("dib8000_get_frontend: transmission mode 4K");
|
||||
break;
|
||||
case 3:
|
||||
default:
|
||||
fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_8K;
|
||||
c->transmission_mode = TRANSMISSION_MODE_8K;
|
||||
dprintk("dib8000_get_frontend: transmission mode 8K");
|
||||
break;
|
||||
}
|
||||
|
||||
switch (val & 0x3) {
|
||||
case 0:
|
||||
fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_32;
|
||||
c->guard_interval = GUARD_INTERVAL_1_32;
|
||||
dprintk("dib8000_get_frontend: Guard Interval = 1/32 ");
|
||||
break;
|
||||
case 1:
|
||||
fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_16;
|
||||
c->guard_interval = GUARD_INTERVAL_1_16;
|
||||
dprintk("dib8000_get_frontend: Guard Interval = 1/16 ");
|
||||
break;
|
||||
case 2:
|
||||
dprintk("dib8000_get_frontend: Guard Interval = 1/8 ");
|
||||
fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_8;
|
||||
c->guard_interval = GUARD_INTERVAL_1_8;
|
||||
break;
|
||||
case 3:
|
||||
dprintk("dib8000_get_frontend: Guard Interval = 1/4 ");
|
||||
fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_4;
|
||||
c->guard_interval = GUARD_INTERVAL_1_4;
|
||||
break;
|
||||
}
|
||||
|
||||
val = dib8000_read_word(state, 505);
|
||||
fe->dtv_property_cache.isdbt_partial_reception = val & 1;
|
||||
dprintk("dib8000_get_frontend: partial_reception = %d ", fe->dtv_property_cache.isdbt_partial_reception);
|
||||
c->isdbt_partial_reception = val & 1;
|
||||
dprintk("dib8000_get_frontend: partial_reception = %d ", c->isdbt_partial_reception);
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
int show;
|
||||
|
||||
val = dib8000_read_word(state, 493 + i) & 0x0f;
|
||||
fe->dtv_property_cache.layer[i].segment_count = val;
|
||||
c->layer[i].segment_count = val;
|
||||
|
||||
if (val == 0 || val > 13)
|
||||
show = 0;
|
||||
|
@ -3485,41 +3486,41 @@ static int dib8000_get_frontend(struct dvb_frontend *fe)
|
|||
|
||||
if (show)
|
||||
dprintk("dib8000_get_frontend: Layer %d segments = %d ",
|
||||
i, fe->dtv_property_cache.layer[i].segment_count);
|
||||
i, c->layer[i].segment_count);
|
||||
|
||||
val = dib8000_read_word(state, 499 + i) & 0x3;
|
||||
/* Interleaving can be 0, 1, 2 or 4 */
|
||||
if (val == 3)
|
||||
val = 4;
|
||||
fe->dtv_property_cache.layer[i].interleaving = val;
|
||||
c->layer[i].interleaving = val;
|
||||
if (show)
|
||||
dprintk("dib8000_get_frontend: Layer %d time_intlv = %d ",
|
||||
i, fe->dtv_property_cache.layer[i].interleaving);
|
||||
i, c->layer[i].interleaving);
|
||||
|
||||
val = dib8000_read_word(state, 481 + i);
|
||||
switch (val & 0x7) {
|
||||
case 1:
|
||||
fe->dtv_property_cache.layer[i].fec = FEC_1_2;
|
||||
c->layer[i].fec = FEC_1_2;
|
||||
if (show)
|
||||
dprintk("dib8000_get_frontend: Layer %d Code Rate = 1/2 ", i);
|
||||
break;
|
||||
case 2:
|
||||
fe->dtv_property_cache.layer[i].fec = FEC_2_3;
|
||||
c->layer[i].fec = FEC_2_3;
|
||||
if (show)
|
||||
dprintk("dib8000_get_frontend: Layer %d Code Rate = 2/3 ", i);
|
||||
break;
|
||||
case 3:
|
||||
fe->dtv_property_cache.layer[i].fec = FEC_3_4;
|
||||
c->layer[i].fec = FEC_3_4;
|
||||
if (show)
|
||||
dprintk("dib8000_get_frontend: Layer %d Code Rate = 3/4 ", i);
|
||||
break;
|
||||
case 5:
|
||||
fe->dtv_property_cache.layer[i].fec = FEC_5_6;
|
||||
c->layer[i].fec = FEC_5_6;
|
||||
if (show)
|
||||
dprintk("dib8000_get_frontend: Layer %d Code Rate = 5/6 ", i);
|
||||
break;
|
||||
default:
|
||||
fe->dtv_property_cache.layer[i].fec = FEC_7_8;
|
||||
c->layer[i].fec = FEC_7_8;
|
||||
if (show)
|
||||
dprintk("dib8000_get_frontend: Layer %d Code Rate = 7/8 ", i);
|
||||
break;
|
||||
|
@ -3528,23 +3529,23 @@ static int dib8000_get_frontend(struct dvb_frontend *fe)
|
|||
val = dib8000_read_word(state, 487 + i);
|
||||
switch (val & 0x3) {
|
||||
case 0:
|
||||
fe->dtv_property_cache.layer[i].modulation = DQPSK;
|
||||
c->layer[i].modulation = DQPSK;
|
||||
if (show)
|
||||
dprintk("dib8000_get_frontend: Layer %d DQPSK ", i);
|
||||
break;
|
||||
case 1:
|
||||
fe->dtv_property_cache.layer[i].modulation = QPSK;
|
||||
c->layer[i].modulation = QPSK;
|
||||
if (show)
|
||||
dprintk("dib8000_get_frontend: Layer %d QPSK ", i);
|
||||
break;
|
||||
case 2:
|
||||
fe->dtv_property_cache.layer[i].modulation = QAM_16;
|
||||
c->layer[i].modulation = QAM_16;
|
||||
if (show)
|
||||
dprintk("dib8000_get_frontend: Layer %d QAM16 ", i);
|
||||
break;
|
||||
case 3:
|
||||
default:
|
||||
fe->dtv_property_cache.layer[i].modulation = QAM_64;
|
||||
c->layer[i].modulation = QAM_64;
|
||||
if (show)
|
||||
dprintk("dib8000_get_frontend: Layer %d QAM64 ", i);
|
||||
break;
|
||||
|
@ -3553,16 +3554,16 @@ static int dib8000_get_frontend(struct dvb_frontend *fe)
|
|||
|
||||
/* synchronize the cache with the other frontends */
|
||||
for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
|
||||
state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode = fe->dtv_property_cache.isdbt_sb_mode;
|
||||
state->fe[index_frontend]->dtv_property_cache.inversion = fe->dtv_property_cache.inversion;
|
||||
state->fe[index_frontend]->dtv_property_cache.transmission_mode = fe->dtv_property_cache.transmission_mode;
|
||||
state->fe[index_frontend]->dtv_property_cache.guard_interval = fe->dtv_property_cache.guard_interval;
|
||||
state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception = fe->dtv_property_cache.isdbt_partial_reception;
|
||||
state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode = c->isdbt_sb_mode;
|
||||
state->fe[index_frontend]->dtv_property_cache.inversion = c->inversion;
|
||||
state->fe[index_frontend]->dtv_property_cache.transmission_mode = c->transmission_mode;
|
||||
state->fe[index_frontend]->dtv_property_cache.guard_interval = c->guard_interval;
|
||||
state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception = c->isdbt_partial_reception;
|
||||
for (i = 0; i < 3; i++) {
|
||||
state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count = fe->dtv_property_cache.layer[i].segment_count;
|
||||
state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving = fe->dtv_property_cache.layer[i].interleaving;
|
||||
state->fe[index_frontend]->dtv_property_cache.layer[i].fec = fe->dtv_property_cache.layer[i].fec;
|
||||
state->fe[index_frontend]->dtv_property_cache.layer[i].modulation = fe->dtv_property_cache.layer[i].modulation;
|
||||
state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count = c->layer[i].segment_count;
|
||||
state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving = c->layer[i].interleaving;
|
||||
state->fe[index_frontend]->dtv_property_cache.layer[i].fec = c->layer[i].fec;
|
||||
state->fe[index_frontend]->dtv_property_cache.layer[i].modulation = c->layer[i].modulation;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
@ -3671,7 +3672,7 @@ static int dib8000_set_frontend(struct dvb_frontend *fe)
|
|||
if (state->channel_parameters_set == 0) { /* searching */
|
||||
if ((dib8000_get_status(state->fe[index_frontend]) == FE_STATUS_DEMOD_SUCCESS) || (dib8000_get_status(state->fe[index_frontend]) == FE_STATUS_FFT_SUCCESS)) {
|
||||
dprintk("autosearch succeeded on fe%i", index_frontend);
|
||||
dib8000_get_frontend(state->fe[index_frontend]); /* we read the channel parameters from the frontend which was successful */
|
||||
dib8000_get_frontend(state->fe[index_frontend], c); /* we read the channel parameters from the frontend which was successful */
|
||||
state->channel_parameters_set = 1;
|
||||
|
||||
for (l = 0; (l < MAX_NUMBER_OF_FRONTENDS) && (state->fe[l] != NULL); l++) {
|
||||
|
@ -4516,6 +4517,6 @@ void *dib8000_attach(struct dib8000_ops *ops)
|
|||
}
|
||||
EXPORT_SYMBOL(dib8000_attach);
|
||||
|
||||
MODULE_AUTHOR("Olivier Grenie <Olivier.Grenie@dibcom.fr, " "Patrick Boettcher <pboettcher@dibcom.fr>");
|
||||
MODULE_AUTHOR("Olivier Grenie <Olivier.Grenie@parrot.com, Patrick Boettcher <patrick.boettcher@posteo.de>");
|
||||
MODULE_DESCRIPTION("Driver for the DiBcom 8000 ISDB-T demodulator");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -225,7 +225,7 @@ static u16 to_fw_output_mode(u16 mode)
|
|||
}
|
||||
}
|
||||
|
||||
static u16 dib9000_read16_attr(struct dib9000_state *state, u16 reg, u8 * b, u32 len, u16 attribute)
|
||||
static int dib9000_read16_attr(struct dib9000_state *state, u16 reg, u8 *b, u32 len, u16 attribute)
|
||||
{
|
||||
u32 chunk_size = 126;
|
||||
u32 l;
|
||||
|
@ -309,7 +309,7 @@ static inline u16 dib9000_read_word_attr(struct dib9000_state *state, u16 reg, u
|
|||
|
||||
#define dib9000_read16_noinc_attr(state, reg, b, len, attribute) dib9000_read16_attr(state, reg, b, len, (attribute) | DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
|
||||
|
||||
static u16 dib9000_write16_attr(struct dib9000_state *state, u16 reg, const u8 * buf, u32 len, u16 attribute)
|
||||
static int dib9000_write16_attr(struct dib9000_state *state, u16 reg, const u8 *buf, u32 len, u16 attribute)
|
||||
{
|
||||
u32 chunk_size = 126;
|
||||
u32 l;
|
||||
|
@ -1889,7 +1889,8 @@ static int dib9000_fe_get_tune_settings(struct dvb_frontend *fe, struct dvb_fron
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int dib9000_get_frontend(struct dvb_frontend *fe)
|
||||
static int dib9000_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct dib9000_state *state = fe->demodulator_priv;
|
||||
u8 index_frontend, sub_index_frontend;
|
||||
|
@ -1909,7 +1910,7 @@ static int dib9000_get_frontend(struct dvb_frontend *fe)
|
|||
dprintk("TPS lock on the slave%i", index_frontend);
|
||||
|
||||
/* synchronize the cache with the other frontends */
|
||||
state->fe[index_frontend]->ops.get_frontend(state->fe[index_frontend]);
|
||||
state->fe[index_frontend]->ops.get_frontend(state->fe[index_frontend], c);
|
||||
for (sub_index_frontend = 0; (sub_index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[sub_index_frontend] != NULL);
|
||||
sub_index_frontend++) {
|
||||
if (sub_index_frontend != index_frontend) {
|
||||
|
@ -1943,14 +1944,14 @@ static int dib9000_get_frontend(struct dvb_frontend *fe)
|
|||
|
||||
/* synchronize the cache with the other frontends */
|
||||
for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
|
||||
state->fe[index_frontend]->dtv_property_cache.inversion = fe->dtv_property_cache.inversion;
|
||||
state->fe[index_frontend]->dtv_property_cache.transmission_mode = fe->dtv_property_cache.transmission_mode;
|
||||
state->fe[index_frontend]->dtv_property_cache.guard_interval = fe->dtv_property_cache.guard_interval;
|
||||
state->fe[index_frontend]->dtv_property_cache.modulation = fe->dtv_property_cache.modulation;
|
||||
state->fe[index_frontend]->dtv_property_cache.hierarchy = fe->dtv_property_cache.hierarchy;
|
||||
state->fe[index_frontend]->dtv_property_cache.code_rate_HP = fe->dtv_property_cache.code_rate_HP;
|
||||
state->fe[index_frontend]->dtv_property_cache.code_rate_LP = fe->dtv_property_cache.code_rate_LP;
|
||||
state->fe[index_frontend]->dtv_property_cache.rolloff = fe->dtv_property_cache.rolloff;
|
||||
state->fe[index_frontend]->dtv_property_cache.inversion = c->inversion;
|
||||
state->fe[index_frontend]->dtv_property_cache.transmission_mode = c->transmission_mode;
|
||||
state->fe[index_frontend]->dtv_property_cache.guard_interval = c->guard_interval;
|
||||
state->fe[index_frontend]->dtv_property_cache.modulation = c->modulation;
|
||||
state->fe[index_frontend]->dtv_property_cache.hierarchy = c->hierarchy;
|
||||
state->fe[index_frontend]->dtv_property_cache.code_rate_HP = c->code_rate_HP;
|
||||
state->fe[index_frontend]->dtv_property_cache.code_rate_LP = c->code_rate_LP;
|
||||
state->fe[index_frontend]->dtv_property_cache.rolloff = c->rolloff;
|
||||
}
|
||||
ret = 0;
|
||||
|
||||
|
@ -2083,7 +2084,7 @@ static int dib9000_set_frontend(struct dvb_frontend *fe)
|
|||
|
||||
/* synchronize all the channel cache */
|
||||
state->get_frontend_internal = 1;
|
||||
dib9000_get_frontend(state->fe[0]);
|
||||
dib9000_get_frontend(state->fe[0], &state->fe[0]->dtv_property_cache);
|
||||
state->get_frontend_internal = 0;
|
||||
|
||||
/* retune the other frontends with the found channel */
|
||||
|
@ -2589,7 +2590,7 @@ static struct dvb_frontend_ops dib9000_ops = {
|
|||
.read_ucblocks = dib9000_read_unc_blocks,
|
||||
};
|
||||
|
||||
MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
|
||||
MODULE_AUTHOR("Olivier Grenie <ogrenie@dibcom.fr>");
|
||||
MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
|
||||
MODULE_AUTHOR("Olivier Grenie <olivier.grenie@parrot.com>");
|
||||
MODULE_DESCRIPTION("Driver for the DiBcom 9000 COFDM demodulator");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -510,6 +510,6 @@ u32 systime(void)
|
|||
}
|
||||
EXPORT_SYMBOL(systime);
|
||||
|
||||
MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
|
||||
MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
|
||||
MODULE_DESCRIPTION("Common function the DiBcom demodulator family");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -4131,7 +4131,7 @@ int drxj_dap_scu_atomic_read_write_block(struct i2c_device_addr *dev_addr, u32 a
|
|||
{
|
||||
struct drxjscu_cmd scu_cmd;
|
||||
int rc;
|
||||
u16 set_param_parameters[15];
|
||||
u16 set_param_parameters[18];
|
||||
u16 cmd_result[15];
|
||||
|
||||
/* Parameter check */
|
||||
|
@ -9597,12 +9597,13 @@ ctrl_get_qam_sig_quality(struct drx_demod_instance *demod)
|
|||
|
||||
Precision errors still possible.
|
||||
*/
|
||||
e = post_bit_err_rs * 742686;
|
||||
m = fec_oc_period * 100;
|
||||
if (fec_oc_period == 0)
|
||||
if (!fec_oc_period) {
|
||||
qam_post_rs_ber = 0xFFFFFFFF;
|
||||
else
|
||||
} else {
|
||||
e = post_bit_err_rs * 742686;
|
||||
m = fec_oc_period * 100;
|
||||
qam_post_rs_ber = e / m;
|
||||
}
|
||||
|
||||
/* fill signal quality data structure */
|
||||
p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
|
||||
|
|
|
@ -70,9 +70,12 @@ static int dvb_dummy_fe_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
|
|||
}
|
||||
|
||||
/*
|
||||
* Only needed if it actually reads something from the hardware
|
||||
* Should only be implemented if it actually reads something from the hardware.
|
||||
* Also, it should check for the locks, in order to avoid report wrong data
|
||||
* to userspace.
|
||||
*/
|
||||
static int dvb_dummy_fe_get_frontend(struct dvb_frontend *fe)
|
||||
static int dvb_dummy_fe_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *p)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -560,11 +560,11 @@ static int hd29l2_get_frontend_algo(struct dvb_frontend *fe)
|
|||
return DVBFE_ALGO_CUSTOM;
|
||||
}
|
||||
|
||||
static int hd29l2_get_frontend(struct dvb_frontend *fe)
|
||||
static int hd29l2_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
int ret;
|
||||
struct hd29l2_priv *priv = fe->demodulator_priv;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
u8 buf[3];
|
||||
u32 if_ctl;
|
||||
char *str_constellation, *str_code_rate, *str_constellation_code_rate,
|
||||
|
|
|
@ -243,9 +243,9 @@ static int apply_frontend_param(struct dvb_frontend *fe)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int get_frontend(struct dvb_frontend *fe)
|
||||
static int get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *p)
|
||||
{
|
||||
struct dtv_frontend_properties *p = &fe->dtv_property_cache;
|
||||
struct l64781_state* state = fe->demodulator_priv;
|
||||
int tmp;
|
||||
|
||||
|
|
|
@ -942,101 +942,102 @@ static int lg216x_read_rs_err_count(struct lg216x_state *state, u16 *err)
|
|||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
static int lg216x_get_frontend(struct dvb_frontend *fe)
|
||||
static int lg216x_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct lg216x_state *state = fe->demodulator_priv;
|
||||
int ret;
|
||||
|
||||
lg_dbg("\n");
|
||||
|
||||
fe->dtv_property_cache.modulation = VSB_8;
|
||||
fe->dtv_property_cache.frequency = state->current_frequency;
|
||||
fe->dtv_property_cache.delivery_system = SYS_ATSCMH;
|
||||
c->modulation = VSB_8;
|
||||
c->frequency = state->current_frequency;
|
||||
c->delivery_system = SYS_ATSCMH;
|
||||
|
||||
ret = lg216x_get_fic_version(state,
|
||||
&fe->dtv_property_cache.atscmh_fic_ver);
|
||||
&c->atscmh_fic_ver);
|
||||
if (lg_fail(ret))
|
||||
goto fail;
|
||||
if (state->fic_ver != fe->dtv_property_cache.atscmh_fic_ver) {
|
||||
state->fic_ver = fe->dtv_property_cache.atscmh_fic_ver;
|
||||
if (state->fic_ver != c->atscmh_fic_ver) {
|
||||
state->fic_ver = c->atscmh_fic_ver;
|
||||
|
||||
#if 0
|
||||
ret = lg2160_get_parade_id(state,
|
||||
&fe->dtv_property_cache.atscmh_parade_id);
|
||||
&c->atscmh_parade_id);
|
||||
if (lg_fail(ret))
|
||||
goto fail;
|
||||
/* #else */
|
||||
fe->dtv_property_cache.atscmh_parade_id = state->parade_id;
|
||||
c->atscmh_parade_id = state->parade_id;
|
||||
#endif
|
||||
ret = lg216x_get_nog(state,
|
||||
&fe->dtv_property_cache.atscmh_nog);
|
||||
&c->atscmh_nog);
|
||||
if (lg_fail(ret))
|
||||
goto fail;
|
||||
ret = lg216x_get_tnog(state,
|
||||
&fe->dtv_property_cache.atscmh_tnog);
|
||||
&c->atscmh_tnog);
|
||||
if (lg_fail(ret))
|
||||
goto fail;
|
||||
ret = lg216x_get_sgn(state,
|
||||
&fe->dtv_property_cache.atscmh_sgn);
|
||||
&c->atscmh_sgn);
|
||||
if (lg_fail(ret))
|
||||
goto fail;
|
||||
ret = lg216x_get_prc(state,
|
||||
&fe->dtv_property_cache.atscmh_prc);
|
||||
&c->atscmh_prc);
|
||||
if (lg_fail(ret))
|
||||
goto fail;
|
||||
|
||||
ret = lg216x_get_rs_frame_mode(state,
|
||||
(enum atscmh_rs_frame_mode *)
|
||||
&fe->dtv_property_cache.atscmh_rs_frame_mode);
|
||||
&c->atscmh_rs_frame_mode);
|
||||
if (lg_fail(ret))
|
||||
goto fail;
|
||||
ret = lg216x_get_rs_frame_ensemble(state,
|
||||
(enum atscmh_rs_frame_ensemble *)
|
||||
&fe->dtv_property_cache.atscmh_rs_frame_ensemble);
|
||||
&c->atscmh_rs_frame_ensemble);
|
||||
if (lg_fail(ret))
|
||||
goto fail;
|
||||
ret = lg216x_get_rs_code_mode(state,
|
||||
(enum atscmh_rs_code_mode *)
|
||||
&fe->dtv_property_cache.atscmh_rs_code_mode_pri,
|
||||
&c->atscmh_rs_code_mode_pri,
|
||||
(enum atscmh_rs_code_mode *)
|
||||
&fe->dtv_property_cache.atscmh_rs_code_mode_sec);
|
||||
&c->atscmh_rs_code_mode_sec);
|
||||
if (lg_fail(ret))
|
||||
goto fail;
|
||||
ret = lg216x_get_sccc_block_mode(state,
|
||||
(enum atscmh_sccc_block_mode *)
|
||||
&fe->dtv_property_cache.atscmh_sccc_block_mode);
|
||||
&c->atscmh_sccc_block_mode);
|
||||
if (lg_fail(ret))
|
||||
goto fail;
|
||||
ret = lg216x_get_sccc_code_mode(state,
|
||||
(enum atscmh_sccc_code_mode *)
|
||||
&fe->dtv_property_cache.atscmh_sccc_code_mode_a,
|
||||
&c->atscmh_sccc_code_mode_a,
|
||||
(enum atscmh_sccc_code_mode *)
|
||||
&fe->dtv_property_cache.atscmh_sccc_code_mode_b,
|
||||
&c->atscmh_sccc_code_mode_b,
|
||||
(enum atscmh_sccc_code_mode *)
|
||||
&fe->dtv_property_cache.atscmh_sccc_code_mode_c,
|
||||
&c->atscmh_sccc_code_mode_c,
|
||||
(enum atscmh_sccc_code_mode *)
|
||||
&fe->dtv_property_cache.atscmh_sccc_code_mode_d);
|
||||
&c->atscmh_sccc_code_mode_d);
|
||||
if (lg_fail(ret))
|
||||
goto fail;
|
||||
}
|
||||
#if 0
|
||||
ret = lg216x_read_fic_err_count(state,
|
||||
(u8 *)&fe->dtv_property_cache.atscmh_fic_err);
|
||||
(u8 *)&c->atscmh_fic_err);
|
||||
if (lg_fail(ret))
|
||||
goto fail;
|
||||
ret = lg216x_read_crc_err_count(state,
|
||||
&fe->dtv_property_cache.atscmh_crc_err);
|
||||
&c->atscmh_crc_err);
|
||||
if (lg_fail(ret))
|
||||
goto fail;
|
||||
ret = lg216x_read_rs_err_count(state,
|
||||
&fe->dtv_property_cache.atscmh_rs_err);
|
||||
&c->atscmh_rs_err);
|
||||
if (lg_fail(ret))
|
||||
goto fail;
|
||||
|
||||
switch (state->cfg->lg_chip) {
|
||||
case LG2160:
|
||||
if (((fe->dtv_property_cache.atscmh_rs_err >= 240) &&
|
||||
(fe->dtv_property_cache.atscmh_crc_err >= 240)) &&
|
||||
if (((c->atscmh_rs_err >= 240) &&
|
||||
(c->atscmh_crc_err >= 240)) &&
|
||||
((jiffies_to_msecs(jiffies) - state->last_reset) > 6000))
|
||||
ret = lg216x_soft_reset(state);
|
||||
break;
|
||||
|
@ -1054,14 +1055,17 @@ fail:
|
|||
static int lg216x_get_property(struct dvb_frontend *fe,
|
||||
struct dtv_property *tvp)
|
||||
{
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
|
||||
return (DTV_ATSCMH_FIC_VER == tvp->cmd) ?
|
||||
lg216x_get_frontend(fe) : 0;
|
||||
lg216x_get_frontend(fe, c) : 0;
|
||||
}
|
||||
|
||||
|
||||
static int lg2160_set_frontend(struct dvb_frontend *fe)
|
||||
{
|
||||
struct lg216x_state *state = fe->demodulator_priv;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
int ret;
|
||||
|
||||
lg_dbg("(%d)\n", fe->dtv_property_cache.frequency);
|
||||
|
@ -1129,7 +1133,7 @@ static int lg2160_set_frontend(struct dvb_frontend *fe)
|
|||
ret = lg216x_enable_fic(state, 1);
|
||||
lg_fail(ret);
|
||||
|
||||
lg216x_get_frontend(fe);
|
||||
lg216x_get_frontend(fe, c);
|
||||
fail:
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -812,9 +812,9 @@ fail:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int lgdt3305_get_frontend(struct dvb_frontend *fe)
|
||||
static int lgdt3305_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *p)
|
||||
{
|
||||
struct dtv_frontend_properties *p = &fe->dtv_property_cache;
|
||||
struct lgdt3305_state *state = fe->demodulator_priv;
|
||||
|
||||
lg_dbg("\n");
|
||||
|
|
|
@ -1040,10 +1040,10 @@ fail:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int lgdt3306a_get_frontend(struct dvb_frontend *fe)
|
||||
static int lgdt3306a_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *p)
|
||||
{
|
||||
struct lgdt3306a_state *state = fe->demodulator_priv;
|
||||
struct dtv_frontend_properties *p = &fe->dtv_property_cache;
|
||||
|
||||
dbg_info("(%u, %d)\n",
|
||||
state->current_frequency, state->current_modulation);
|
||||
|
|
|
@ -439,10 +439,11 @@ static int lgdt330x_set_parameters(struct dvb_frontend *fe)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int lgdt330x_get_frontend(struct dvb_frontend *fe)
|
||||
static int lgdt330x_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *p)
|
||||
{
|
||||
struct dtv_frontend_properties *p = &fe->dtv_property_cache;
|
||||
struct lgdt330x_state *state = fe->demodulator_priv;
|
||||
|
||||
p->frequency = state->current_frequency;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -336,10 +336,11 @@ lgs8gl5_set_frontend(struct dvb_frontend *fe)
|
|||
|
||||
|
||||
static int
|
||||
lgs8gl5_get_frontend(struct dvb_frontend *fe)
|
||||
lgs8gl5_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *p)
|
||||
{
|
||||
struct dtv_frontend_properties *p = &fe->dtv_property_cache;
|
||||
struct lgs8gl5_state *state = fe->demodulator_priv;
|
||||
|
||||
u8 inv = lgs8gl5_read_reg(state, REG_INVERSION);
|
||||
|
||||
p->inversion = (inv & REG_INVERSION_ON) ? INVERSION_ON : INVERSION_OFF;
|
||||
|
|
|
@ -672,7 +672,7 @@ static int lgs8gxx_write(struct dvb_frontend *fe, const u8 buf[], int len)
|
|||
|
||||
static int lgs8gxx_set_fe(struct dvb_frontend *fe)
|
||||
{
|
||||
|
||||
struct dtv_frontend_properties *fe_params = &fe->dtv_property_cache;
|
||||
struct lgs8gxx_state *priv = fe->demodulator_priv;
|
||||
|
||||
dprintk("%s\n", __func__);
|
||||
|
@ -689,17 +689,7 @@ static int lgs8gxx_set_fe(struct dvb_frontend *fe)
|
|||
|
||||
msleep(10);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lgs8gxx_get_fe(struct dvb_frontend *fe)
|
||||
{
|
||||
struct dtv_frontend_properties *fe_params = &fe->dtv_property_cache;
|
||||
dprintk("%s\n", __func__);
|
||||
|
||||
/* TODO: get real readings from device */
|
||||
/* inversion status */
|
||||
fe_params->inversion = INVERSION_OFF;
|
||||
|
||||
/* bandwidth */
|
||||
fe_params->bandwidth_hz = 8000000;
|
||||
|
@ -1016,7 +1006,6 @@ static struct dvb_frontend_ops lgs8gxx_ops = {
|
|||
.i2c_gate_ctrl = lgs8gxx_i2c_gate_ctrl,
|
||||
|
||||
.set_frontend = lgs8gxx_set_fe,
|
||||
.get_frontend = lgs8gxx_get_fe,
|
||||
.get_tune_settings = lgs8gxx_get_tune_settings,
|
||||
|
||||
.read_status = lgs8gxx_read_status,
|
||||
|
|
|
@ -791,11 +791,11 @@ err:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int m88ds3103_get_frontend(struct dvb_frontend *fe)
|
||||
static int m88ds3103_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct m88ds3103_dev *dev = fe->demodulator_priv;
|
||||
struct i2c_client *client = dev->client;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
int ret;
|
||||
u8 buf[3];
|
||||
|
||||
|
|
|
@ -708,10 +708,11 @@ static int m88rs2000_set_frontend(struct dvb_frontend *fe)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int m88rs2000_get_frontend(struct dvb_frontend *fe)
|
||||
static int m88rs2000_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
struct m88rs2000_state *state = fe->demodulator_priv;
|
||||
|
||||
c->fec_inner = state->fec_inner;
|
||||
c->frequency = state->tuner_frequency;
|
||||
c->symbol_rate = state->symbol_rate;
|
||||
|
|
|
@ -2028,16 +2028,6 @@ static int mb86a20s_read_signal_strength_from_cache(struct dvb_frontend *fe,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int mb86a20s_get_frontend_dummy(struct dvb_frontend *fe)
|
||||
{
|
||||
/*
|
||||
* get_frontend is now handled together with other stats
|
||||
* retrival, when read_status() is called, as some statistics
|
||||
* will depend on the layers detection.
|
||||
*/
|
||||
return 0;
|
||||
};
|
||||
|
||||
static int mb86a20s_tune(struct dvb_frontend *fe,
|
||||
bool re_tune,
|
||||
unsigned int mode_flags,
|
||||
|
@ -2136,7 +2126,6 @@ static struct dvb_frontend_ops mb86a20s_ops = {
|
|||
|
||||
.init = mb86a20s_initfe,
|
||||
.set_frontend = mb86a20s_set_frontend,
|
||||
.get_frontend = mb86a20s_get_frontend_dummy,
|
||||
.read_status = mb86a20s_read_status_and_stats,
|
||||
.read_signal_strength = mb86a20s_read_signal_strength_from_cache,
|
||||
.tune = mb86a20s_tune,
|
||||
|
|
|
@ -29,21 +29,17 @@ static int mn88473_set_frontend(struct dvb_frontend *fe)
|
|||
struct mn88473_dev *dev = i2c_get_clientdata(client);
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
int ret, i;
|
||||
unsigned int uitmp;
|
||||
u32 if_frequency;
|
||||
u64 tmp;
|
||||
u8 delivery_system_val, if_val[3], bw_val[7];
|
||||
u8 delivery_system_val, if_val[3], *conf_val_ptr;
|
||||
u8 reg_bank2_2d_val, reg_bank0_d2_val;
|
||||
|
||||
dev_dbg(&client->dev,
|
||||
"delivery_system=%u modulation=%u frequency=%u bandwidth_hz=%u symbol_rate=%u inversion=%d stream_id=%d\n",
|
||||
c->delivery_system,
|
||||
c->modulation,
|
||||
c->frequency,
|
||||
c->bandwidth_hz,
|
||||
c->symbol_rate,
|
||||
c->inversion,
|
||||
c->stream_id);
|
||||
c->delivery_system, c->modulation, c->frequency,
|
||||
c->bandwidth_hz, c->symbol_rate, c->inversion, c->stream_id);
|
||||
|
||||
if (!dev->warm) {
|
||||
if (!dev->active) {
|
||||
ret = -EAGAIN;
|
||||
goto err;
|
||||
}
|
||||
|
@ -51,30 +47,50 @@ static int mn88473_set_frontend(struct dvb_frontend *fe)
|
|||
switch (c->delivery_system) {
|
||||
case SYS_DVBT:
|
||||
delivery_system_val = 0x02;
|
||||
reg_bank2_2d_val = 0x23;
|
||||
reg_bank0_d2_val = 0x2a;
|
||||
break;
|
||||
case SYS_DVBT2:
|
||||
delivery_system_val = 0x03;
|
||||
reg_bank2_2d_val = 0x3b;
|
||||
reg_bank0_d2_val = 0x29;
|
||||
break;
|
||||
case SYS_DVBC_ANNEX_A:
|
||||
delivery_system_val = 0x04;
|
||||
reg_bank2_2d_val = 0x3b;
|
||||
reg_bank0_d2_val = 0x29;
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (c->bandwidth_hz <= 6000000) {
|
||||
memcpy(bw_val, "\xe9\x55\x55\x1c\x29\x1c\x29", 7);
|
||||
} else if (c->bandwidth_hz <= 7000000) {
|
||||
memcpy(bw_val, "\xc8\x00\x00\x17\x0a\x17\x0a", 7);
|
||||
} else if (c->bandwidth_hz <= 8000000) {
|
||||
memcpy(bw_val, "\xaf\x00\x00\x11\xec\x11\xec", 7);
|
||||
} else {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
switch (c->delivery_system) {
|
||||
case SYS_DVBT:
|
||||
case SYS_DVBT2:
|
||||
switch (c->bandwidth_hz) {
|
||||
case 6000000:
|
||||
conf_val_ptr = "\xe9\x55\x55\x1c\x29\x1c\x29";
|
||||
break;
|
||||
case 7000000:
|
||||
conf_val_ptr = "\xc8\x00\x00\x17\x0a\x17\x0a";
|
||||
break;
|
||||
case 8000000:
|
||||
conf_val_ptr = "\xaf\x00\x00\x11\xec\x11\xec";
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
break;
|
||||
case SYS_DVBC_ANNEX_A:
|
||||
conf_val_ptr = "\x10\xab\x0d\xae\x1d\x9d";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* program tuner */
|
||||
/* Program tuner */
|
||||
if (fe->ops.tuner_ops.set_params) {
|
||||
ret = fe->ops.tuner_ops.set_params(fe);
|
||||
if (ret)
|
||||
|
@ -86,27 +102,45 @@ static int mn88473_set_frontend(struct dvb_frontend *fe)
|
|||
if (ret)
|
||||
goto err;
|
||||
|
||||
dev_dbg(&client->dev, "get_if_frequency=%d\n", if_frequency);
|
||||
dev_dbg(&client->dev, "get_if_frequency=%u\n", if_frequency);
|
||||
} else {
|
||||
if_frequency = 0;
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* Calculate IF registers ( (1<<24)*IF / Xtal ) */
|
||||
tmp = div_u64(if_frequency * (u64)(1<<24) + (dev->xtal / 2),
|
||||
dev->xtal);
|
||||
if_val[0] = ((tmp >> 16) & 0xff);
|
||||
if_val[1] = ((tmp >> 8) & 0xff);
|
||||
if_val[2] = ((tmp >> 0) & 0xff);
|
||||
/* Calculate IF registers */
|
||||
uitmp = DIV_ROUND_CLOSEST_ULL((u64) if_frequency * 0x1000000, dev->clk);
|
||||
if_val[0] = (uitmp >> 16) & 0xff;
|
||||
if_val[1] = (uitmp >> 8) & 0xff;
|
||||
if_val[2] = (uitmp >> 0) & 0xff;
|
||||
|
||||
ret = regmap_write(dev->regmap[2], 0x05, 0x00);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[2], 0xfb, 0x13);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[2], 0xef, 0x13);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[2], 0xf9, 0x13);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[2], 0x00, 0x18);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[2], 0x01, 0x01);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[2], 0x02, 0x21);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[2], 0x03, delivery_system_val);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[2], 0x0b, 0x00);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
for (i = 0; i < sizeof(if_val); i++) {
|
||||
ret = regmap_write(dev->regmap[2], 0x10 + i, if_val[i]);
|
||||
|
@ -114,52 +148,85 @@ static int mn88473_set_frontend(struct dvb_frontend *fe)
|
|||
goto err;
|
||||
}
|
||||
|
||||
for (i = 0; i < sizeof(bw_val); i++) {
|
||||
ret = regmap_write(dev->regmap[2], 0x13 + i, bw_val[i]);
|
||||
switch (c->delivery_system) {
|
||||
case SYS_DVBT:
|
||||
case SYS_DVBT2:
|
||||
for (i = 0; i < 7; i++) {
|
||||
ret = regmap_write(dev->regmap[2], 0x13 + i,
|
||||
conf_val_ptr[i]);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
break;
|
||||
case SYS_DVBC_ANNEX_A:
|
||||
ret = regmap_bulk_write(dev->regmap[1], 0x10, conf_val_ptr, 6);
|
||||
if (ret)
|
||||
goto err;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
ret = regmap_write(dev->regmap[2], 0x2d, 0x3b);
|
||||
ret = regmap_write(dev->regmap[2], 0x2d, reg_bank2_2d_val);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[2], 0x2e, 0x00);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[2], 0x56, 0x0d);
|
||||
ret = regmap_write(dev->regmap[0], 0x01, 0xba);
|
||||
ret = regmap_write(dev->regmap[0], 0x02, 0x13);
|
||||
ret = regmap_write(dev->regmap[0], 0x03, 0x80);
|
||||
ret = regmap_write(dev->regmap[0], 0x04, 0xba);
|
||||
ret = regmap_write(dev->regmap[0], 0x05, 0x91);
|
||||
ret = regmap_write(dev->regmap[0], 0x07, 0xe7);
|
||||
ret = regmap_write(dev->regmap[0], 0x08, 0x28);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_bulk_write(dev->regmap[0], 0x01,
|
||||
"\xba\x13\x80\xba\x91\xdd\xe7\x28", 8);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[0], 0x0a, 0x1a);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[0], 0x13, 0x1f);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[0], 0x19, 0x03);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[0], 0x1d, 0xb0);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[0], 0x2a, 0x72);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[0], 0x2d, 0x00);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[0], 0x3c, 0x00);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[0], 0x3f, 0xf8);
|
||||
ret = regmap_write(dev->regmap[0], 0x40, 0xf4);
|
||||
ret = regmap_write(dev->regmap[0], 0x41, 0x08);
|
||||
ret = regmap_write(dev->regmap[0], 0xd2, 0x29);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_bulk_write(dev->regmap[0], 0x40, "\xf4\x08", 2);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[0], 0xd2, reg_bank0_d2_val);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[0], 0xd4, 0x55);
|
||||
ret = regmap_write(dev->regmap[1], 0x10, 0x10);
|
||||
ret = regmap_write(dev->regmap[1], 0x11, 0xab);
|
||||
ret = regmap_write(dev->regmap[1], 0x12, 0x0d);
|
||||
ret = regmap_write(dev->regmap[1], 0x13, 0xae);
|
||||
ret = regmap_write(dev->regmap[1], 0x14, 0x1d);
|
||||
ret = regmap_write(dev->regmap[1], 0x15, 0x9d);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[1], 0xbe, 0x08);
|
||||
ret = regmap_write(dev->regmap[2], 0x09, 0x08);
|
||||
ret = regmap_write(dev->regmap[2], 0x08, 0x1d);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[0], 0xb2, 0x37);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[0], 0xd7, 0x04);
|
||||
ret = regmap_write(dev->regmap[2], 0x32, 0x80);
|
||||
ret = regmap_write(dev->regmap[2], 0x36, 0x00);
|
||||
ret = regmap_write(dev->regmap[2], 0xf8, 0x9f);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
dev->delivery_system = c->delivery_system;
|
||||
/* Reset FSM */
|
||||
ret = regmap_write(dev->regmap[2], 0xf8, 0x9f);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
return 0;
|
||||
err:
|
||||
|
@ -173,51 +240,61 @@ static int mn88473_read_status(struct dvb_frontend *fe, enum fe_status *status)
|
|||
struct mn88473_dev *dev = i2c_get_clientdata(client);
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
int ret;
|
||||
unsigned int utmp;
|
||||
int lock = 0;
|
||||
unsigned int uitmp;
|
||||
|
||||
*status = 0;
|
||||
|
||||
if (!dev->warm) {
|
||||
if (!dev->active) {
|
||||
ret = -EAGAIN;
|
||||
goto err;
|
||||
}
|
||||
|
||||
*status = 0;
|
||||
|
||||
switch (c->delivery_system) {
|
||||
case SYS_DVBT:
|
||||
ret = regmap_read(dev->regmap[0], 0x62, &utmp);
|
||||
ret = regmap_read(dev->regmap[0], 0x62, &uitmp);
|
||||
if (ret)
|
||||
goto err;
|
||||
if (!(utmp & 0xA0)) {
|
||||
if ((utmp & 0xF) >= 0x03)
|
||||
*status |= FE_HAS_SIGNAL;
|
||||
if ((utmp & 0xF) >= 0x09)
|
||||
lock = 1;
|
||||
|
||||
if (!(uitmp & 0xa0)) {
|
||||
if ((uitmp & 0x0f) >= 0x09)
|
||||
*status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
|
||||
FE_HAS_VITERBI | FE_HAS_SYNC |
|
||||
FE_HAS_LOCK;
|
||||
else if ((uitmp & 0x0f) >= 0x03)
|
||||
*status = FE_HAS_SIGNAL | FE_HAS_CARRIER;
|
||||
}
|
||||
break;
|
||||
case SYS_DVBT2:
|
||||
ret = regmap_read(dev->regmap[2], 0x8B, &utmp);
|
||||
ret = regmap_read(dev->regmap[2], 0x8b, &uitmp);
|
||||
if (ret)
|
||||
goto err;
|
||||
if (!(utmp & 0x40)) {
|
||||
if ((utmp & 0xF) >= 0x07)
|
||||
*status |= FE_HAS_SIGNAL;
|
||||
if ((utmp & 0xF) >= 0x0a)
|
||||
*status |= FE_HAS_CARRIER;
|
||||
if ((utmp & 0xF) >= 0x0d)
|
||||
*status |= FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
|
||||
|
||||
if (!(uitmp & 0x40)) {
|
||||
if ((uitmp & 0x0f) >= 0x0d)
|
||||
*status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
|
||||
FE_HAS_VITERBI | FE_HAS_SYNC |
|
||||
FE_HAS_LOCK;
|
||||
else if ((uitmp & 0x0f) >= 0x0a)
|
||||
*status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
|
||||
FE_HAS_VITERBI;
|
||||
else if ((uitmp & 0x0f) >= 0x07)
|
||||
*status = FE_HAS_SIGNAL | FE_HAS_CARRIER;
|
||||
}
|
||||
break;
|
||||
case SYS_DVBC_ANNEX_A:
|
||||
ret = regmap_read(dev->regmap[1], 0x85, &utmp);
|
||||
ret = regmap_read(dev->regmap[1], 0x85, &uitmp);
|
||||
if (ret)
|
||||
goto err;
|
||||
if (!(utmp & 0x40)) {
|
||||
ret = regmap_read(dev->regmap[1], 0x89, &utmp);
|
||||
|
||||
if (!(uitmp & 0x40)) {
|
||||
ret = regmap_read(dev->regmap[1], 0x89, &uitmp);
|
||||
if (ret)
|
||||
goto err;
|
||||
if (utmp & 0x01)
|
||||
lock = 1;
|
||||
|
||||
if (uitmp & 0x01)
|
||||
*status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
|
||||
FE_HAS_VITERBI | FE_HAS_SYNC |
|
||||
FE_HAS_LOCK;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -225,10 +302,6 @@ static int mn88473_read_status(struct dvb_frontend *fe, enum fe_status *status)
|
|||
goto err;
|
||||
}
|
||||
|
||||
if (lock)
|
||||
*status = FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI |
|
||||
FE_HAS_SYNC | FE_HAS_LOCK;
|
||||
|
||||
return 0;
|
||||
err:
|
||||
dev_dbg(&client->dev, "failed=%d\n", ret);
|
||||
|
@ -239,85 +312,76 @@ static int mn88473_init(struct dvb_frontend *fe)
|
|||
{
|
||||
struct i2c_client *client = fe->demodulator_priv;
|
||||
struct mn88473_dev *dev = i2c_get_clientdata(client);
|
||||
int ret, len, remaining;
|
||||
const struct firmware *fw = NULL;
|
||||
u8 *fw_file = MN88473_FIRMWARE;
|
||||
unsigned int tmp;
|
||||
int ret, len, remain;
|
||||
unsigned int uitmp;
|
||||
const struct firmware *fw;
|
||||
const char *name = MN88473_FIRMWARE;
|
||||
|
||||
dev_dbg(&client->dev, "\n");
|
||||
|
||||
/* set cold state by default */
|
||||
dev->warm = false;
|
||||
|
||||
/* check if firmware is already running */
|
||||
ret = regmap_read(dev->regmap[0], 0xf5, &tmp);
|
||||
/* Check if firmware is already running */
|
||||
ret = regmap_read(dev->regmap[0], 0xf5, &uitmp);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
if (!(tmp & 0x1)) {
|
||||
dev_info(&client->dev, "firmware already running\n");
|
||||
dev->warm = true;
|
||||
return 0;
|
||||
}
|
||||
if (!(uitmp & 0x01))
|
||||
goto warm;
|
||||
|
||||
/* request the firmware, this will block and timeout */
|
||||
ret = request_firmware(&fw, fw_file, &client->dev);
|
||||
/* Request the firmware, this will block and timeout */
|
||||
ret = request_firmware(&fw, name, &client->dev);
|
||||
if (ret) {
|
||||
dev_err(&client->dev, "firmare file '%s' not found\n", fw_file);
|
||||
goto err_request_firmware;
|
||||
dev_err(&client->dev, "firmare file '%s' not found\n", name);
|
||||
goto err;
|
||||
}
|
||||
|
||||
dev_info(&client->dev, "downloading firmware from file '%s'\n",
|
||||
fw_file);
|
||||
dev_info(&client->dev, "downloading firmware from file '%s'\n", name);
|
||||
|
||||
ret = regmap_write(dev->regmap[0], 0xf5, 0x03);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
for (remaining = fw->size; remaining > 0;
|
||||
remaining -= (dev->i2c_wr_max - 1)) {
|
||||
len = remaining;
|
||||
if (len > (dev->i2c_wr_max - 1))
|
||||
len = dev->i2c_wr_max - 1;
|
||||
goto err_release_firmware;
|
||||
|
||||
for (remain = fw->size; remain > 0; remain -= (dev->i2c_wr_max - 1)) {
|
||||
len = min(dev->i2c_wr_max - 1, remain);
|
||||
ret = regmap_bulk_write(dev->regmap[0], 0xf6,
|
||||
&fw->data[fw->size - remaining], len);
|
||||
&fw->data[fw->size - remain], len);
|
||||
if (ret) {
|
||||
dev_err(&client->dev, "firmware download failed=%d\n",
|
||||
dev_err(&client->dev, "firmware download failed %d\n",
|
||||
ret);
|
||||
goto err;
|
||||
goto err_release_firmware;
|
||||
}
|
||||
}
|
||||
|
||||
/* parity check of firmware */
|
||||
ret = regmap_read(dev->regmap[0], 0xf8, &tmp);
|
||||
if (ret) {
|
||||
dev_err(&client->dev,
|
||||
"parity reg read failed=%d\n", ret);
|
||||
release_firmware(fw);
|
||||
|
||||
/* Parity check of firmware */
|
||||
ret = regmap_read(dev->regmap[0], 0xf8, &uitmp);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
if (uitmp & 0x10) {
|
||||
dev_err(&client->dev, "firmware parity check failed\n");
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
if (tmp & 0x10) {
|
||||
dev_err(&client->dev,
|
||||
"firmware parity check failed=0x%x\n", tmp);
|
||||
goto err;
|
||||
}
|
||||
dev_err(&client->dev, "firmware parity check succeeded=0x%x\n", tmp);
|
||||
|
||||
ret = regmap_write(dev->regmap[0], 0xf5, 0x00);
|
||||
if (ret)
|
||||
goto err;
|
||||
warm:
|
||||
/* TS config */
|
||||
ret = regmap_write(dev->regmap[2], 0x09, 0x08);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap[2], 0x08, 0x1d);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
release_firmware(fw);
|
||||
fw = NULL;
|
||||
|
||||
/* warm state */
|
||||
dev->warm = true;
|
||||
dev->active = true;
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
err_release_firmware:
|
||||
release_firmware(fw);
|
||||
err_request_firmware:
|
||||
err:
|
||||
dev_dbg(&client->dev, "failed=%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
@ -330,20 +394,20 @@ static int mn88473_sleep(struct dvb_frontend *fe)
|
|||
|
||||
dev_dbg(&client->dev, "\n");
|
||||
|
||||
dev->active = false;
|
||||
|
||||
ret = regmap_write(dev->regmap[2], 0x05, 0x3e);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
dev->delivery_system = SYS_UNDEFINED;
|
||||
|
||||
return 0;
|
||||
err:
|
||||
dev_dbg(&client->dev, "failed=%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct dvb_frontend_ops mn88473_ops = {
|
||||
.delsys = {SYS_DVBT, SYS_DVBT2, SYS_DVBC_ANNEX_AC},
|
||||
static const struct dvb_frontend_ops mn88473_ops = {
|
||||
.delsys = {SYS_DVBT, SYS_DVBT2, SYS_DVBC_ANNEX_A},
|
||||
.info = {
|
||||
.name = "Panasonic MN88473",
|
||||
.symbol_rate_min = 1000000,
|
||||
|
@ -365,8 +429,7 @@ static struct dvb_frontend_ops mn88473_ops = {
|
|||
FE_CAN_GUARD_INTERVAL_AUTO |
|
||||
FE_CAN_HIERARCHY_AUTO |
|
||||
FE_CAN_MUTE_TS |
|
||||
FE_CAN_2G_MODULATION |
|
||||
FE_CAN_MULTISTREAM
|
||||
FE_CAN_2G_MODULATION
|
||||
},
|
||||
|
||||
.get_tune_settings = mn88473_get_tune_settings,
|
||||
|
@ -385,7 +448,7 @@ static int mn88473_probe(struct i2c_client *client,
|
|||
struct mn88473_config *config = client->dev.platform_data;
|
||||
struct mn88473_dev *dev;
|
||||
int ret;
|
||||
unsigned int utmp;
|
||||
unsigned int uitmp;
|
||||
static const struct regmap_config regmap_config = {
|
||||
.reg_bits = 8,
|
||||
.val_bits = 8,
|
||||
|
@ -393,7 +456,7 @@ static int mn88473_probe(struct i2c_client *client,
|
|||
|
||||
dev_dbg(&client->dev, "\n");
|
||||
|
||||
/* Caller really need to provide pointer for frontend we create. */
|
||||
/* Caller really need to provide pointer for frontend we create */
|
||||
if (config->fe == NULL) {
|
||||
dev_err(&client->dev, "frontend pointer not defined\n");
|
||||
ret = -EINVAL;
|
||||
|
@ -406,11 +469,15 @@ static int mn88473_probe(struct i2c_client *client,
|
|||
goto err;
|
||||
}
|
||||
|
||||
dev->i2c_wr_max = config->i2c_wr_max;
|
||||
if (!config->xtal)
|
||||
dev->xtal = 25000000;
|
||||
if (config->i2c_wr_max)
|
||||
dev->i2c_wr_max = config->i2c_wr_max;
|
||||
else
|
||||
dev->xtal = config->xtal;
|
||||
dev->i2c_wr_max = ~0;
|
||||
|
||||
if (config->xtal)
|
||||
dev->clk = config->xtal;
|
||||
else
|
||||
dev->clk = 25000000;
|
||||
dev->client[0] = client;
|
||||
dev->regmap[0] = regmap_init_i2c(dev->client[0], ®map_config);
|
||||
if (IS_ERR(dev->regmap[0])) {
|
||||
|
@ -418,15 +485,25 @@ static int mn88473_probe(struct i2c_client *client,
|
|||
goto err_kfree;
|
||||
}
|
||||
|
||||
/* check demod answers to I2C */
|
||||
ret = regmap_read(dev->regmap[0], 0x00, &utmp);
|
||||
/* Check demod answers with correct chip id */
|
||||
ret = regmap_read(dev->regmap[0], 0xff, &uitmp);
|
||||
if (ret)
|
||||
goto err_regmap_0_regmap_exit;
|
||||
|
||||
dev_dbg(&client->dev, "chip id=%02x\n", uitmp);
|
||||
|
||||
if (uitmp != 0x03) {
|
||||
ret = -ENODEV;
|
||||
goto err_regmap_0_regmap_exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* Chip has three I2C addresses for different register pages. Used
|
||||
* Chip has three I2C addresses for different register banks. Used
|
||||
* addresses are 0x18, 0x1a and 0x1c. We register two dummy clients,
|
||||
* 0x1a and 0x1c, in order to get own I2C client for each register page.
|
||||
* 0x1a and 0x1c, in order to get own I2C client for each register bank.
|
||||
*
|
||||
* Also, register bank 2 do not support sequential I/O. Only single
|
||||
* register write or read is allowed to that bank.
|
||||
*/
|
||||
dev->client[1] = i2c_new_dummy(client->adapter, 0x1a);
|
||||
if (dev->client[1] == NULL) {
|
||||
|
@ -456,13 +533,19 @@ static int mn88473_probe(struct i2c_client *client,
|
|||
}
|
||||
i2c_set_clientdata(dev->client[2], dev);
|
||||
|
||||
/* create dvb_frontend */
|
||||
memcpy(&dev->fe.ops, &mn88473_ops, sizeof(struct dvb_frontend_ops));
|
||||
dev->fe.demodulator_priv = client;
|
||||
*config->fe = &dev->fe;
|
||||
/* Sleep because chip is active by default */
|
||||
ret = regmap_write(dev->regmap[2], 0x05, 0x3e);
|
||||
if (ret)
|
||||
goto err_client_2_i2c_unregister_device;
|
||||
|
||||
/* Create dvb frontend */
|
||||
memcpy(&dev->frontend.ops, &mn88473_ops, sizeof(dev->frontend.ops));
|
||||
dev->frontend.demodulator_priv = client;
|
||||
*config->fe = &dev->frontend;
|
||||
i2c_set_clientdata(client, dev);
|
||||
|
||||
dev_info(&dev->client[0]->dev, "Panasonic MN88473 successfully attached\n");
|
||||
dev_info(&client->dev, "Panasonic MN88473 successfully identified\n");
|
||||
|
||||
return 0;
|
||||
|
||||
err_client_2_i2c_unregister_device:
|
||||
|
@ -507,7 +590,8 @@ MODULE_DEVICE_TABLE(i2c, mn88473_id_table);
|
|||
|
||||
static struct i2c_driver mn88473_driver = {
|
||||
.driver = {
|
||||
.name = "mn88473",
|
||||
.name = "mn88473",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe = mn88473_probe,
|
||||
.remove = mn88473_remove,
|
|
@ -22,10 +22,16 @@
|
|||
struct mn88473_config {
|
||||
/*
|
||||
* Max num of bytes given I2C adapter could write at once.
|
||||
* Default: none
|
||||
* Default: unlimited
|
||||
*/
|
||||
u16 i2c_wr_max;
|
||||
|
||||
/*
|
||||
* Xtal frequency Hz.
|
||||
* Default: 25000000
|
||||
*/
|
||||
u32 xtal;
|
||||
|
||||
|
||||
/* Everything after that is returned by the driver. */
|
||||
|
||||
|
@ -33,12 +39,6 @@ struct mn88473_config {
|
|||
* DVB frontend.
|
||||
*/
|
||||
struct dvb_frontend **fe;
|
||||
|
||||
/*
|
||||
* Xtal frequency.
|
||||
* Hz
|
||||
*/
|
||||
u32 xtal;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -27,11 +27,10 @@
|
|||
struct mn88473_dev {
|
||||
struct i2c_client *client[3];
|
||||
struct regmap *regmap[3];
|
||||
struct dvb_frontend fe;
|
||||
struct dvb_frontend frontend;
|
||||
u16 i2c_wr_max;
|
||||
enum fe_delivery_system delivery_system;
|
||||
bool warm; /* FW running */
|
||||
u32 xtal;
|
||||
bool active;
|
||||
u32 clk;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -647,9 +647,9 @@ static int mt312_set_frontend(struct dvb_frontend *fe)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int mt312_get_frontend(struct dvb_frontend *fe)
|
||||
static int mt312_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *p)
|
||||
{
|
||||
struct dtv_frontend_properties *p = &fe->dtv_property_cache;
|
||||
struct mt312_state *state = fe->demodulator_priv;
|
||||
int ret;
|
||||
|
||||
|
|
|
@ -311,9 +311,9 @@ static int mt352_set_parameters(struct dvb_frontend *fe)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int mt352_get_parameters(struct dvb_frontend* fe)
|
||||
static int mt352_get_parameters(struct dvb_frontend* fe,
|
||||
struct dtv_frontend_properties *op)
|
||||
{
|
||||
struct dtv_frontend_properties *op = &fe->dtv_property_cache;
|
||||
struct mt352_state* state = fe->demodulator_priv;
|
||||
u16 tps;
|
||||
u16 div;
|
||||
|
|
|
@ -375,9 +375,9 @@ static int or51132_set_parameters(struct dvb_frontend *fe)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int or51132_get_parameters(struct dvb_frontend* fe)
|
||||
static int or51132_get_parameters(struct dvb_frontend* fe,
|
||||
struct dtv_frontend_properties *p)
|
||||
{
|
||||
struct dtv_frontend_properties *p = &fe->dtv_property_cache;
|
||||
struct or51132_state* state = fe->demodulator_priv;
|
||||
int status;
|
||||
int retry = 1;
|
||||
|
|
|
@ -279,11 +279,11 @@ err:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int rtl2830_get_frontend(struct dvb_frontend *fe)
|
||||
static int rtl2830_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct i2c_client *client = fe->demodulator_priv;
|
||||
struct rtl2830_dev *dev = i2c_get_clientdata(client);
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
int ret;
|
||||
u8 buf[3];
|
||||
|
||||
|
@ -900,6 +900,9 @@ static int rtl2830_remove(struct i2c_client *client)
|
|||
|
||||
dev_dbg(&client->dev, "\n");
|
||||
|
||||
/* stop statistics polling */
|
||||
cancel_delayed_work_sync(&dev->stat_work);
|
||||
|
||||
i2c_del_mux_adapter(dev->adapter);
|
||||
regmap_exit(dev->regmap);
|
||||
kfree(dev);
|
||||
|
|
|
@ -347,6 +347,10 @@ static int rtl2832_init(struct dvb_frontend *fe)
|
|||
|
||||
dev_dbg(&client->dev, "\n");
|
||||
|
||||
ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(rtl2832_initial_regs); i++) {
|
||||
ret = rtl2832_wr_demod_reg(dev, rtl2832_initial_regs[i].reg,
|
||||
rtl2832_initial_regs[i].value);
|
||||
|
@ -404,8 +408,6 @@ static int rtl2832_init(struct dvb_frontend *fe)
|
|||
c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
|
||||
c->post_bit_count.len = 1;
|
||||
c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
|
||||
/* start statistics polling */
|
||||
schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
|
||||
dev->sleeping = false;
|
||||
|
||||
return 0;
|
||||
|
@ -423,8 +425,6 @@ static int rtl2832_sleep(struct dvb_frontend *fe)
|
|||
dev_dbg(&client->dev, "\n");
|
||||
|
||||
dev->sleeping = true;
|
||||
/* stop statistics polling */
|
||||
cancel_delayed_work_sync(&dev->stat_work);
|
||||
dev->fe_status = 0;
|
||||
|
||||
ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
|
||||
|
@ -491,11 +491,6 @@ 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_bulk_write(client, 0x192, "\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;
|
||||
|
@ -575,11 +570,11 @@ err:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int rtl2832_get_frontend(struct dvb_frontend *fe)
|
||||
static int rtl2832_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *c)
|
||||
{
|
||||
struct rtl2832_dev *dev = fe->demodulator_priv;
|
||||
struct i2c_client *client = dev->client;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
int ret;
|
||||
u8 buf[3];
|
||||
|
||||
|
@ -692,8 +687,11 @@ static int rtl2832_read_status(struct dvb_frontend *fe, enum fe_status *status)
|
|||
{
|
||||
struct rtl2832_dev *dev = fe->demodulator_priv;
|
||||
struct i2c_client *client = dev->client;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
int ret;
|
||||
u32 uninitialized_var(tmp);
|
||||
u8 u8tmp, buf[2];
|
||||
u16 u16tmp;
|
||||
|
||||
dev_dbg(&client->dev, "\n");
|
||||
|
||||
|
@ -714,45 +712,6 @@ static int rtl2832_read_status(struct dvb_frontend *fe, enum fe_status *status)
|
|||
}
|
||||
|
||||
dev->fe_status = *status;
|
||||
return 0;
|
||||
err:
|
||||
dev_dbg(&client->dev, "failed=%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
|
||||
{
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
|
||||
/* report SNR in resolution of 0.1 dB */
|
||||
if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL)
|
||||
*snr = div_s64(c->cnr.stat[0].svalue, 100);
|
||||
else
|
||||
*snr = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
|
||||
{
|
||||
struct rtl2832_dev *dev = fe->demodulator_priv;
|
||||
|
||||
*ber = (dev->post_bit_error - dev->post_bit_error_prev);
|
||||
dev->post_bit_error_prev = dev->post_bit_error;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rtl2832_stat_work(struct work_struct *work)
|
||||
{
|
||||
struct rtl2832_dev *dev = container_of(work, struct rtl2832_dev, stat_work.work);
|
||||
struct i2c_client *client = dev->client;
|
||||
struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
|
||||
int ret, tmp;
|
||||
u8 u8tmp, buf[2];
|
||||
u16 u16tmp;
|
||||
|
||||
dev_dbg(&client->dev, "\n");
|
||||
|
||||
/* signal strength */
|
||||
if (dev->fe_status & FE_HAS_SIGNAL) {
|
||||
|
@ -789,11 +748,11 @@ static void rtl2832_stat_work(struct work_struct *work)
|
|||
|
||||
constellation = (u8tmp >> 2) & 0x03; /* [3:2] */
|
||||
if (constellation > CONSTELLATION_NUM - 1)
|
||||
goto err_schedule_delayed_work;
|
||||
goto err;
|
||||
|
||||
hierarchy = (u8tmp >> 4) & 0x07; /* [6:4] */
|
||||
if (hierarchy > HIERARCHY_NUM - 1)
|
||||
goto err_schedule_delayed_work;
|
||||
goto err;
|
||||
|
||||
ret = rtl2832_bulk_read(client, 0x40c, buf, 2);
|
||||
if (ret)
|
||||
|
@ -835,11 +794,33 @@ static void rtl2832_stat_work(struct work_struct *work)
|
|||
c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
|
||||
}
|
||||
|
||||
err_schedule_delayed_work:
|
||||
schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
|
||||
return;
|
||||
return 0;
|
||||
err:
|
||||
dev_dbg(&client->dev, "failed=%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
|
||||
{
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
|
||||
/* report SNR in resolution of 0.1 dB */
|
||||
if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL)
|
||||
*snr = div_s64(c->cnr.stat[0].svalue, 100);
|
||||
else
|
||||
*snr = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
|
||||
{
|
||||
struct rtl2832_dev *dev = fe->demodulator_priv;
|
||||
|
||||
*ber = (dev->post_bit_error - dev->post_bit_error_prev);
|
||||
dev->post_bit_error_prev = dev->post_bit_error;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1081,37 +1062,46 @@ static struct i2c_adapter *rtl2832_get_i2c_adapter(struct i2c_client *client)
|
|||
return dev->i2c_adapter_tuner;
|
||||
}
|
||||
|
||||
static int rtl2832_enable_slave_ts(struct i2c_client *client)
|
||||
static int rtl2832_slave_ts_ctrl(struct i2c_client *client, bool enable)
|
||||
{
|
||||
struct rtl2832_dev *dev = i2c_get_clientdata(client);
|
||||
int ret;
|
||||
|
||||
dev_dbg(&client->dev, "\n");
|
||||
dev_dbg(&client->dev, "enable=%d\n", enable);
|
||||
|
||||
ret = rtl2832_bulk_write(client, 0x10c, "\x5f\xff", 2);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x1);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = rtl2832_bulk_write(client, 0x0bc, "\x18", 1);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = rtl2832_bulk_write(client, 0x192, "\x7f\xf7\xff", 3);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
/* soft reset */
|
||||
ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
|
||||
if (ret)
|
||||
goto err;
|
||||
if (enable) {
|
||||
ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = rtl2832_bulk_write(client, 0x10c, "\x5f\xff", 2);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x1);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = rtl2832_bulk_write(client, 0x0bc, "\x18", 1);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = rtl2832_bulk_write(client, 0x192, "\x7f\xf7\xff", 3);
|
||||
if (ret)
|
||||
goto err;
|
||||
} else {
|
||||
ret = rtl2832_bulk_write(client, 0x192, "\x00\x0f\xff", 3);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = rtl2832_bulk_write(client, 0x0bc, "\x08", 1);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x0);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = rtl2832_bulk_write(client, 0x10c, "\x00\x00", 2);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
err:
|
||||
|
@ -1227,7 +1217,6 @@ static int rtl2832_probe(struct i2c_client *client,
|
|||
dev->pdata = client->dev.platform_data;
|
||||
dev->sleeping = true;
|
||||
INIT_DELAYED_WORK(&dev->i2c_gate_work, rtl2832_i2c_gate_work);
|
||||
INIT_DELAYED_WORK(&dev->stat_work, rtl2832_stat_work);
|
||||
/* create regmap */
|
||||
mutex_init(&dev->regmap_mutex);
|
||||
dev->regmap_config.reg_bits = 8,
|
||||
|
@ -1267,7 +1256,7 @@ static int rtl2832_probe(struct i2c_client *client,
|
|||
/* setup callbacks */
|
||||
pdata->get_dvb_frontend = rtl2832_get_dvb_frontend;
|
||||
pdata->get_i2c_adapter = rtl2832_get_i2c_adapter;
|
||||
pdata->enable_slave_ts = rtl2832_enable_slave_ts;
|
||||
pdata->slave_ts_ctrl = rtl2832_slave_ts_ctrl;
|
||||
pdata->pid_filter = rtl2832_pid_filter;
|
||||
pdata->pid_filter_ctrl = rtl2832_pid_filter_ctrl;
|
||||
pdata->bulk_read = rtl2832_bulk_read;
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
* @tuner: Used tuner model.
|
||||
* @get_dvb_frontend: Get DVB frontend.
|
||||
* @get_i2c_adapter: Get I2C adapter.
|
||||
* @enable_slave_ts: Enable slave TS IF.
|
||||
* @slave_ts_ctrl: Control slave TS interface.
|
||||
* @pid_filter: Set PID to PID filter.
|
||||
* @pid_filter_ctrl: Control PID filter.
|
||||
*/
|
||||
|
@ -53,7 +53,7 @@ struct rtl2832_platform_data {
|
|||
|
||||
struct dvb_frontend* (*get_dvb_frontend)(struct i2c_client *);
|
||||
struct i2c_adapter* (*get_i2c_adapter)(struct i2c_client *);
|
||||
int (*enable_slave_ts)(struct i2c_client *);
|
||||
int (*slave_ts_ctrl)(struct i2c_client *, bool);
|
||||
int (*pid_filter)(struct dvb_frontend *, u8, u16, int);
|
||||
int (*pid_filter_ctrl)(struct dvb_frontend *, int);
|
||||
/* private: Register access for SDR module use only */
|
||||
|
|
|
@ -38,7 +38,6 @@ struct rtl2832_dev {
|
|||
struct regmap *regmap;
|
||||
struct i2c_adapter *i2c_adapter_tuner;
|
||||
struct dvb_frontend fe;
|
||||
struct delayed_work stat_work;
|
||||
enum fe_status fe_status;
|
||||
u64 post_bit_error_prev; /* for old DVBv3 read_ber() calculation */
|
||||
u64 post_bit_error;
|
||||
|
|
|
@ -925,9 +925,9 @@ static int s5h1409_read_ber(struct dvb_frontend *fe, u32 *ber)
|
|||
return s5h1409_read_ucblocks(fe, ber);
|
||||
}
|
||||
|
||||
static int s5h1409_get_frontend(struct dvb_frontend *fe)
|
||||
static int s5h1409_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *p)
|
||||
{
|
||||
struct dtv_frontend_properties *p = &fe->dtv_property_cache;
|
||||
struct s5h1409_state *state = fe->demodulator_priv;
|
||||
|
||||
p->frequency = state->current_frequency;
|
||||
|
|
|
@ -840,9 +840,9 @@ static int s5h1411_read_ber(struct dvb_frontend *fe, u32 *ber)
|
|||
return s5h1411_read_ucblocks(fe, ber);
|
||||
}
|
||||
|
||||
static int s5h1411_get_frontend(struct dvb_frontend *fe)
|
||||
static int s5h1411_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *p)
|
||||
{
|
||||
struct dtv_frontend_properties *p = &fe->dtv_property_cache;
|
||||
struct s5h1411_state *state = fe->demodulator_priv;
|
||||
|
||||
p->frequency = state->current_frequency;
|
||||
|
|
|
@ -756,9 +756,9 @@ static int s5h1420_set_frontend(struct dvb_frontend *fe)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int s5h1420_get_frontend(struct dvb_frontend* fe)
|
||||
static int s5h1420_get_frontend(struct dvb_frontend* fe,
|
||||
struct dtv_frontend_properties *p)
|
||||
{
|
||||
struct dtv_frontend_properties *p = &fe->dtv_property_cache;
|
||||
struct s5h1420_state* state = fe->demodulator_priv;
|
||||
|
||||
p->frequency = state->tunedfreq + s5h1420_getfreqoffset(state);
|
||||
|
|
|
@ -433,9 +433,9 @@ static int s921_set_frontend(struct dvb_frontend *fe)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int s921_get_frontend(struct dvb_frontend *fe)
|
||||
static int s921_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *p)
|
||||
{
|
||||
struct dtv_frontend_properties *p = &fe->dtv_property_cache;
|
||||
struct s921_state *state = fe->demodulator_priv;
|
||||
|
||||
/* FIXME: Probably it is possible to get it from regs f1 and f2 */
|
||||
|
|
|
@ -225,22 +225,18 @@ static int si2165_writereg32(struct si2165_state *state, const u16 reg, u32 val)
|
|||
static int si2165_writereg_mask8(struct si2165_state *state, const u16 reg,
|
||||
u8 val, u8 mask)
|
||||
{
|
||||
int ret;
|
||||
u8 tmp;
|
||||
|
||||
if (mask != 0xff) {
|
||||
ret = si2165_readreg8(state, reg, &tmp);
|
||||
u8 tmp;
|
||||
int ret = si2165_readreg8(state, reg, &tmp);
|
||||
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
return ret;
|
||||
|
||||
val &= mask;
|
||||
tmp &= ~mask;
|
||||
val |= tmp;
|
||||
}
|
||||
|
||||
ret = si2165_writereg8(state, reg, val);
|
||||
err:
|
||||
return ret;
|
||||
return si2165_writereg8(state, reg, val);
|
||||
}
|
||||
|
||||
#define REG16(reg, val) { (reg), (val) & 0xff }, { (reg)+1, (val)>>8 & 0xff }
|
||||
|
@ -825,19 +821,19 @@ static int si2165_set_frontend_dvbt(struct dvb_frontend *fe)
|
|||
struct si2165_state *state = fe->demodulator_priv;
|
||||
u32 dvb_rate = 0;
|
||||
u16 bw10k;
|
||||
u32 bw_hz = p->bandwidth_hz;
|
||||
|
||||
dprintk("%s: called\n", __func__);
|
||||
|
||||
if (!state->has_dvbt)
|
||||
return -EINVAL;
|
||||
|
||||
if (p->bandwidth_hz > 0) {
|
||||
dvb_rate = p->bandwidth_hz * 8 / 7;
|
||||
bw10k = p->bandwidth_hz / 10000;
|
||||
} else {
|
||||
dvb_rate = 8 * 8 / 7;
|
||||
bw10k = 800;
|
||||
}
|
||||
/* no bandwidth auto-detection */
|
||||
if (bw_hz == 0)
|
||||
return -EINVAL;
|
||||
|
||||
dvb_rate = bw_hz * 8 / 7;
|
||||
bw10k = bw_hz / 10000;
|
||||
|
||||
ret = si2165_adjust_pll_divl(state, 12);
|
||||
if (ret < 0)
|
||||
|
|
|
@ -1568,9 +1568,9 @@ static enum dvbfe_search stb0899_search(struct dvb_frontend *fe)
|
|||
return DVBFE_ALGO_SEARCH_ERROR;
|
||||
}
|
||||
|
||||
static int stb0899_get_frontend(struct dvb_frontend *fe)
|
||||
static int stb0899_get_frontend(struct dvb_frontend *fe,
|
||||
struct dtv_frontend_properties *p)
|
||||
{
|
||||
struct dtv_frontend_properties *p = &fe->dtv_property_cache;
|
||||
struct stb0899_state *state = fe->demodulator_priv;
|
||||
struct stb0899_internal *internal = &state->internal;
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue