media updates for v5.7-rc1
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE+QmuaPwR3wnBdVwACF8+vY7k4RUFAl6Bvm0ACgkQCF8+vY7k 4RViMQ//baNJyAA8/Hpxz1w5+nL5hsTOhf2PcPgnCLkRVQnIiKMZoq7AS5KWtbqu im0SM6nWduGc2T/44Ew13YmBnuWMdXL9Gs8XtAkNakgSV1UM+A3pRuOWRYCyU3Ts 1QDsc3N7oY9cvyJGWOlqdcA4gp4AaKxjS6M6Z18wYBk/jYSCcj4ZVecT89DYeeM7 wFORkv/xSdgC3eoKWEwTyglzUmrXKrbfHdcNWrQBg+1SN3WrMYQWCL6nSYMqn0Vu f9L5E6jUSx9s6+apxS0OUQmDj78RM1JCEY1P8lgc3tAtVJ+X3yZbxwtpcvujhFPv c48NUQeyxAJc7evarvkd73Gwl4buujqHSgiRUovHwqUXHJuGZ3PBTryV9HzbmYYy EeHS/23t09F3j9zYtuoDNFIED03Mi+TNeS04cq8OIfwNl7xpUSEV0S/wd11V2308 cfm6lsogGE9HRbaIxCHgx4AiGFVhbpK1OQt66iYze8r/wyxnN8MVOHGWw+eI4LRK 9gwh7Wx37k6uCrjfOnLSgx7kcJ+mxSZEYyHJZqqtPm9H1SC68GOxhL/S3Zu7arvK eiwFfxJBiunCEfauOx28kaAdvBZVyEvYeDFYl/k+q4DCIGjvK0FXud6QRjNXv24S qUXYZKPUALTFOpbkQ3IQiBOQNM4NhF15RzCqRUptVnlF05MSywg= =Ve8R -----END PGP SIGNATURE----- Merge tag 'media/v5.7-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media Pull media updates from Mauro Carvalho Chehab: - New sensor driver: imx219 - Support for some new pixelformats - Support for Sun8i SoC - Added more codecs to meson vdec driver - Prepare for removing the legacy usbvision driver by moving it to staging. This driver has issues and use legacy core APIs. If nobody steps up to address those, it is time for its retirement. - Several cleanups and improvements on drivers, with the addition of new supported boards * tag 'media/v5.7-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (236 commits) media: venus: firmware: Ignore secure call error on first resume media: mtk-vpu: load vpu firmware from the new location media: i2c: video-i2c: fix build errors due to 'imply hwmon' media: MAINTAINERS: add myself to co-maintain Hantro G1/G2 for i.MX8MQ media: hantro: add initial i.MX8MQ support media: dt-bindings: Document i.MX8MQ VPU bindings media: vivid: fix incorrect PA assignment to HDMI outputs media: hantro: Add linux-rockchip mailing list to MAINTAINERS media: cedrus: h264: Fix 4K decoding on H6 media: siano: Use scnprintf() for avoiding potential buffer overflow media: rc: Use scnprintf() for avoiding potential buffer overflow media: allegro: create new struct for channel parameters media: allegro: move mail definitions to separate file media: allegro: pass buffers through firmware media: allegro: verify source and destination buffer in VCU response media: allegro: handle dependency of bitrate and bitrate_peak media: allegro: read bitrate mode directly from control media: allegro: make QP configurable media: allegro: make frame rate configurable media: allegro: skip filler data if possible ...
This commit is contained in:
commit
063d194224
1
.mailmap
1
.mailmap
@ -244,6 +244,7 @@ Santosh Shilimkar <ssantosh@kernel.org>
|
||||
Santosh Shilimkar <santosh.shilimkar@oracle.org>
|
||||
Sascha Hauer <s.hauer@pengutronix.de>
|
||||
S.Çağlar Onur <caglar@pardus.org.tr>
|
||||
Sakari Ailus <sakari.ailus@linux.intel.com> <sakari.ailus@iki.fi>
|
||||
Sean Nyekjaer <sean@geanix.com> <sean.nyekjaer@prevas.dk>
|
||||
Sebastian Reichel <sre@kernel.org> <sre@debian.org>
|
||||
Sebastian Reichel <sre@kernel.org> <sebastian.reichel@collabora.co.uk>
|
||||
|
@ -6,16 +6,22 @@ Required properties:
|
||||
|
||||
Optional properties:
|
||||
- label: a symbolic name for the connector
|
||||
- sdtv-standards: limit the supported TV standards on a connector to the given
|
||||
ones. If not specified all TV standards are allowed.
|
||||
Possible TV standards are defined in
|
||||
include/dt-bindings/display/sdtv-standards.h.
|
||||
|
||||
Required nodes:
|
||||
- Video port for TV input
|
||||
|
||||
Example
|
||||
-------
|
||||
#include <dt-bindings/display/sdtv-standards.h>
|
||||
|
||||
tv: connector {
|
||||
compatible = "composite-video-connector";
|
||||
label = "tv";
|
||||
sdtv-standards = <(SDTV_STD_PAL | SDTV_STD_NTSC)>;
|
||||
|
||||
port {
|
||||
tv_connector_in: endpoint {
|
||||
|
@ -0,0 +1,70 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/media/allwinner,sun8i-a83t-de2-rotate.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Allwinner A83T DE2 Rotate Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
- Chen-Yu Tsai <wens@csie.org>
|
||||
- Maxime Ripard <mripard@kernel.org>
|
||||
|
||||
description: |-
|
||||
The Allwinner A83T and A64 have a rotation core used for
|
||||
rotating and flipping images.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- const: allwinner,sun8i-a83t-de2-rotate
|
||||
- items:
|
||||
- const: allwinner,sun50i-a64-de2-rotate
|
||||
- const: allwinner,sun8i-a83t-de2-rotate
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Rotate interface clock
|
||||
- description: Rotate module clock
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: bus
|
||||
- const: mod
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- clocks
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/clock/sun8i-de2.h>
|
||||
#include <dt-bindings/reset/sun8i-de2.h>
|
||||
|
||||
rotate: rotate@1020000 {
|
||||
compatible = "allwinner,sun8i-a83t-de2-rotate";
|
||||
reg = <0x1020000 0x10000>;
|
||||
interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&display_clocks CLK_BUS_ROT>,
|
||||
<&display_clocks CLK_ROT>;
|
||||
clock-names = "bus",
|
||||
"mod";
|
||||
resets = <&display_clocks RST_ROT>;
|
||||
};
|
||||
|
||||
...
|
@ -17,7 +17,11 @@ description: |-
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: allwinner,sun8i-h3-deinterlace
|
||||
oneOf:
|
||||
- const: allwinner,sun8i-h3-deinterlace
|
||||
- items:
|
||||
- const: allwinner,sun50i-a64-deinterlace
|
||||
- const: allwinner,sun8i-h3-deinterlace
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
@ -1,11 +1,12 @@
|
||||
* Device tree bindings for Aspeed Video Engine
|
||||
|
||||
The Video Engine (VE) embedded in the Aspeed AST2400 and AST2500 SOCs can
|
||||
The Video Engine (VE) embedded in the Aspeed AST2400/2500/2600 SOCs can
|
||||
capture and compress video data from digital or analog sources.
|
||||
|
||||
Required properties:
|
||||
- compatible: "aspeed,ast2400-video-engine" or
|
||||
"aspeed,ast2500-video-engine"
|
||||
"aspeed,ast2500-video-engine" or
|
||||
"aspeed,ast2600-video-engine"
|
||||
- reg: contains the offset and length of the VE memory region
|
||||
- clocks: clock specifiers for the syscon clocks associated with
|
||||
the VE (ordering must match the clock-names property)
|
||||
|
114
Documentation/devicetree/bindings/media/i2c/imx219.yaml
Normal file
114
Documentation/devicetree/bindings/media/i2c/imx219.yaml
Normal file
@ -0,0 +1,114 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/media/i2c/imx219.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Sony 1/4.0-Inch 8Mpixel CMOS Digital Image Sensor
|
||||
|
||||
maintainers:
|
||||
- Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
|
||||
description: |-
|
||||
The Sony imx219 is a 1/4.0-inch CMOS active pixel digital image sensor
|
||||
with an active array size of 3280H x 2464V. It is programmable through
|
||||
I2C interface. The I2C address is fixed to 0x10 as per sensor data sheet.
|
||||
Image data is sent through MIPI CSI-2, which is configured as either 2 or
|
||||
4 data lanes.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: sony,imx219
|
||||
|
||||
reg:
|
||||
description: I2C device address
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
VDIG-supply:
|
||||
description:
|
||||
Digital I/O voltage supply, 1.8 volts
|
||||
|
||||
VANA-supply:
|
||||
description:
|
||||
Analog voltage supply, 2.8 volts
|
||||
|
||||
VDDL-supply:
|
||||
description:
|
||||
Digital core voltage supply, 1.2 volts
|
||||
|
||||
reset-gpios:
|
||||
description: |-
|
||||
Reference to the GPIO connected to the xclr pin, if any.
|
||||
Must be released (set high) after all supplies are applied.
|
||||
|
||||
# See ../video-interfaces.txt for more details
|
||||
port:
|
||||
type: object
|
||||
properties:
|
||||
endpoint:
|
||||
type: object
|
||||
properties:
|
||||
data-lanes:
|
||||
description: |-
|
||||
The sensor supports either two-lane, or four-lane operation.
|
||||
If this property is omitted four-lane operation is assumed.
|
||||
For two-lane operation the property must be set to <1 2>.
|
||||
items:
|
||||
- const: 1
|
||||
- const: 2
|
||||
|
||||
clock-noncontinuous:
|
||||
type: boolean
|
||||
description: |-
|
||||
MIPI CSI-2 clock is non-continuous if this property is present,
|
||||
otherwise it's continuous.
|
||||
|
||||
link-frequencies:
|
||||
allOf:
|
||||
- $ref: /schemas/types.yaml#/definitions/uint64-array
|
||||
description:
|
||||
Allowed data bus frequencies.
|
||||
|
||||
required:
|
||||
- link-frequencies
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- VANA-supply
|
||||
- VDIG-supply
|
||||
- VDDL-supply
|
||||
- port
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
imx219: sensor@10 {
|
||||
compatible = "sony,imx219";
|
||||
reg = <0x10>;
|
||||
clocks = <&imx219_clk>;
|
||||
VANA-supply = <&imx219_vana>; /* 2.8v */
|
||||
VDIG-supply = <&imx219_vdig>; /* 1.8v */
|
||||
VDDL-supply = <&imx219_vddl>; /* 1.2v */
|
||||
|
||||
port {
|
||||
imx219_0: endpoint {
|
||||
remote-endpoint = <&csi1_ep>;
|
||||
data-lanes = <1 2>;
|
||||
clock-noncontinuous;
|
||||
link-frequencies = /bits/ 64 <456000000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
...
|
@ -5,38 +5,150 @@ The TVP5150 and TVP5151 are video decoders that convert baseband NTSC and PAL
|
||||
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
|
||||
====================
|
||||
- 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.
|
||||
====================
|
||||
- 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.
|
||||
The device node must contain one 'port' child node per device physical input
|
||||
and output port, in accordance with the video interface bindings defined in
|
||||
Documentation/devicetree/bindings/media/video-interfaces.txt. The port nodes
|
||||
are numbered as follows
|
||||
|
||||
Required Endpoint Properties for parallel synchronization:
|
||||
Name Type Port
|
||||
--------------------------------------
|
||||
AIP1A sink 0
|
||||
AIP1B sink 1
|
||||
Y-OUT src 2
|
||||
|
||||
- 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
|
||||
The device node must contain at least one sink port and the src port. Each input
|
||||
port must be linked to an endpoint defined in [1]. The port/connector layout is
|
||||
as follows
|
||||
|
||||
tvp-5150 port@0 (AIP1A)
|
||||
endpoint@0 -----------> Comp0-Con port
|
||||
endpoint@1 ------+----> Svideo-Con port
|
||||
tvp-5150 port@1 (AIP1B) |
|
||||
endpoint@1 ------+
|
||||
endpoint@0 -----------> Comp1-Con port
|
||||
tvp-5150 port@2
|
||||
endpoint (video bitstream output at YOUT[0-7] parallel bus)
|
||||
|
||||
Required Endpoint Properties for parallel synchronization on output port:
|
||||
=========================================================================
|
||||
|
||||
- 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.
|
||||
Note: Do not specify any of these properties if you want to use the embedded
|
||||
BT.656 synchronization.
|
||||
|
||||
Example:
|
||||
Optional Connector Properties:
|
||||
==============================
|
||||
|
||||
- sdtv-standards: Set the possible signals to which the hardware tries to lock
|
||||
instead of using the autodetection mechnism. Please look at
|
||||
[1] for more information.
|
||||
|
||||
[1] Documentation/devicetree/bindings/display/connector/analog-tv-connector.txt.
|
||||
|
||||
Example - three input sources:
|
||||
#include <dt-bindings/display/sdtv-standards.h>
|
||||
|
||||
comp_connector_0 {
|
||||
compatible = "composite-video-connector";
|
||||
label = "Composite0";
|
||||
sdtv-standards = <SDTV_STD_PAL_M>; /* limit to pal-m signals */
|
||||
|
||||
port {
|
||||
composite0_to_tvp5150: endpoint {
|
||||
remote-endpoint = <&tvp5150_to_composite0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
comp_connector_1 {
|
||||
compatible = "composite-video-connector";
|
||||
label = "Composite1";
|
||||
sdtv-standards = <SDTV_STD_NTSC_M>; /* limit to ntsc-m signals */
|
||||
|
||||
port {
|
||||
composite1_to_tvp5150: endpoint {
|
||||
remote-endpoint = <&tvp5150_to_composite1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
svideo_connector {
|
||||
compatible = "svideo-connector";
|
||||
label = "S-Video";
|
||||
|
||||
port {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
svideo_luma_to_tvp5150: endpoint@0 {
|
||||
reg = <0>;
|
||||
remote-endpoint = <&tvp5150_to_svideo_luma>;
|
||||
};
|
||||
|
||||
svideo_chroma_to_tvp5150: endpoint@1 {
|
||||
reg = <1>;
|
||||
remote-endpoint = <&tvp5150_to_svideo_chroma>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&i2c2 {
|
||||
...
|
||||
tvp5150@5c {
|
||||
compatible = "ti,tvp5150";
|
||||
reg = <0x5c>;
|
||||
pdn-gpios = <&gpio4 30 GPIO_ACTIVE_LOW>;
|
||||
reset-gpios = <&gpio6 7 GPIO_ACTIVE_LOW>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0>;
|
||||
|
||||
tvp5150_to_composite0: endpoint@0 {
|
||||
reg = <0>;
|
||||
remote-endpoint = <&composite0_to_tvp5150>;
|
||||
};
|
||||
|
||||
tvp5150_to_svideo_luma: endpoint@1 {
|
||||
reg = <1>;
|
||||
remote-endpoint = <&svideo_luma_to_tvp5150>;
|
||||
};
|
||||
};
|
||||
|
||||
port@1 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <1>;
|
||||
|
||||
tvp5150_to_composite1: endpoint@0 {
|
||||
reg = <0>;
|
||||
remote-endpoint = <&composite1_to_tvp5150>;
|
||||
};
|
||||
|
||||
tvp5150_to_svideo_chroma: endpoint@1 {
|
||||
reg = <1>;
|
||||
remote-endpoint = <&svideo_chroma_to_tvp5150>;
|
||||
};
|
||||
};
|
||||
|
||||
port@2 {
|
||||
reg = <2>;
|
||||
|
||||
port {
|
||||
tvp5150_1: endpoint {
|
||||
remote-endpoint = <&ccdc_ep>;
|
||||
};
|
||||
|
77
Documentation/devicetree/bindings/media/nxp,imx8mq-vpu.yaml
Normal file
77
Documentation/devicetree/bindings/media/nxp,imx8mq-vpu.yaml
Normal file
@ -0,0 +1,77 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: "http://devicetree.org/schemas/media/nxp,imx8mq-vpu.yaml#"
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
|
||||
title: Hantro G1/G2 VPU codecs implemented on i.MX8MQ SoCs
|
||||
|
||||
maintainers:
|
||||
- Philipp Zabel <p.zabel@pengutronix.de>
|
||||
|
||||
description:
|
||||
Hantro G1/G2 video decode accelerators present on i.MX8MQ SoCs.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: nxp,imx8mq-vpu
|
||||
|
||||
reg:
|
||||
maxItems: 3
|
||||
|
||||
reg-names:
|
||||
items:
|
||||
- const: g1
|
||||
- const: g2
|
||||
- const: ctrl
|
||||
|
||||
interrupts:
|
||||
maxItems: 2
|
||||
|
||||
interrupt-names:
|
||||
items:
|
||||
- const: g1
|
||||
- const: g2
|
||||
|
||||
clocks:
|
||||
maxItems: 3
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: g1
|
||||
- const: g2
|
||||
- const: bus
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- reg-names
|
||||
- interrupts
|
||||
- interrupt-names
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/imx8mq-clock.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
vpu: video-codec@38300000 {
|
||||
compatible = "nxp,imx8mq-vpu";
|
||||
reg = <0x38300000 0x10000>,
|
||||
<0x38310000 0x10000>,
|
||||
<0x38320000 0x10000>;
|
||||
reg-names = "g1", "g2", "ctrl";
|
||||
interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "g1", "g2";
|
||||
clocks = <&clk IMX8MQ_CLK_VPU_G1_ROOT>,
|
||||
<&clk IMX8MQ_CLK_VPU_G2_ROOT>,
|
||||
<&clk IMX8MQ_CLK_VPU_DEC_ROOT>;
|
||||
clock-names = "g1", "g2", "bus";
|
||||
power-domains = <&pgc_vpu>;
|
||||
};
|
119
Documentation/devicetree/bindings/media/qcom,msm8916-venus.yaml
Normal file
119
Documentation/devicetree/bindings/media/qcom,msm8916-venus.yaml
Normal file
@ -0,0 +1,119 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: "http://devicetree.org/schemas/media/qcom,msm8916-venus.yaml#"
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
|
||||
title: Qualcomm Venus video encode and decode accelerators
|
||||
|
||||
maintainers:
|
||||
- Stanimir Varbanov <stanimir.varbanov@linaro.org>
|
||||
|
||||
description: |
|
||||
The Venus IP is a video encode and decode accelerator present
|
||||
on Qualcomm platforms
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,msm8916-venus
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 3
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: core
|
||||
- const: iface
|
||||
- const: bus
|
||||
|
||||
iommus:
|
||||
maxItems: 1
|
||||
|
||||
memory-region:
|
||||
maxItems: 1
|
||||
|
||||
video-decoder:
|
||||
type: object
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: "venus-decoder"
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
video-encoder:
|
||||
type: object
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: "venus-encoder"
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
video-firmware:
|
||||
type: object
|
||||
|
||||
description: |
|
||||
Firmware subnode is needed when the platform does not
|
||||
have TrustZone.
|
||||
|
||||
properties:
|
||||
iommus:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- iommus
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- power-domains
|
||||
- clocks
|
||||
- clock-names
|
||||
- iommus
|
||||
- memory-region
|
||||
- video-decoder
|
||||
- video-encoder
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/clock/qcom,gcc-msm8916.h>
|
||||
|
||||
video-codec@1d00000 {
|
||||
compatible = "qcom,msm8916-venus";
|
||||
reg = <0x01d00000 0xff000>;
|
||||
interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&gcc GCC_VENUS0_VCODEC0_CLK>,
|
||||
<&gcc GCC_VENUS0_AHB_CLK>,
|
||||
<&gcc GCC_VENUS0_AXI_CLK>;
|
||||
clock-names = "core", "iface", "bus";
|
||||
power-domains = <&gcc VENUS_GDSC>;
|
||||
iommus = <&apps_iommu 5>;
|
||||
memory-region = <&venus_mem>;
|
||||
|
||||
video-decoder {
|
||||
compatible = "venus-decoder";
|
||||
};
|
||||
|
||||
video-encoder {
|
||||
compatible = "venus-encoder";
|
||||
};
|
||||
};
|
172
Documentation/devicetree/bindings/media/qcom,msm8996-venus.yaml
Normal file
172
Documentation/devicetree/bindings/media/qcom,msm8996-venus.yaml
Normal file
@ -0,0 +1,172 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: "http://devicetree.org/schemas/media/qcom,msm8996-venus.yaml#"
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
|
||||
title: Qualcomm Venus video encode and decode accelerators
|
||||
|
||||
maintainers:
|
||||
- Stanimir Varbanov <stanimir.varbanov@linaro.org>
|
||||
|
||||
description: |
|
||||
The Venus IP is a video encode and decode accelerator present
|
||||
on Qualcomm platforms
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,msm8996-venus
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 4
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: core
|
||||
- const: iface
|
||||
- const: bus
|
||||
- const: mbus
|
||||
|
||||
iommus:
|
||||
maxItems: 20
|
||||
|
||||
memory-region:
|
||||
maxItems: 1
|
||||
|
||||
video-decoder:
|
||||
type: object
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: venus-decoder
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: core
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- clocks
|
||||
- clock-names
|
||||
- power-domains
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
video-encoder:
|
||||
type: object
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: venus-encoder
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: core
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- clocks
|
||||
- clock-names
|
||||
- power-domains
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
video-firmware:
|
||||
type: object
|
||||
|
||||
description: |
|
||||
Firmware subnode is needed when the platform does not
|
||||
have TrustZone.
|
||||
|
||||
properties:
|
||||
iommus:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- iommus
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- power-domains
|
||||
- clocks
|
||||
- clock-names
|
||||
- iommus
|
||||
- memory-region
|
||||
- video-decoder
|
||||
- video-encoder
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/clock/qcom,mmcc-msm8996.h>
|
||||
|
||||
video-codec@c00000 {
|
||||
compatible = "qcom,msm8996-venus";
|
||||
reg = <0x00c00000 0xff000>;
|
||||
interrupts = <GIC_SPI 287 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&mmcc VIDEO_CORE_CLK>,
|
||||
<&mmcc VIDEO_AHB_CLK>,
|
||||
<&mmcc VIDEO_AXI_CLK>,
|
||||
<&mmcc VIDEO_MAXI_CLK>;
|
||||
clock-names = "core", "iface", "bus", "mbus";
|
||||
power-domains = <&mmcc VENUS_GDSC>;
|
||||
iommus = <&venus_smmu 0x00>,
|
||||
<&venus_smmu 0x01>,
|
||||
<&venus_smmu 0x0a>,
|
||||
<&venus_smmu 0x07>,
|
||||
<&venus_smmu 0x0e>,
|
||||
<&venus_smmu 0x0f>,
|
||||
<&venus_smmu 0x08>,
|
||||
<&venus_smmu 0x09>,
|
||||
<&venus_smmu 0x0b>,
|
||||
<&venus_smmu 0x0c>,
|
||||
<&venus_smmu 0x0d>,
|
||||
<&venus_smmu 0x10>,
|
||||
<&venus_smmu 0x11>,
|
||||
<&venus_smmu 0x21>,
|
||||
<&venus_smmu 0x28>,
|
||||
<&venus_smmu 0x29>,
|
||||
<&venus_smmu 0x2b>,
|
||||
<&venus_smmu 0x2c>,
|
||||
<&venus_smmu 0x2d>,
|
||||
<&venus_smmu 0x31>;
|
||||
memory-region = <&venus_mem>;
|
||||
|
||||
video-decoder {
|
||||
compatible = "venus-decoder";
|
||||
clocks = <&mmcc VIDEO_SUBCORE0_CLK>;
|
||||
clock-names = "core";
|
||||
power-domains = <&mmcc VENUS_CORE0_GDSC>;
|
||||
};
|
||||
|
||||
video-encoder {
|
||||
compatible = "venus-encoder";
|
||||
clocks = <&mmcc VIDEO_SUBCORE1_CLK>;
|
||||
clock-names = "core";
|
||||
power-domains = <&mmcc VENUS_CORE1_GDSC>;
|
||||
};
|
||||
};
|
140
Documentation/devicetree/bindings/media/qcom,sc7180-venus.yaml
Normal file
140
Documentation/devicetree/bindings/media/qcom,sc7180-venus.yaml
Normal file
@ -0,0 +1,140 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: "http://devicetree.org/schemas/media/qcom,sc7180-venus.yaml#"
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
|
||||
title: Qualcomm Venus video encode and decode accelerators
|
||||
|
||||
maintainers:
|
||||
- Stanimir Varbanov <stanimir.varbanov@linaro.org>
|
||||
|
||||
description: |
|
||||
The Venus IP is a video encode and decode accelerator present
|
||||
on Qualcomm platforms
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,sc7180-venus
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
power-domains:
|
||||
maxItems: 2
|
||||
|
||||
power-domain-names:
|
||||
items:
|
||||
- const: venus
|
||||
- const: vcodec0
|
||||
|
||||
clocks:
|
||||
maxItems: 5
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: core
|
||||
- const: iface
|
||||
- const: bus
|
||||
- const: vcodec0_core
|
||||
- const: vcodec0_bus
|
||||
|
||||
iommus:
|
||||
maxItems: 1
|
||||
|
||||
memory-region:
|
||||
maxItems: 1
|
||||
|
||||
interconnects:
|
||||
maxItems: 2
|
||||
|
||||
interconnect-names:
|
||||
items:
|
||||
- const: video-mem
|
||||
- const: cpu-cfg
|
||||
|
||||
video-decoder:
|
||||
type: object
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: venus-decoder
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
video-encoder:
|
||||
type: object
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: venus-encoder
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
video-firmware:
|
||||
type: object
|
||||
|
||||
description: |
|
||||
Firmware subnode is needed when the platform does not
|
||||
have TrustZone.
|
||||
|
||||
properties:
|
||||
iommus:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- iommus
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- power-domains
|
||||
- power-domain-names
|
||||
- clocks
|
||||
- clock-names
|
||||
- iommus
|
||||
- memory-region
|
||||
- video-decoder
|
||||
- video-encoder
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/clock/qcom,videocc-sc7180.h>
|
||||
|
||||
venus: video-codec@aa00000 {
|
||||
compatible = "qcom,sc7180-venus";
|
||||
reg = <0 0x0aa00000 0 0xff000>;
|
||||
interrupts = <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>;
|
||||
power-domains = <&videocc VENUS_GDSC>,
|
||||
<&videocc VCODEC0_GDSC>;
|
||||
power-domain-names = "venus", "vcodec0";
|
||||
clocks = <&videocc VIDEO_CC_VENUS_CTL_CORE_CLK>,
|
||||
<&videocc VIDEO_CC_VENUS_AHB_CLK>,
|
||||
<&videocc VIDEO_CC_VENUS_CTL_AXI_CLK>,
|
||||
<&videocc VIDEO_CC_VCODEC0_CORE_CLK>,
|
||||
<&videocc VIDEO_CC_VCODEC0_AXI_CLK>;
|
||||
clock-names = "core", "iface", "bus",
|
||||
"vcodec0_core", "vcodec0_bus";
|
||||
iommus = <&apps_smmu 0x0c00 0x60>;
|
||||
memory-region = <&venus_mem>;
|
||||
|
||||
video-decoder {
|
||||
compatible = "venus-decoder";
|
||||
};
|
||||
|
||||
video-encoder {
|
||||
compatible = "venus-encoder";
|
||||
};
|
||||
};
|
@ -0,0 +1,140 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: "http://devicetree.org/schemas/media/qcom,sdm845-venus-v2.yaml#"
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
|
||||
title: Qualcomm Venus video encode and decode accelerators
|
||||
|
||||
maintainers:
|
||||
- Stanimir Varbanov <stanimir.varbanov@linaro.org>
|
||||
|
||||
description: |
|
||||
The Venus IP is a video encode and decode accelerator present
|
||||
on Qualcomm platforms
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,sdm845-venus-v2
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
power-domains:
|
||||
maxItems: 3
|
||||
|
||||
power-domain-names:
|
||||
items:
|
||||
- const: venus
|
||||
- const: vcodec0
|
||||
- const: vcodec1
|
||||
|
||||
clocks:
|
||||
maxItems: 7
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: core
|
||||
- const: iface
|
||||
- const: bus
|
||||
- const: vcodec0_core
|
||||
- const: vcodec0_bus
|
||||
- const: vcodec1_core
|
||||
- const: vcodec1_bus
|
||||
|
||||
iommus:
|
||||
maxItems: 2
|
||||
|
||||
memory-region:
|
||||
maxItems: 1
|
||||
|
||||
video-core0:
|
||||
type: object
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: venus-decoder
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
video-core1:
|
||||
type: object
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: venus-encoder
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
video-firmware:
|
||||
type: object
|
||||
|
||||
description: |
|
||||
Firmware subnode is needed when the platform does not
|
||||
have TrustZone.
|
||||
|
||||
properties:
|
||||
iommus:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- iommus
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- power-domains
|
||||
- power-domain-names
|
||||
- clocks
|
||||
- clock-names
|
||||
- iommus
|
||||
- memory-region
|
||||
- video-core0
|
||||
- video-core1
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/clock/qcom,videocc-sdm845.h>
|
||||
|
||||
video-codec@aa00000 {
|
||||
compatible = "qcom,sdm845-venus-v2";
|
||||
reg = <0 0x0aa00000 0 0xff000>;
|
||||
interrupts = <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&videocc VIDEO_CC_VENUS_CTL_CORE_CLK>,
|
||||
<&videocc VIDEO_CC_VENUS_AHB_CLK>,
|
||||
<&videocc VIDEO_CC_VENUS_CTL_AXI_CLK>,
|
||||
<&videocc VIDEO_CC_VCODEC0_CORE_CLK>,
|
||||
<&videocc VIDEO_CC_VCODEC0_AXI_CLK>,
|
||||
<&videocc VIDEO_CC_VCODEC1_CORE_CLK>,
|
||||
<&videocc VIDEO_CC_VCODEC1_AXI_CLK>;
|
||||
clock-names = "core", "iface", "bus",
|
||||
"vcodec0_core", "vcodec0_bus",
|
||||
"vcodec1_core", "vcodec1_bus";
|
||||
power-domains = <&videocc VENUS_GDSC>,
|
||||
<&videocc VCODEC0_GDSC>,
|
||||
<&videocc VCODEC1_GDSC>;
|
||||
power-domain-names = "venus", "vcodec0", "vcodec1";
|
||||
iommus = <&apps_smmu 0x10a0 0x8>,
|
||||
<&apps_smmu 0x10b0 0x0>;
|
||||
memory-region = <&venus_mem>;
|
||||
|
||||
video-core0 {
|
||||
compatible = "venus-decoder";
|
||||
};
|
||||
|
||||
video-core1 {
|
||||
compatible = "venus-encoder";
|
||||
};
|
||||
};
|
156
Documentation/devicetree/bindings/media/qcom,sdm845-venus.yaml
Normal file
156
Documentation/devicetree/bindings/media/qcom,sdm845-venus.yaml
Normal file
@ -0,0 +1,156 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: "http://devicetree.org/schemas/media/qcom,sdm845-venus.yaml#"
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
|
||||
title: Qualcomm Venus video encode and decode accelerators
|
||||
|
||||
maintainers:
|
||||
- Stanimir Varbanov <stanimir.varbanov@linaro.org>
|
||||
|
||||
description: |
|
||||
The Venus IP is a video encode and decode accelerator present
|
||||
on Qualcomm platforms
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,sdm845-venus
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 3
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: core
|
||||
- const: iface
|
||||
- const: bus
|
||||
|
||||
iommus:
|
||||
maxItems: 2
|
||||
|
||||
memory-region:
|
||||
maxItems: 1
|
||||
|
||||
video-core0:
|
||||
type: object
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: venus-decoder
|
||||
|
||||
clocks:
|
||||
maxItems: 2
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: core
|
||||
- const: bus
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- clocks
|
||||
- clock-names
|
||||
- power-domains
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
video-core1:
|
||||
type: object
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: venus-encoder
|
||||
|
||||
clocks:
|
||||
maxItems: 2
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: core
|
||||
- const: bus
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- clocks
|
||||
- clock-names
|
||||
- power-domains
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
video-firmware:
|
||||
type: object
|
||||
|
||||
description: |
|
||||
Firmware subnode is needed when the platform does not
|
||||
have TrustZone.
|
||||
|
||||
properties:
|
||||
iommus:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- iommus
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- power-domains
|
||||
- clocks
|
||||
- clock-names
|
||||
- iommus
|
||||
- memory-region
|
||||
- video-core0
|
||||
- video-core1
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/clock/qcom,videocc-sdm845.h>
|
||||
|
||||
video-codec@aa00000 {
|
||||
compatible = "qcom,sdm845-venus";
|
||||
reg = <0 0x0aa00000 0 0xff000>;
|
||||
interrupts = <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&videocc VIDEO_CC_VENUS_CTL_CORE_CLK>,
|
||||
<&videocc VIDEO_CC_VENUS_AHB_CLK>,
|
||||
<&videocc VIDEO_CC_VENUS_CTL_AXI_CLK>;
|
||||
clock-names = "core", "iface", "bus";
|
||||
power-domains = <&videocc VENUS_GDSC>;
|
||||
iommus = <&apps_smmu 0x10a0 0x8>,
|
||||
<&apps_smmu 0x10b0 0x0>;
|
||||
memory-region = <&venus_mem>;
|
||||
|
||||
video-core0 {
|
||||
compatible = "venus-decoder";
|
||||
clocks = <&videocc VIDEO_CC_VCODEC0_CORE_CLK>,
|
||||
<&videocc VIDEO_CC_VCODEC0_AXI_CLK>;
|
||||
clock-names = "core", "bus";
|
||||
power-domains = <&videocc VCODEC0_GDSC>;
|
||||
};
|
||||
|
||||
video-core1 {
|
||||
compatible = "venus-encoder";
|
||||
clocks = <&videocc VIDEO_CC_VCODEC1_CORE_CLK>,
|
||||
<&videocc VIDEO_CC_VCODEC1_AXI_CLK>;
|
||||
clock-names = "core", "bus";
|
||||
power-domains = <&videocc VCODEC1_GDSC>;
|
||||
};
|
||||
};
|
@ -1,120 +0,0 @@
|
||||
* Qualcomm Venus video encoder/decoder accelerators
|
||||
|
||||
- compatible:
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: Value should contain one of:
|
||||
- "qcom,msm8916-venus"
|
||||
- "qcom,msm8996-venus"
|
||||
- "qcom,sdm845-venus"
|
||||
- reg:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: Register base address and length of the register map.
|
||||
- interrupts:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: Should contain interrupt line number.
|
||||
- clocks:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: A List of phandle and clock specifier pairs as listed
|
||||
in clock-names property.
|
||||
- clock-names:
|
||||
Usage: required for msm8916
|
||||
Value type: <stringlist>
|
||||
Definition: Should contain the following entries:
|
||||
- "core" Core video accelerator clock
|
||||
- "iface" Video accelerator AHB clock
|
||||
- "bus" Video accelerator AXI clock
|
||||
- clock-names:
|
||||
Usage: required for msm8996
|
||||
Value type: <stringlist>
|
||||
Definition: Should contain the following entries:
|
||||
- "core" Core video accelerator clock
|
||||
- "iface" Video accelerator AHB clock
|
||||
- "bus" Video accelerator AXI clock
|
||||
- "mbus" Video MAXI clock
|
||||
- power-domains:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: A phandle and power domain specifier pairs to the
|
||||
power domain which is responsible for collapsing
|
||||
and restoring power to the peripheral.
|
||||
- iommus:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: A list of phandle and IOMMU specifier pairs.
|
||||
- memory-region:
|
||||
Usage: required
|
||||
Value type: <phandle>
|
||||
Definition: reference to the reserved-memory for the firmware
|
||||
memory region.
|
||||
|
||||
* Subnodes
|
||||
The Venus video-codec node must contain two subnodes representing
|
||||
video-decoder and video-encoder, and one optional firmware subnode.
|
||||
Firmware subnode is needed when the platform does not have TrustZone.
|
||||
|
||||
Every of video-encoder or video-decoder subnode should have:
|
||||
|
||||
- compatible:
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: Value should contain "venus-decoder" or "venus-encoder"
|
||||
- clocks:
|
||||
Usage: required for msm8996
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: A List of phandle and clock specifier pairs as listed
|
||||
in clock-names property.
|
||||
- clock-names:
|
||||
Usage: required for msm8996
|
||||
Value type: <stringlist>
|
||||
Definition: Should contain the following entries:
|
||||
- "core" Subcore video accelerator clock
|
||||
|
||||
- power-domains:
|
||||
Usage: required for msm8996
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: A phandle and power domain specifier pairs to the
|
||||
power domain which is responsible for collapsing
|
||||
and restoring power to the subcore.
|
||||
|
||||
The firmware subnode must have:
|
||||
|
||||
- iommus:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: A list of phandle and IOMMU specifier pairs.
|
||||
|
||||
* An Example
|
||||
video-codec@1d00000 {
|
||||
compatible = "qcom,msm8916-venus";
|
||||
reg = <0x01d00000 0xff000>;
|
||||
interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&gcc GCC_VENUS0_VCODEC0_CLK>,
|
||||
<&gcc GCC_VENUS0_AHB_CLK>,
|
||||
<&gcc GCC_VENUS0_AXI_CLK>;
|
||||
clock-names = "core", "iface", "bus";
|
||||
power-domains = <&gcc VENUS_GDSC>;
|
||||
iommus = <&apps_iommu 5>;
|
||||
memory-region = <&venus_mem>;
|
||||
|
||||
video-decoder {
|
||||
compatible = "venus-decoder";
|
||||
clocks = <&mmcc VIDEO_SUBCORE0_CLK>;
|
||||
clock-names = "core";
|
||||
power-domains = <&mmcc VENUS_CORE0_GDSC>;
|
||||
};
|
||||
|
||||
video-encoder {
|
||||
compatible = "venus-encoder";
|
||||
clocks = <&mmcc VIDEO_SUBCORE1_CLK>;
|
||||
clock-names = "core";
|
||||
power-domains = <&mmcc VENUS_CORE1_GDSC>;
|
||||
};
|
||||
|
||||
video-firmware {
|
||||
iommus = <&apps_iommu 0x10b2 0x0>;
|
||||
};
|
||||
};
|
@ -143,6 +143,7 @@ properties:
|
||||
- rc-videomate-k100
|
||||
- rc-videomate-s350
|
||||
- rc-videomate-tv-pvr
|
||||
- rc-videostrong-kii-pro
|
||||
- rc-wetek-hub
|
||||
- rc-wetek-play2
|
||||
- rc-winfast
|
||||
|
@ -6,8 +6,9 @@ BitBLT, alpha blending and image blur/sharpness.
|
||||
|
||||
Required properties:
|
||||
- compatible: value should be one of the following
|
||||
"rockchip,rk3288-rga";
|
||||
"rockchip,rk3399-rga";
|
||||
"rockchip,rk3228-rga", "rockchip,rk3288-rga": for Rockchip RK3228
|
||||
"rockchip,rk3288-rga": for Rockchip RK3288
|
||||
"rockchip,rk3399-rga": for Rockchip RK3399
|
||||
|
||||
- interrupts: RGA interrupt specifier.
|
||||
|
||||
|
@ -74,7 +74,7 @@ Before the receiver driver may enable the CSI-2 transmitter by using
|
||||
the :c:type:`v4l2_subdev_video_ops`->s_stream(), it must have powered
|
||||
the transmitter up by using the
|
||||
:c:type:`v4l2_subdev_core_ops`->s_power() callback. This may take
|
||||
place either indirectly by using :c:func:`v4l2_pipeline_pm_use` or
|
||||
place either indirectly by using :c:func:`v4l2_pipeline_pm_get` or
|
||||
directly.
|
||||
|
||||
Formats
|
||||
|
@ -185,7 +185,7 @@ This will create the character device for you.
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
err = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
|
||||
err = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
|
||||
if (err) {
|
||||
video_device_release(vdev); /* or kfree(my_vdev); */
|
||||
return err;
|
||||
@ -201,7 +201,7 @@ types exist:
|
||||
========================== ==================== ==============================
|
||||
:c:type:`vfl_devnode_type` Device name Usage
|
||||
========================== ==================== ==============================
|
||||
``VFL_TYPE_GRABBER`` ``/dev/videoX`` for video input/output devices
|
||||
``VFL_TYPE_VIDEO`` ``/dev/videoX`` for video input/output devices
|
||||
``VFL_TYPE_VBI`` ``/dev/vbiX`` for vertical blank data (i.e.
|
||||
closed captions, teletext)
|
||||
``VFL_TYPE_RADIO`` ``/dev/radioX`` for radio tuners
|
||||
|
@ -44,18 +44,18 @@ is only available if the ``CEC_CAP_CONNECTOR_INFO`` capability is set.
|
||||
.. flat-table:: struct cec_connector_info
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 1 8
|
||||
:widths: 1 1 8
|
||||
|
||||
* - __u32
|
||||
- ``type``
|
||||
- The type of connector this adapter is associated with.
|
||||
* - union
|
||||
* - union {
|
||||
- ``(anonymous)``
|
||||
-
|
||||
* -
|
||||
- ``struct cec_drm_connector_info``
|
||||
* - ``struct cec_drm_connector_info``
|
||||
- drm
|
||||
- :ref:`cec-drm-connector-info`
|
||||
* - }
|
||||
-
|
||||
|
||||
|
||||
.. tabularcolumns:: |p{4.4cm}|p{2.5cm}|p{10.6cm}|
|
||||
|
@ -109,35 +109,33 @@ it is guaranteed that the state did change in between the two events.
|
||||
.. flat-table:: struct cec_event
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 1 8
|
||||
:widths: 1 1 8
|
||||
|
||||
* - __u64
|
||||
- ``ts``
|
||||
- :cspan:`1`\ Timestamp of the event in ns.
|
||||
- Timestamp of the event in ns.
|
||||
|
||||
The timestamp has been taken from the ``CLOCK_MONOTONIC`` clock.
|
||||
|
||||
To access the same clock from userspace use :c:func:`clock_gettime`.
|
||||
* - __u32
|
||||
- ``event``
|
||||
- :cspan:`1` The CEC event type, see :ref:`cec-events`.
|
||||
- The CEC event type, see :ref:`cec-events`.
|
||||
* - __u32
|
||||
- ``flags``
|
||||
- :cspan:`1` Event flags, see :ref:`cec-event-flags`.
|
||||
* - union
|
||||
- Event flags, see :ref:`cec-event-flags`.
|
||||
* - union {
|
||||
- (anonymous)
|
||||
-
|
||||
-
|
||||
* -
|
||||
- struct cec_event_state_change
|
||||
* - struct cec_event_state_change
|
||||
- ``state_change``
|
||||
- The new adapter state as sent by the :ref:`CEC_EVENT_STATE_CHANGE <CEC-EVENT-STATE-CHANGE>`
|
||||
event.
|
||||
* -
|
||||
- struct cec_event_lost_msgs
|
||||
* - struct cec_event_lost_msgs
|
||||
- ``lost_msgs``
|
||||
- The number of lost messages as sent by the :ref:`CEC_EVENT_LOST_MSGS <CEC-EVENT-LOST-MSGS>`
|
||||
event.
|
||||
* - }
|
||||
-
|
||||
|
||||
|
||||
.. tabularcolumns:: |p{5.6cm}|p{0.9cm}|p{11.0cm}|
|
||||
|
@ -64,12 +64,11 @@ id's until they get an error.
|
||||
.. flat-table:: struct media_entity_desc
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 1 1 8
|
||||
:widths: 2 2 1 8
|
||||
|
||||
* - __u32
|
||||
- ``id``
|
||||
-
|
||||
-
|
||||
- Entity ID, set by the application. When the ID is or'ed with
|
||||
``MEDIA_ENT_ID_FLAG_NEXT``, the driver clears the flag and returns
|
||||
the first entity with a larger ID. Do not expect that the ID will
|
||||
@ -79,79 +78,70 @@ id's until they get an error.
|
||||
* - char
|
||||
- ``name``\ [32]
|
||||
-
|
||||
-
|
||||
- Entity name as an UTF-8 NULL-terminated string. This name must be unique
|
||||
within the media topology.
|
||||
|
||||
* - __u32
|
||||
- ``type``
|
||||
-
|
||||
-
|
||||
- Entity type, see :ref:`media-entity-functions` for details.
|
||||
|
||||
* - __u32
|
||||
- ``revision``
|
||||
-
|
||||
-
|
||||
- Entity revision. Always zero (obsolete)
|
||||
|
||||
* - __u32
|
||||
- ``flags``
|
||||
-
|
||||
-
|
||||
- Entity flags, see :ref:`media-entity-flag` for details.
|
||||
|
||||
* - __u32
|
||||
- ``group_id``
|
||||
-
|
||||
-
|
||||
- Entity group ID. Always zero (obsolete)
|
||||
|
||||
* - __u16
|
||||
- ``pads``
|
||||
-
|
||||
-
|
||||
- Number of pads
|
||||
|
||||
* - __u16
|
||||
- ``links``
|
||||
-
|
||||
-
|
||||
- Total number of outbound links. Inbound links are not counted in
|
||||
this field.
|
||||
|
||||
* - __u32
|
||||
- ``reserved[4]``
|
||||
-
|
||||
-
|
||||
- Reserved for future extensions. Drivers and applications must set
|
||||
the array to zero.
|
||||
|
||||
* - union
|
||||
* - union {
|
||||
- (anonymous)
|
||||
|
||||
* -
|
||||
- struct
|
||||
* - struct
|
||||
- ``dev``
|
||||
-
|
||||
- Valid for (sub-)devices that create a single device node.
|
||||
|
||||
* -
|
||||
-
|
||||
- __u32
|
||||
- ``major``
|
||||
- Device node major number.
|
||||
|
||||
* -
|
||||
-
|
||||
- __u32
|
||||
- ``minor``
|
||||
- Device node minor number.
|
||||
|
||||
* -
|
||||
- __u8
|
||||
* - __u8
|
||||
- ``raw``\ [184]
|
||||
-
|
||||
-
|
||||
* - }
|
||||
-
|
||||
|
||||
|
||||
Return Value
|
||||
|
@ -172,11 +172,10 @@ struct v4l2_buffer
|
||||
.. flat-table:: struct v4l2_buffer
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 2 1 10
|
||||
:widths: 1 2 10
|
||||
|
||||
* - __u32
|
||||
- ``index``
|
||||
-
|
||||
- Number of the buffer, set by the application except when calling
|
||||
:ref:`VIDIOC_DQBUF <VIDIOC_QBUF>`, then it is set by the
|
||||
driver. This field can range from zero to the number of buffers
|
||||
@ -186,14 +185,12 @@ struct v4l2_buffer
|
||||
:ref:`VIDIOC_CREATE_BUFS` minus one.
|
||||
* - __u32
|
||||
- ``type``
|
||||
-
|
||||
- Type of the buffer, same as struct
|
||||
:c:type:`v4l2_format` ``type`` or struct
|
||||
:c:type:`v4l2_requestbuffers` ``type``, set
|
||||
by the application. See :c:type:`v4l2_buf_type`
|
||||
* - __u32
|
||||
- ``bytesused``
|
||||
-
|
||||
- The number of bytes occupied by the data in the buffer. It depends
|
||||
on the negotiated data format and may change with each buffer for
|
||||
compressed variable size data like JPEG images. Drivers must set
|
||||
@ -205,18 +202,15 @@ struct v4l2_buffer
|
||||
``planes`` pointer is used instead.
|
||||
* - __u32
|
||||
- ``flags``
|
||||
-
|
||||
- Flags set by the application or driver, see :ref:`buffer-flags`.
|
||||
* - __u32
|
||||
- ``field``
|
||||
-
|
||||
- Indicates the field order of the image in the buffer, see
|
||||
:c:type:`v4l2_field`. This field is not used when the buffer
|
||||
contains VBI data. Drivers must set it when ``type`` refers to a
|
||||
capture stream, applications when it refers to an output stream.
|
||||
* - struct timeval
|
||||
- ``timestamp``
|
||||
-
|
||||
- For capture streams this is time when the first data byte was
|
||||
captured, as returned by the :c:func:`clock_gettime()` function
|
||||
for the relevant clock id; see ``V4L2_BUF_FLAG_TIMESTAMP_*`` in
|
||||
@ -229,7 +223,6 @@ struct v4l2_buffer
|
||||
stream.
|
||||
* - struct :c:type:`v4l2_timecode`
|
||||
- ``timecode``
|
||||
-
|
||||
- When the ``V4L2_BUF_FLAG_TIMECODE`` flag is set in ``flags``, this
|
||||
structure contains a frame timecode. In
|
||||
:c:type:`V4L2_FIELD_ALTERNATE <v4l2_field>` mode the top and
|
||||
@ -239,10 +232,9 @@ struct v4l2_buffer
|
||||
independent of the ``timestamp`` and ``sequence`` fields.
|
||||
* - __u32
|
||||
- ``sequence``
|
||||
-
|
||||
- Set by the driver, counting the frames (not fields!) in sequence.
|
||||
This field is set for both input and output devices.
|
||||
* - :cspan:`3`
|
||||
* - :cspan:`2`
|
||||
|
||||
In :c:type:`V4L2_FIELD_ALTERNATE <v4l2_field>` mode the top and
|
||||
bottom field have the same sequence number. The count starts at
|
||||
@ -262,13 +254,11 @@ struct v4l2_buffer
|
||||
|
||||
* - __u32
|
||||
- ``memory``
|
||||
-
|
||||
- This field must be set by applications and/or drivers in
|
||||
accordance with the selected I/O method. See :c:type:`v4l2_memory`
|
||||
* - union
|
||||
* - union {
|
||||
- ``m``
|
||||
* -
|
||||
- __u32
|
||||
* - __u32
|
||||
- ``offset``
|
||||
- For the single-planar API and when ``memory`` is
|
||||
``V4L2_MEMORY_MMAP`` this is the offset of the buffer from the
|
||||
@ -276,29 +266,27 @@ struct v4l2_buffer
|
||||
and apart of serving as parameter to the
|
||||
:ref:`mmap() <func-mmap>` function not useful for applications.
|
||||
See :ref:`mmap` for details
|
||||
* -
|
||||
- unsigned long
|
||||
* - unsigned long
|
||||
- ``userptr``
|
||||
- For the single-planar API and when ``memory`` is
|
||||
``V4L2_MEMORY_USERPTR`` this is a pointer to the buffer (casted to
|
||||
unsigned long type) in virtual memory, set by the application. See
|
||||
:ref:`userp` for details.
|
||||
* -
|
||||
- struct v4l2_plane
|
||||
* - struct v4l2_plane
|
||||
- ``*planes``
|
||||
- When using the multi-planar API, contains a userspace pointer to
|
||||
an array of struct :c:type:`v4l2_plane`. The size of
|
||||
the array should be put in the ``length`` field of this
|
||||
struct :c:type:`v4l2_buffer` structure.
|
||||
* -
|
||||
- int
|
||||
* - int
|
||||
- ``fd``
|
||||
- For the single-plane API and when ``memory`` is
|
||||
``V4L2_MEMORY_DMABUF`` this is the file descriptor associated with
|
||||
a DMABUF buffer.
|
||||
* - }
|
||||
-
|
||||
* - __u32
|
||||
- ``length``
|
||||
-
|
||||
- Size of the buffer (not the payload) in bytes for the
|
||||
single-planar API. This is set by the driver based on the calls to
|
||||
:ref:`VIDIOC_REQBUFS` and/or
|
||||
@ -308,12 +296,10 @@ struct v4l2_buffer
|
||||
actual number of valid elements in that array.
|
||||
* - __u32
|
||||
- ``reserved2``
|
||||
-
|
||||
- A place holder for future extensions. Drivers and applications
|
||||
must set this to 0.
|
||||
* - __u32
|
||||
- ``request_fd``
|
||||
-
|
||||
- The file descriptor of the request to queue the buffer to. If the flag
|
||||
``V4L2_BUF_FLAG_REQUEST_FD`` is set, then the buffer will be
|
||||
queued to this request. If the flag is not set, then this field will
|
||||
@ -344,11 +330,10 @@ struct v4l2_plane
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 1 2
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u32
|
||||
- ``bytesused``
|
||||
-
|
||||
- The number of bytes occupied by data in the plane (its payload).
|
||||
Drivers must set this field when ``type`` refers to a capture
|
||||
stream, applications when it refers to an output stream. If the
|
||||
@ -362,40 +347,35 @@ struct v4l2_plane
|
||||
which may not be 0.
|
||||
* - __u32
|
||||
- ``length``
|
||||
-
|
||||
- Size in bytes of the plane (not its payload). This is set by the
|
||||
driver based on the calls to
|
||||
:ref:`VIDIOC_REQBUFS` and/or
|
||||
:ref:`VIDIOC_CREATE_BUFS`.
|
||||
* - union
|
||||
* - union {
|
||||
- ``m``
|
||||
-
|
||||
-
|
||||
* -
|
||||
- __u32
|
||||
* - __u32
|
||||
- ``mem_offset``
|
||||
- When the memory type in the containing struct
|
||||
:c:type:`v4l2_buffer` is ``V4L2_MEMORY_MMAP``, this
|
||||
is the value that should be passed to :ref:`mmap() <func-mmap>`,
|
||||
similar to the ``offset`` field in struct
|
||||
:c:type:`v4l2_buffer`.
|
||||
* -
|
||||
- unsigned long
|
||||
* - unsigned long
|
||||
- ``userptr``
|
||||
- When the memory type in the containing struct
|
||||
:c:type:`v4l2_buffer` is ``V4L2_MEMORY_USERPTR``,
|
||||
this is a userspace pointer to the memory allocated for this plane
|
||||
by an application.
|
||||
* -
|
||||
- int
|
||||
* - int
|
||||
- ``fd``
|
||||
- When the memory type in the containing struct
|
||||
:c:type:`v4l2_buffer` is ``V4L2_MEMORY_DMABUF``,
|
||||
this is a file descriptor associated with a DMABUF buffer, similar
|
||||
to the ``fd`` field in struct :c:type:`v4l2_buffer`.
|
||||
* - }
|
||||
-
|
||||
* - __u32
|
||||
- ``data_offset``
|
||||
-
|
||||
- Offset in bytes to video data in the plane. Drivers must set this
|
||||
field when ``type`` refers to a capture stream, applications when
|
||||
it refers to an output stream.
|
||||
@ -407,7 +387,6 @@ struct v4l2_plane
|
||||
at offset ``data_offset`` from the start of the plane.
|
||||
* - __u32
|
||||
- ``reserved[11]``
|
||||
-
|
||||
- Reserved for future use. Should be zeroed by drivers and
|
||||
applications.
|
||||
|
||||
|
@ -478,33 +478,30 @@ struct v4l2_mpeg_vbi_fmt_ivtv
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 1 2
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u8
|
||||
- ``magic``\ [4]
|
||||
-
|
||||
- A "magic" constant from :ref:`v4l2-mpeg-vbi-fmt-ivtv-magic` that
|
||||
indicates this is a valid sliced VBI data payload and also
|
||||
indicates which member of the anonymous union, ``itv0`` or
|
||||
``ITV0``, to use for the payload data.
|
||||
* - union
|
||||
* - union {
|
||||
- (anonymous)
|
||||
* -
|
||||
- struct :c:type:`v4l2_mpeg_vbi_itv0`
|
||||
* - struct :c:type:`v4l2_mpeg_vbi_itv0`
|
||||
- ``itv0``
|
||||
- The primary form of the sliced VBI data payload that contains
|
||||
anywhere from 1 to 35 lines of sliced VBI data. Line masks are
|
||||
provided in this form of the payload indicating which VBI lines
|
||||
are provided.
|
||||
* -
|
||||
- struct :ref:`v4l2_mpeg_vbi_ITV0 <v4l2-mpeg-vbi-itv0-1>`
|
||||
* - struct :ref:`v4l2_mpeg_vbi_ITV0 <v4l2-mpeg-vbi-itv0-1>`
|
||||
- ``ITV0``
|
||||
- An alternate form of the sliced VBI data payload used when 36
|
||||
lines of sliced VBI data are present. No line masks are provided
|
||||
in this form of the payload; all valid line mask bits are
|
||||
implcitly set.
|
||||
|
||||
|
||||
* - }
|
||||
-
|
||||
|
||||
.. _v4l2-mpeg-vbi-fmt-ivtv-magic:
|
||||
|
||||
|
@ -2028,6 +2028,22 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
|
||||
* - ``V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM``
|
||||
- 0x00000004
|
||||
- The DPB entry is a long term reference frame
|
||||
* - ``V4L2_H264_DPB_ENTRY_FLAG_FIELD``
|
||||
- 0x00000008
|
||||
- The DPB entry is a field reference, which means only one of the field
|
||||
will be used when decoding the new frame/field. When not set the DPB
|
||||
entry is a frame reference (both fields will be used). Note that this
|
||||
flag does not say anything about the number of fields contained in the
|
||||
reference frame, it just describes the one used to decode the new
|
||||
field/frame
|
||||
* - ``V4L2_H264_DPB_ENTRY_FLAG_BOTTOM_FIELD``
|
||||
- 0x00000010
|
||||
- The DPB entry is a bottom field reference (only the bottom field of the
|
||||
reference frame is needed to decode the new frame/field). Only valid if
|
||||
V4L2_H264_DPB_ENTRY_FLAG_FIELD is set. When
|
||||
V4L2_H264_DPB_ENTRY_FLAG_FIELD is set but
|
||||
V4L2_H264_DPB_ENTRY_FLAG_BOTTOM_FIELD is not, that means the
|
||||
DPB entry is a top field reference
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_H264_DECODE_MODE (enum)``
|
||||
Specifies the decoding mode to use. Currently exposes slice-based and
|
||||
|
@ -34,5 +34,6 @@ orders. See also `the Wikipedia article on Bayer filter
|
||||
pixfmt-srggb10-ipu3
|
||||
pixfmt-srggb12
|
||||
pixfmt-srggb12p
|
||||
pixfmt-srggb14
|
||||
pixfmt-srggb14p
|
||||
pixfmt-srggb16
|
||||
|
82
Documentation/media/uapi/v4l/pixfmt-srggb14.rst
Normal file
82
Documentation/media/uapi/v4l/pixfmt-srggb14.rst
Normal file
@ -0,0 +1,82 @@
|
||||
.. Permission is granted to copy, distribute and/or modify this
|
||||
.. document under the terms of the GNU Free Documentation License,
|
||||
.. Version 1.1 or any later version published by the Free Software
|
||||
.. Foundation, with no Invariant Sections, no Front-Cover Texts
|
||||
.. and no Back-Cover Texts. A copy of the license is included at
|
||||
.. Documentation/media/uapi/fdl-appendix.rst.
|
||||
..
|
||||
.. TODO: replace it to GFDL-1.1-or-later WITH no-invariant-sections
|
||||
|
||||
.. _V4L2-PIX-FMT-SRGGB14:
|
||||
.. _v4l2-pix-fmt-sbggr14:
|
||||
.. _v4l2-pix-fmt-sgbrg14:
|
||||
.. _v4l2-pix-fmt-sgrbg14:
|
||||
|
||||
|
||||
***************************************************************************************************************************
|
||||
V4L2_PIX_FMT_SRGGB14 ('RG14'), V4L2_PIX_FMT_SGRBG14 ('GR14'), V4L2_PIX_FMT_SGBRG14 ('GB14'), V4L2_PIX_FMT_SBGGR14 ('BG14'),
|
||||
***************************************************************************************************************************
|
||||
|
||||
|
||||
14-bit Bayer formats expanded to 16 bits
|
||||
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
These four pixel formats are raw sRGB / Bayer formats with 14 bits per
|
||||
colour. Each sample is stored in a 16-bit word, with two unused high
|
||||
bits filled with zeros. Each n-pixel row contains n/2 green samples
|
||||
and n/2 blue or red samples, with alternating red and blue rows. Bytes
|
||||
are stored in memory in little endian order. They are conventionally
|
||||
described as GRGR... BGBG..., RGRG... GBGB..., etc. Below is an
|
||||
example of a small V4L2_PIX_FMT_SBGGR14 image:
|
||||
|
||||
**Byte Order.**
|
||||
Each cell is one byte, the two most significant bits in the high bytes are
|
||||
zero.
|
||||
|
||||
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 2 1 1 1 1 1 1 1 1
|
||||
|
||||
|
||||
* - start + 0:
|
||||
- B\ :sub:`00low`
|
||||
- B\ :sub:`00high`
|
||||
- G\ :sub:`01low`
|
||||
- G\ :sub:`01high`
|
||||
- B\ :sub:`02low`
|
||||
- B\ :sub:`02high`
|
||||
- G\ :sub:`03low`
|
||||
- G\ :sub:`03high`
|
||||
* - start + 8:
|
||||
- G\ :sub:`10low`
|
||||
- G\ :sub:`10high`
|
||||
- R\ :sub:`11low`
|
||||
- R\ :sub:`11high`
|
||||
- G\ :sub:`12low`
|
||||
- G\ :sub:`12high`
|
||||
- R\ :sub:`13low`
|
||||
- R\ :sub:`13high`
|
||||
* - start + 16:
|
||||
- B\ :sub:`20low`
|
||||
- B\ :sub:`20high`
|
||||
- G\ :sub:`21low`
|
||||
- G\ :sub:`21high`
|
||||
- B\ :sub:`22low`
|
||||
- B\ :sub:`22high`
|
||||
- G\ :sub:`23low`
|
||||
- G\ :sub:`23high`
|
||||
* - start + 24:
|
||||
- G\ :sub:`30low`
|
||||
- G\ :sub:`30high`
|
||||
- R\ :sub:`31low`
|
||||
- R\ :sub:`31high`
|
||||
- G\ :sub:`32low`
|
||||
- G\ :sub:`32high`
|
||||
- R\ :sub:`33low`
|
||||
- R\ :sub:`33high`
|
@ -100,7 +100,8 @@ describing all planes of that format.
|
||||
* - __u8
|
||||
- ``flags``
|
||||
- Flags set by the application or driver, see :ref:`format-flags`.
|
||||
* - :cspan:`2` union { (anonymous)
|
||||
* - union {
|
||||
- (anonymous)
|
||||
* - __u8
|
||||
- ``ycbcr_enc``
|
||||
- Y'CbCr encoding, from enum :c:type:`v4l2_ycbcr_encoding`.
|
||||
@ -113,7 +114,8 @@ describing all planes of that format.
|
||||
This information supplements the ``colorspace`` and must be set by
|
||||
the driver for capture streams and by the application for output
|
||||
streams, see :ref:`colorspaces`.
|
||||
* - :cspan:`2` }
|
||||
* - }
|
||||
-
|
||||
* - __u8
|
||||
- ``quantization``
|
||||
- Quantization range, from enum :c:type:`v4l2_quantization`.
|
||||
|
@ -143,7 +143,6 @@ Single-planar format structure
|
||||
- Flags set by the application or driver, see :ref:`format-flags`.
|
||||
* - union {
|
||||
- (anonymous)
|
||||
-
|
||||
* - __u32
|
||||
- ``ycbcr_enc``
|
||||
- Y'CbCr encoding, from enum :c:type:`v4l2_ycbcr_encoding`.
|
||||
@ -158,7 +157,6 @@ Single-planar format structure
|
||||
streams, see :ref:`colorspaces`.
|
||||
* - }
|
||||
-
|
||||
-
|
||||
* - __u32
|
||||
- ``quantization``
|
||||
- Quantization range, from enum :c:type:`v4l2_quantization`.
|
||||
|
72
Documentation/media/uapi/v4l/pixfmt-y14.rst
Normal file
72
Documentation/media/uapi/v4l/pixfmt-y14.rst
Normal file
@ -0,0 +1,72 @@
|
||||
.. Permission is granted to copy, distribute and/or modify this
|
||||
.. document under the terms of the GNU Free Documentation License,
|
||||
.. Version 1.1 or any later version published by the Free Software
|
||||
.. Foundation, with no Invariant Sections, no Front-Cover Texts
|
||||
.. and no Back-Cover Texts. A copy of the license is included at
|
||||
.. Documentation/media/uapi/fdl-appendix.rst.
|
||||
..
|
||||
.. TODO: replace it to GFDL-1.1-or-later WITH no-invariant-sections
|
||||
|
||||
.. _V4L2-PIX-FMT-Y14:
|
||||
|
||||
*************************
|
||||
V4L2_PIX_FMT_Y14 ('Y14 ')
|
||||
*************************
|
||||
|
||||
|
||||
Grey-scale image
|
||||
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
This is a grey-scale image with a depth of 14 bits per pixel. Pixels are
|
||||
stored in 16-bit words with unused high bits padded with 0. The least
|
||||
significant byte is stored at lower memory addresses (little-endian).
|
||||
|
||||
**Byte Order.**
|
||||
Each cell is one byte.
|
||||
|
||||
|
||||
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
|
||||
* - start + 0:
|
||||
- Y'\ :sub:`00low`
|
||||
- Y'\ :sub:`00high`
|
||||
- Y'\ :sub:`01low`
|
||||
- Y'\ :sub:`01high`
|
||||
- Y'\ :sub:`02low`
|
||||
- Y'\ :sub:`02high`
|
||||
- Y'\ :sub:`03low`
|
||||
- Y'\ :sub:`03high`
|
||||
* - start + 8:
|
||||
- Y'\ :sub:`10low`
|
||||
- Y'\ :sub:`10high`
|
||||
- Y'\ :sub:`11low`
|
||||
- Y'\ :sub:`11high`
|
||||
- Y'\ :sub:`12low`
|
||||
- Y'\ :sub:`12high`
|
||||
- Y'\ :sub:`13low`
|
||||
- Y'\ :sub:`13high`
|
||||
* - start + 16:
|
||||
- Y'\ :sub:`20low`
|
||||
- Y'\ :sub:`20high`
|
||||
- Y'\ :sub:`21low`
|
||||
- Y'\ :sub:`21high`
|
||||
- Y'\ :sub:`22low`
|
||||
- Y'\ :sub:`22high`
|
||||
- Y'\ :sub:`23low`
|
||||
- Y'\ :sub:`23high`
|
||||
* - start + 24:
|
||||
- Y'\ :sub:`30low`
|
||||
- Y'\ :sub:`30high`
|
||||
- Y'\ :sub:`31low`
|
||||
- Y'\ :sub:`31high`
|
||||
- Y'\ :sub:`32low`
|
||||
- Y'\ :sub:`32high`
|
||||
- Y'\ :sub:`33low`
|
||||
- Y'\ :sub:`33high`
|
@ -5792,6 +5792,43 @@ the following codes.
|
||||
- u\ :sub:`2`
|
||||
- u\ :sub:`1`
|
||||
- u\ :sub:`0`
|
||||
* .. _MEDIA-BUS-FMT-Y14-1X14:
|
||||
|
||||
- MEDIA_BUS_FMT_Y14_1X14
|
||||
- 0x202d
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
- y\ :sub:`13`
|
||||
- y\ :sub:`12`
|
||||
- y\ :sub:`11`
|
||||
- y\ :sub:`10`
|
||||
- y\ :sub:`9`
|
||||
- y\ :sub:`8`
|
||||
- y\ :sub:`7`
|
||||
- y\ :sub:`6`
|
||||
- y\ :sub:`5`
|
||||
- y\ :sub:`4`
|
||||
- y\ :sub:`3`
|
||||
- y\ :sub:`2`
|
||||
- y\ :sub:`1`
|
||||
- y\ :sub:`0`
|
||||
* .. _MEDIA-BUS-FMT-UYVY8-1X16:
|
||||
|
||||
- MEDIA_BUS_FMT_UYVY8_1X16
|
||||
|
@ -91,23 +91,23 @@ instructions.
|
||||
.. flat-table:: struct v4l2_dbg_match
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 1 2
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u32
|
||||
- ``type``
|
||||
- See :ref:`name-chip-match-types` for a list of possible types.
|
||||
* - union
|
||||
* - union {
|
||||
- (anonymous)
|
||||
* -
|
||||
- __u32
|
||||
* - __u32
|
||||
- ``addr``
|
||||
- Match a chip by this number, interpreted according to the ``type``
|
||||
field.
|
||||
* -
|
||||
- char
|
||||
* - char
|
||||
- ``name[32]``
|
||||
- Match a chip by this name, interpreted according to the ``type``
|
||||
field. Currently unused.
|
||||
* - }
|
||||
-
|
||||
|
||||
|
||||
|
||||
|
@ -100,23 +100,23 @@ instructions.
|
||||
.. flat-table:: struct v4l2_dbg_match
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 1 2
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u32
|
||||
- ``type``
|
||||
- See :ref:`chip-match-types` for a list of possible types.
|
||||
* - union
|
||||
* - union {
|
||||
- (anonymous)
|
||||
* -
|
||||
- __u32
|
||||
* - __u32
|
||||
- ``addr``
|
||||
- Match a chip by this number, interpreted according to the ``type``
|
||||
field.
|
||||
* -
|
||||
- char
|
||||
* - char
|
||||
- ``name[32]``
|
||||
- Match a chip by this name, interpreted according to the ``type``
|
||||
field. Currently unused.
|
||||
* - }
|
||||
-
|
||||
|
||||
|
||||
|
||||
|
@ -77,32 +77,25 @@ introduced in Linux 3.3. They are, however, mandatory for stateful mem2mem decod
|
||||
.. flat-table:: struct v4l2_decoder_cmd
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 11 24 12 16 106
|
||||
:widths: 1 1 1 3
|
||||
|
||||
* - __u32
|
||||
- ``cmd``
|
||||
-
|
||||
-
|
||||
- The decoder command, see :ref:`decoder-cmds`.
|
||||
* - __u32
|
||||
- ``flags``
|
||||
-
|
||||
-
|
||||
- Flags to go with the command. If no flags are defined for this
|
||||
command, drivers and applications must set this field to zero.
|
||||
* - union
|
||||
* - union {
|
||||
- (anonymous)
|
||||
-
|
||||
-
|
||||
-
|
||||
* -
|
||||
- struct
|
||||
* - struct
|
||||
- ``start``
|
||||
-
|
||||
- Structure containing additional data for the
|
||||
``V4L2_DEC_CMD_START`` command.
|
||||
* -
|
||||
-
|
||||
- __s32
|
||||
- ``speed``
|
||||
- Playback speed and direction. The playback speed is defined as
|
||||
@ -113,7 +106,6 @@ introduced in Linux 3.3. They are, however, mandatory for stateful mem2mem decod
|
||||
of 1 steps just one frame forward, a speed of -1 steps just one
|
||||
frame back.
|
||||
* -
|
||||
-
|
||||
- __u32
|
||||
- ``format``
|
||||
- Format restrictions. This field is set by the driver, not the
|
||||
@ -124,30 +116,26 @@ introduced in Linux 3.3. They are, however, mandatory for stateful mem2mem decod
|
||||
GOPs, which it can then play in reverse order. So to implement
|
||||
reverse playback the application must feed the decoder the last
|
||||
GOP in the video file, then the GOP before that, etc. etc.
|
||||
* -
|
||||
- struct
|
||||
* - struct
|
||||
- ``stop``
|
||||
-
|
||||
- Structure containing additional data for the ``V4L2_DEC_CMD_STOP``
|
||||
command.
|
||||
* -
|
||||
-
|
||||
- __u64
|
||||
- ``pts``
|
||||
- Stop playback at this ``pts`` or immediately if the playback is
|
||||
already past that timestamp. Leave to 0 if you want to stop after
|
||||
the last frame was decoded.
|
||||
* -
|
||||
- struct
|
||||
* - struct
|
||||
- ``raw``
|
||||
-
|
||||
-
|
||||
* -
|
||||
-
|
||||
- __u32
|
||||
- ``data``\ [16]
|
||||
- Reserved for future extensions. Drivers and applications must set
|
||||
the array to zero.
|
||||
* - }
|
||||
-
|
||||
|
||||
|
||||
|
||||
|
@ -55,66 +55,54 @@ call.
|
||||
.. flat-table:: struct v4l2_event
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2 1
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u32
|
||||
- ``type``
|
||||
-
|
||||
- Type of the event, see :ref:`event-type`.
|
||||
* - union
|
||||
* - union {
|
||||
- ``u``
|
||||
-
|
||||
-
|
||||
* -
|
||||
- struct :c:type:`v4l2_event_vsync`
|
||||
* - struct :c:type:`v4l2_event_vsync`
|
||||
- ``vsync``
|
||||
- Event data for event ``V4L2_EVENT_VSYNC``.
|
||||
* -
|
||||
- struct :c:type:`v4l2_event_ctrl`
|
||||
* - struct :c:type:`v4l2_event_ctrl`
|
||||
- ``ctrl``
|
||||
- Event data for event ``V4L2_EVENT_CTRL``.
|
||||
* -
|
||||
- struct :c:type:`v4l2_event_frame_sync`
|
||||
* - struct :c:type:`v4l2_event_frame_sync`
|
||||
- ``frame_sync``
|
||||
- Event data for event ``V4L2_EVENT_FRAME_SYNC``.
|
||||
* -
|
||||
- struct :c:type:`v4l2_event_motion_det`
|
||||
* - struct :c:type:`v4l2_event_motion_det`
|
||||
- ``motion_det``
|
||||
- Event data for event V4L2_EVENT_MOTION_DET.
|
||||
* -
|
||||
- struct :c:type:`v4l2_event_src_change`
|
||||
* - struct :c:type:`v4l2_event_src_change`
|
||||
- ``src_change``
|
||||
- Event data for event V4L2_EVENT_SOURCE_CHANGE.
|
||||
* -
|
||||
- __u8
|
||||
* - __u8
|
||||
- ``data``\ [64]
|
||||
- Event data. Defined by the event type. The union should be used to
|
||||
define easily accessible type for events.
|
||||
* - }
|
||||
-
|
||||
* - __u32
|
||||
- ``pending``
|
||||
-
|
||||
- Number of pending events excluding this one.
|
||||
* - __u32
|
||||
- ``sequence``
|
||||
-
|
||||
- Event sequence number. The sequence number is incremented for
|
||||
every subscribed event that takes place. If sequence numbers are
|
||||
not contiguous it means that events have been lost.
|
||||
* - struct timespec
|
||||
- ``timestamp``
|
||||
-
|
||||
- Event timestamp. The timestamp has been taken from the
|
||||
``CLOCK_MONOTONIC`` clock. To access the same clock outside V4L2,
|
||||
use :c:func:`clock_gettime`.
|
||||
* - u32
|
||||
- ``id``
|
||||
-
|
||||
- The ID associated with the event source. If the event does not
|
||||
have an associated ID (this depends on the event type), then this
|
||||
is 0.
|
||||
* - __u32
|
||||
- ``reserved``\ [8]
|
||||
-
|
||||
- Reserved for future extensions. Drivers must set the array to
|
||||
zero.
|
||||
|
||||
@ -233,54 +221,45 @@ call.
|
||||
.. flat-table:: struct v4l2_event_ctrl
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2 1
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u32
|
||||
- ``changes``
|
||||
-
|
||||
- A bitmask that tells what has changed. See
|
||||
:ref:`ctrl-changes-flags`.
|
||||
* - __u32
|
||||
- ``type``
|
||||
-
|
||||
- The type of the control. See enum
|
||||
:c:type:`v4l2_ctrl_type`.
|
||||
* - union (anonymous)
|
||||
-
|
||||
-
|
||||
-
|
||||
* -
|
||||
- __s32
|
||||
* - union {
|
||||
- (anonymous)
|
||||
* - __s32
|
||||
- ``value``
|
||||
- The 32-bit value of the control for 32-bit control types. This is
|
||||
0 for string controls since the value of a string cannot be passed
|
||||
using :ref:`VIDIOC_DQEVENT`.
|
||||
* -
|
||||
- __s64
|
||||
* - __s64
|
||||
- ``value64``
|
||||
- The 64-bit value of the control for 64-bit control types.
|
||||
* - }
|
||||
-
|
||||
* - __u32
|
||||
- ``flags``
|
||||
-
|
||||
- The control flags. See :ref:`control-flags`.
|
||||
* - __s32
|
||||
- ``minimum``
|
||||
-
|
||||
- The minimum value of the control. See struct
|
||||
:ref:`v4l2_queryctrl <v4l2-queryctrl>`.
|
||||
* - __s32
|
||||
- ``maximum``
|
||||
-
|
||||
- The maximum value of the control. See struct
|
||||
:ref:`v4l2_queryctrl <v4l2-queryctrl>`.
|
||||
* - __s32
|
||||
- ``step``
|
||||
-
|
||||
- The step value of the control. See struct
|
||||
:ref:`v4l2_queryctrl <v4l2-queryctrl>`.
|
||||
* - __s32
|
||||
- ``default_value``
|
||||
-
|
||||
- The default value value of the control. See struct
|
||||
:ref:`v4l2_queryctrl <v4l2-queryctrl>`.
|
||||
|
||||
|
@ -112,7 +112,7 @@ that doesn't support them will return an ``EINVAL`` error code.
|
||||
.. flat-table:: struct v4l2_dv_timings_cap
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2 1
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u32
|
||||
- ``type``
|
||||
@ -127,16 +127,14 @@ that doesn't support them will return an ``EINVAL`` error code.
|
||||
- Reserved for future extensions.
|
||||
|
||||
Drivers and applications must set the array to zero.
|
||||
* - union
|
||||
-
|
||||
-
|
||||
* -
|
||||
- struct :c:type:`v4l2_bt_timings_cap`
|
||||
* - union {
|
||||
- (anonymous)
|
||||
* - struct :c:type:`v4l2_bt_timings_cap`
|
||||
- ``bt``
|
||||
- BT.656/1120 timings capabilities of the hardware.
|
||||
* -
|
||||
- __u32
|
||||
* - __u32
|
||||
- ``raw_data``\ [32]
|
||||
* - }
|
||||
-
|
||||
|
||||
.. tabularcolumns:: |p{7.0cm}|p{10.5cm}|
|
||||
|
@ -138,36 +138,31 @@ application should zero out all members except for the *IN* fields.
|
||||
|
||||
* - __u32
|
||||
- ``index``
|
||||
-
|
||||
- IN: Index of the given frame interval in the enumeration.
|
||||
* - __u32
|
||||
- ``pixel_format``
|
||||
-
|
||||
- IN: Pixel format for which the frame intervals are enumerated.
|
||||
* - __u32
|
||||
- ``width``
|
||||
-
|
||||
- IN: Frame width for which the frame intervals are enumerated.
|
||||
* - __u32
|
||||
- ``height``
|
||||
-
|
||||
- IN: Frame height for which the frame intervals are enumerated.
|
||||
* - __u32
|
||||
- ``type``
|
||||
-
|
||||
- OUT: Frame interval type the device supports.
|
||||
* - union
|
||||
-
|
||||
-
|
||||
* - union {
|
||||
- (anonymous)
|
||||
- OUT: Frame interval with the given index.
|
||||
* -
|
||||
- struct :c:type:`v4l2_fract`
|
||||
* - struct :c:type:`v4l2_fract`
|
||||
- ``discrete``
|
||||
- Frame interval [s].
|
||||
* -
|
||||
- struct :c:type:`v4l2_frmival_stepwise`
|
||||
* - struct :c:type:`v4l2_frmival_stepwise`
|
||||
- ``stepwise``
|
||||
-
|
||||
* - }
|
||||
-
|
||||
-
|
||||
* - __u32
|
||||
- ``reserved[2]``
|
||||
-
|
||||
|
@ -155,31 +155,27 @@ application should zero out all members except for the *IN* fields.
|
||||
|
||||
* - __u32
|
||||
- ``index``
|
||||
-
|
||||
- IN: Index of the given frame size in the enumeration.
|
||||
* - __u32
|
||||
- ``pixel_format``
|
||||
-
|
||||
- IN: Pixel format for which the frame sizes are enumerated.
|
||||
* - __u32
|
||||
- ``type``
|
||||
-
|
||||
- OUT: Frame size type the device supports.
|
||||
* - union
|
||||
-
|
||||
-
|
||||
* - union {
|
||||
- (anonymous)
|
||||
- OUT: Frame size with the given index.
|
||||
* -
|
||||
- struct :c:type:`v4l2_frmsize_discrete`
|
||||
* - struct :c:type:`v4l2_frmsize_discrete`
|
||||
- ``discrete``
|
||||
-
|
||||
* -
|
||||
- struct :c:type:`v4l2_frmsize_stepwise`
|
||||
* - struct :c:type:`v4l2_frmsize_stepwise`
|
||||
- ``stepwise``
|
||||
-
|
||||
* - }
|
||||
-
|
||||
-
|
||||
* - __u32
|
||||
- ``reserved[2]``
|
||||
-
|
||||
- Reserved space for future use. Must be zeroed by drivers and
|
||||
applications.
|
||||
|
||||
|
@ -179,23 +179,21 @@ EBUSY
|
||||
.. flat-table:: struct v4l2_dv_timings
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2 1
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u32
|
||||
- ``type``
|
||||
-
|
||||
- Type of DV timings as listed in :ref:`dv-timing-types`.
|
||||
* - union
|
||||
-
|
||||
-
|
||||
* -
|
||||
- struct :c:type:`v4l2_bt_timings`
|
||||
* - union {
|
||||
- (anonymous)
|
||||
* - struct :c:type:`v4l2_bt_timings`
|
||||
- ``bt``
|
||||
- Timings defined by BT.656/1120 specifications
|
||||
* -
|
||||
- __u32
|
||||
* - __u32
|
||||
- ``reserved``\ [32]
|
||||
-
|
||||
* - }
|
||||
-
|
||||
|
||||
.. tabularcolumns:: |p{4.4cm}|p{4.4cm}|p{8.7cm}|
|
||||
|
||||
|
@ -136,15 +136,13 @@ still cause this situation.
|
||||
.. flat-table:: struct v4l2_ext_control
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 1 2
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u32
|
||||
- ``id``
|
||||
-
|
||||
- Identifies the control, set by the application.
|
||||
* - __u32
|
||||
- ``size``
|
||||
-
|
||||
- The total size in bytes of the payload of this control. This is
|
||||
normally 0, but for pointer controls this should be set to the
|
||||
size of the memory containing the payload, or that will receive
|
||||
@ -161,55 +159,48 @@ still cause this situation.
|
||||
*length* of the string may well be much smaller.
|
||||
* - __u32
|
||||
- ``reserved2``\ [1]
|
||||
-
|
||||
- Reserved for future extensions. Drivers and applications must set
|
||||
the array to zero.
|
||||
* - union
|
||||
* - union {
|
||||
- (anonymous)
|
||||
* -
|
||||
- __s32
|
||||
* - __s32
|
||||
- ``value``
|
||||
- New value or current value. Valid if this control is not of type
|
||||
``V4L2_CTRL_TYPE_INTEGER64`` and ``V4L2_CTRL_FLAG_HAS_PAYLOAD`` is
|
||||
not set.
|
||||
* -
|
||||
- __s64
|
||||
* - __s64
|
||||
- ``value64``
|
||||
- New value or current value. Valid if this control is of type
|
||||
``V4L2_CTRL_TYPE_INTEGER64`` and ``V4L2_CTRL_FLAG_HAS_PAYLOAD`` is
|
||||
not set.
|
||||
* -
|
||||
- char *
|
||||
* - char *
|
||||
- ``string``
|
||||
- A pointer to a string. Valid if this control is of type
|
||||
``V4L2_CTRL_TYPE_STRING``.
|
||||
* -
|
||||
- __u8 *
|
||||
* - __u8 *
|
||||
- ``p_u8``
|
||||
- A pointer to a matrix control of unsigned 8-bit values. Valid if
|
||||
this control is of type ``V4L2_CTRL_TYPE_U8``.
|
||||
* -
|
||||
- __u16 *
|
||||
* - __u16 *
|
||||
- ``p_u16``
|
||||
- A pointer to a matrix control of unsigned 16-bit values. Valid if
|
||||
this control is of type ``V4L2_CTRL_TYPE_U16``.
|
||||
* -
|
||||
- __u32 *
|
||||
* - __u32 *
|
||||
- ``p_u32``
|
||||
- A pointer to a matrix control of unsigned 32-bit values. Valid if
|
||||
this control is of type ``V4L2_CTRL_TYPE_U32``.
|
||||
* -
|
||||
- :c:type:`v4l2_area` *
|
||||
* - :c:type:`v4l2_area` *
|
||||
- ``p_area``
|
||||
- A pointer to a struct :c:type:`v4l2_area`. Valid if this control is
|
||||
of type ``V4L2_CTRL_TYPE_AREA``.
|
||||
* -
|
||||
- void *
|
||||
* - void *
|
||||
- ``ptr``
|
||||
- A pointer to a compound type which can be an N-dimensional array
|
||||
and/or a compound type (the control's type is >=
|
||||
``V4L2_CTRL_COMPOUND_TYPES``). Valid if
|
||||
``V4L2_CTRL_FLAG_HAS_PAYLOAD`` is set for this control.
|
||||
* - }
|
||||
-
|
||||
|
||||
|
||||
.. tabularcolumns:: |p{4.0cm}|p{2.2cm}|p{2.1cm}|p{8.2cm}|
|
||||
@ -221,12 +212,11 @@ still cause this situation.
|
||||
.. flat-table:: struct v4l2_ext_controls
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2 1
|
||||
:widths: 1 1 2
|
||||
|
||||
* - union
|
||||
* - union {
|
||||
- (anonymous)
|
||||
* -
|
||||
- __u32
|
||||
* - __u32
|
||||
- ``ctrl_class``
|
||||
- The control class to which all controls belong, see
|
||||
:ref:`ctrl-class`. Drivers that use a kernel framework for
|
||||
@ -235,8 +225,7 @@ still cause this situation.
|
||||
support this can be tested by setting ``ctrl_class`` to 0 and
|
||||
calling :ref:`VIDIOC_TRY_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>` with a ``count`` of 0. If that
|
||||
succeeds, then the driver supports this feature.
|
||||
* -
|
||||
- __u32
|
||||
* - __u32
|
||||
- ``which``
|
||||
- Which value of the control to get/set/try.
|
||||
``V4L2_CTRL_WHICH_CUR_VAL`` will return the current value of the
|
||||
@ -261,6 +250,8 @@ still cause this situation.
|
||||
by setting ctrl_class to ``V4L2_CTRL_WHICH_CUR_VAL`` and calling
|
||||
VIDIOC_TRY_EXT_CTRLS with a count of 0. If that fails, then the
|
||||
driver does not support ``V4L2_CTRL_WHICH_CUR_VAL``.
|
||||
* - }
|
||||
-
|
||||
* - __u32
|
||||
- ``count``
|
||||
- The number of controls in the controls array. May also be zero.
|
||||
|
@ -103,51 +103,44 @@ The format as returned by :ref:`VIDIOC_TRY_FMT <VIDIOC_G_FMT>` must be identical
|
||||
|
||||
* - __u32
|
||||
- ``type``
|
||||
-
|
||||
- Type of the data stream, see :c:type:`v4l2_buf_type`.
|
||||
* - union
|
||||
* - union {
|
||||
- ``fmt``
|
||||
* -
|
||||
- struct :c:type:`v4l2_pix_format`
|
||||
* - struct :c:type:`v4l2_pix_format`
|
||||
- ``pix``
|
||||
- Definition of an image format, see :ref:`pixfmt`, used by video
|
||||
capture and output devices.
|
||||
* -
|
||||
- struct :c:type:`v4l2_pix_format_mplane`
|
||||
* - struct :c:type:`v4l2_pix_format_mplane`
|
||||
- ``pix_mp``
|
||||
- Definition of an image format, see :ref:`pixfmt`, used by video
|
||||
capture and output devices that support the
|
||||
:ref:`multi-planar version of the API <planar-apis>`.
|
||||
* -
|
||||
- struct :c:type:`v4l2_window`
|
||||
* - struct :c:type:`v4l2_window`
|
||||
- ``win``
|
||||
- Definition of an overlaid image, see :ref:`overlay`, used by
|
||||
video overlay devices.
|
||||
* -
|
||||
- struct :c:type:`v4l2_vbi_format`
|
||||
* - struct :c:type:`v4l2_vbi_format`
|
||||
- ``vbi``
|
||||
- Raw VBI capture or output parameters. This is discussed in more
|
||||
detail in :ref:`raw-vbi`. Used by raw VBI capture and output
|
||||
devices.
|
||||
* -
|
||||
- struct :c:type:`v4l2_sliced_vbi_format`
|
||||
* - struct :c:type:`v4l2_sliced_vbi_format`
|
||||
- ``sliced``
|
||||
- Sliced VBI capture or output parameters. See :ref:`sliced` for
|
||||
details. Used by sliced VBI capture and output devices.
|
||||
* -
|
||||
- struct :c:type:`v4l2_sdr_format`
|
||||
* - struct :c:type:`v4l2_sdr_format`
|
||||
- ``sdr``
|
||||
- Definition of a data format, see :ref:`pixfmt`, used by SDR
|
||||
capture and output devices.
|
||||
* -
|
||||
- struct :c:type:`v4l2_meta_format`
|
||||
* - struct :c:type:`v4l2_meta_format`
|
||||
- ``meta``
|
||||
- Definition of a metadata format, see :ref:`meta-formats`, used by
|
||||
metadata capture devices.
|
||||
* -
|
||||
- __u8
|
||||
* - __u8
|
||||
- ``raw_data``\ [200]
|
||||
- Place holder for future extensions.
|
||||
* - }
|
||||
-
|
||||
|
||||
|
||||
Return Value
|
||||
|
@ -69,33 +69,29 @@ union holding separate parameters for input and output devices.
|
||||
.. flat-table:: struct v4l2_streamparm
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 1 2
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u32
|
||||
- ``type``
|
||||
-
|
||||
- The buffer (stream) type, same as struct
|
||||
:c:type:`v4l2_format` ``type``, set by the
|
||||
application. See :c:type:`v4l2_buf_type`.
|
||||
* - union
|
||||
* - union {
|
||||
- ``parm``
|
||||
-
|
||||
-
|
||||
* -
|
||||
- struct :c:type:`v4l2_captureparm`
|
||||
* - struct :c:type:`v4l2_captureparm`
|
||||
- ``capture``
|
||||
- Parameters for capture devices, used when ``type`` is
|
||||
``V4L2_BUF_TYPE_VIDEO_CAPTURE`` or
|
||||
``V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE``.
|
||||
* -
|
||||
- struct :c:type:`v4l2_outputparm`
|
||||
* - struct :c:type:`v4l2_outputparm`
|
||||
- ``output``
|
||||
- Parameters for output devices, used when ``type`` is
|
||||
``V4L2_BUF_TYPE_VIDEO_OUTPUT`` or ``V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE``.
|
||||
* -
|
||||
- __u8
|
||||
* - __u8
|
||||
- ``raw_data``\ [200]
|
||||
- A place holder for future extensions.
|
||||
* - }
|
||||
-
|
||||
|
||||
|
||||
|
||||
|
@ -290,34 +290,29 @@ See also the examples in :ref:`control`.
|
||||
.. flat-table:: struct v4l2_querymenu
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2 1
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u32
|
||||
-
|
||||
- ``id``
|
||||
- Identifies the control, set by the application from the respective
|
||||
struct :ref:`v4l2_queryctrl <v4l2-queryctrl>` ``id``.
|
||||
* - __u32
|
||||
-
|
||||
- ``index``
|
||||
- Index of the menu item, starting at zero, set by the application.
|
||||
* - union
|
||||
-
|
||||
-
|
||||
-
|
||||
* -
|
||||
- __u8
|
||||
* - union {
|
||||
- (anonymous)
|
||||
* - __u8
|
||||
- ``name``\ [32]
|
||||
- Name of the menu item, a NUL-terminated ASCII string. This
|
||||
information is intended for the user. This field is valid for
|
||||
``V4L2_CTRL_TYPE_MENU`` type controls.
|
||||
* -
|
||||
- __s64
|
||||
* - __s64
|
||||
- ``value``
|
||||
- Value of the integer menu item. This field is valid for
|
||||
``V4L2_CTRL_TYPE_INTEGER_MENU`` type controls.
|
||||
* - __u32
|
||||
* - }
|
||||
-
|
||||
* - __u32
|
||||
- ``reserved``
|
||||
- Reserved for future extensions. Drivers must set the array to
|
||||
zero.
|
||||
@ -378,7 +373,7 @@ See also the examples in :ref:`control`.
|
||||
- 0
|
||||
- 0
|
||||
- A control which performs an action when set. Drivers must ignore
|
||||
the value passed with ``VIDIOC_S_CTRL`` and return an ``EINVAL`` error
|
||||
the value passed with ``VIDIOC_S_CTRL`` and return an ``EACCES`` error
|
||||
code on a ``VIDIOC_G_CTRL`` attempt.
|
||||
* - ``V4L2_CTRL_TYPE_INTEGER64``
|
||||
- any
|
||||
|
@ -35,6 +35,7 @@ to brightness information.
|
||||
pixfmt-grey
|
||||
pixfmt-y10
|
||||
pixfmt-y12
|
||||
pixfmt-y14
|
||||
pixfmt-y10b
|
||||
pixfmt-y10p
|
||||
pixfmt-y16
|
||||
|
@ -311,10 +311,13 @@ Down Scaler and GDC blocks should be configured with the supported resolutions
|
||||
as each hardware block has its own alignment requirement.
|
||||
|
||||
You must configure the output resolution of the hardware blocks smartly to meet
|
||||
the hardware requirement along with keeping the maximum field of view.
|
||||
The intermediate resolutions can be generated by specific tool and this
|
||||
information can be obtained by looking at the following IPU3 ImgU configuration
|
||||
table.
|
||||
the hardware requirement along with keeping the maximum field of view. The
|
||||
intermediate resolutions can be generated by specific tool -
|
||||
|
||||
https://github.com/intel/intel-ipu3-pipecfg
|
||||
|
||||
This tool can be used to generate intermediate resolutions. More information can
|
||||
be obtained by looking at the following IPU3 ImgU configuration table.
|
||||
|
||||
https://chromium.googlesource.com/chromiumos/overlays/board-overlays/+/master
|
||||
|
||||
|
@ -4,9 +4,9 @@ The Virtual Video Test Driver (vivid)
|
||||
=====================================
|
||||
|
||||
This driver emulates video4linux hardware of various types: video capture, video
|
||||
output, vbi capture and output, radio receivers and transmitters and a software
|
||||
defined radio receiver. In addition a simple framebuffer device is available for
|
||||
testing capture and output overlays.
|
||||
output, vbi capture and output, metadata capture and output, radio receivers and
|
||||
transmitters, touch capture and a software defined radio receiver. In addition a
|
||||
simple framebuffer device is available for testing capture and output overlays.
|
||||
|
||||
Up to 64 vivid instances can be created, each with up to 16 inputs and 16 outputs.
|
||||
|
||||
@ -36,6 +36,8 @@ This document describes the features implemented by this driver:
|
||||
- Radio receiver and transmitter support, including RDS support
|
||||
- Software defined radio (SDR) support
|
||||
- Capture and output overlay support
|
||||
- Metadata capture and output support
|
||||
- Touch capture support
|
||||
|
||||
These features will be described in more detail below.
|
||||
|
||||
@ -69,6 +71,9 @@ all configurable using the following module options:
|
||||
- bit 10-11: VBI Output node: 0 = none, 1 = raw vbi, 2 = sliced vbi, 3 = both
|
||||
- bit 12: Radio Transmitter node
|
||||
- bit 16: Framebuffer for testing overlays
|
||||
- bit 17: Metadata Capture node
|
||||
- bit 18: Metadata Output node
|
||||
- bit 19: Touch Capture node
|
||||
|
||||
So to create four instances, the first two with just one video capture
|
||||
device, the second two with just one video output device you would pass
|
||||
@ -175,6 +180,21 @@ all configurable using the following module options:
|
||||
give the desired swradioX start number for each SDR capture device.
|
||||
The default is -1 which will just take the first free number.
|
||||
|
||||
- meta_cap_nr:
|
||||
|
||||
give the desired videoX start number for each metadata capture device.
|
||||
The default is -1 which will just take the first free number.
|
||||
|
||||
- meta_out_nr:
|
||||
|
||||
give the desired videoX start number for each metadata output device.
|
||||
The default is -1 which will just take the first free number.
|
||||
|
||||
- touch_cap_nr:
|
||||
|
||||
give the desired v4l-touchX start number for each touch capture device.
|
||||
The default is -1 which will just take the first free number.
|
||||
|
||||
- ccs_cap_mode:
|
||||
|
||||
specify the allowed video capture crop/compose/scaling combination
|
||||
@ -547,6 +567,33 @@ The generated data contains the In-phase and Quadrature components of a
|
||||
1 kHz tone that has an amplitude of sqrt(2).
|
||||
|
||||
|
||||
Metadata Capture
|
||||
----------------
|
||||
|
||||
The Metadata capture generates UVC format metadata. The PTS and SCR are
|
||||
transmitted based on the values set in vivid contols.
|
||||
|
||||
The Metadata device will only work for the Webcam input, it will give
|
||||
back an error for all other inputs.
|
||||
|
||||
|
||||
Metadata Output
|
||||
---------------
|
||||
|
||||
The Metadata output can be used to set brightness, contrast, saturation and hue.
|
||||
|
||||
The Metadata device will only work for the Webcam output, it will give
|
||||
back an error for all other outputs.
|
||||
|
||||
|
||||
Touch Capture
|
||||
-------------
|
||||
|
||||
The Touch capture generates touch patterns simulating single tap, double tap,
|
||||
triple tap, move from left to right, zoom in, zoom out, palm press (simulating
|
||||
a large area being pressed on a touchpad), and simulating 16 simultaneous
|
||||
touch points.
|
||||
|
||||
Controls
|
||||
--------
|
||||
|
||||
@ -1049,6 +1096,16 @@ FM Radio Modulator Controls
|
||||
to pass the RDS blocks to the driver, or "Controls" where the RDS data
|
||||
is Provided by the RDS controls mentioned above.
|
||||
|
||||
Metadata Capture Controls
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- Generate PTS
|
||||
|
||||
if set, then the generated metadata stream contains Presentation timestamp.
|
||||
|
||||
- Generate SCR
|
||||
|
||||
if set, then the generated metadata stream contains Source Clock information.
|
||||
|
||||
Video, VBI and RDS Looping
|
||||
--------------------------
|
||||
|
@ -649,7 +649,7 @@ video_device注册
|
||||
|
||||
接下来你需要注册视频设备:这会为你创建一个字符设备。
|
||||
|
||||
err = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
|
||||
err = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
|
||||
if (err) {
|
||||
video_device_release(vdev); /* or kfree(my_vdev); */
|
||||
return err;
|
||||
@ -660,7 +660,7 @@ video_device注册
|
||||
|
||||
注册哪种设备是根据类型(type)参数。存在以下类型:
|
||||
|
||||
VFL_TYPE_GRABBER: 用于视频输入/输出设备的 videoX
|
||||
VFL_TYPE_VIDEO: 用于视频输入/输出设备的 videoX
|
||||
VFL_TYPE_VBI: 用于垂直消隐数据的 vbiX (例如,隐藏式字幕,图文电视)
|
||||
VFL_TYPE_RADIO: 用于广播调谐器的 radioX
|
||||
|
||||
|
32
MAINTAINERS
32
MAINTAINERS
@ -10963,6 +10963,7 @@ F: drivers/media/platform/atmel/atmel-isc.h
|
||||
F: drivers/media/platform/atmel/atmel-isc-base.c
|
||||
F: drivers/media/platform/atmel/atmel-isc-regs.h
|
||||
F: Documentation/devicetree/bindings/media/atmel-isc.txt
|
||||
F: include/linux/atmel-isc-media.h
|
||||
|
||||
MICROCHIP ISI DRIVER
|
||||
M: Eugen Hristev <eugen.hristev@microchip.com>
|
||||
@ -13914,6 +13915,7 @@ L: linux-arm-msm@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/platform/qcom/venus/
|
||||
F: Documentation/devicetree/bindings/media/*venus*
|
||||
|
||||
QUALCOMM WCN36XX WIRELESS DRIVER
|
||||
M: Kalle Valo <kvalo@codeaurora.org>
|
||||
@ -14328,9 +14330,12 @@ F: Documentation/devicetree/bindings/media/rockchip-rga.txt
|
||||
|
||||
HANTRO VPU CODEC DRIVER
|
||||
M: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
M: Philipp Zabel <p.zabel@pengutronix.de>
|
||||
L: linux-media@vger.kernel.org
|
||||
L: linux-rockchip@lists.infradead.org
|
||||
S: Maintained
|
||||
F: drivers/staging/media/hantro/
|
||||
F: Documentation/devicetree/bindings/media/nxp,imx8mq-vpu.yaml
|
||||
F: Documentation/devicetree/bindings/media/rockchip-vpu.txt
|
||||
|
||||
ROCKER DRIVER
|
||||
@ -14377,6 +14382,14 @@ F: include/net/rose.h
|
||||
F: include/uapi/linux/rose.h
|
||||
F: net/rose/
|
||||
|
||||
ROTATION DRIVER FOR ALLWINNER A83T
|
||||
M: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/platform/sunxi/sun8i-rotate/
|
||||
F: Documentation/devicetree/bindings/media/allwinner,sun8i-a83t-de2-rotate.yaml
|
||||
|
||||
RTL2830 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
@ -15347,11 +15360,10 @@ S: Odd Fixes
|
||||
F: drivers/net/ethernet/smsc/smc91x.*
|
||||
|
||||
SMIA AND SMIA++ IMAGE SENSOR DRIVER
|
||||
M: Sakari Ailus <sakari.ailus@iki.fi>
|
||||
M: Sakari Ailus <sakari.ailus@linux.intel.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/smiapp/
|
||||
F: include/media/i2c/smiapp.h
|
||||
F: drivers/media/i2c/smiapp-pll.c
|
||||
F: drivers/media/i2c/smiapp-pll.h
|
||||
F: include/uapi/linux/smiapp.h
|
||||
@ -15530,6 +15542,14 @@ S: Maintained
|
||||
F: drivers/media/i2c/imx214.c
|
||||
F: Documentation/devicetree/bindings/media/i2c/sony,imx214.txt
|
||||
|
||||
SONY IMX219 SENSOR DRIVER
|
||||
M: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/imx219.c
|
||||
F: Documentation/devicetree/bindings/media/i2c/imx219.yaml
|
||||
|
||||
SONY IMX258 SENSOR DRIVER
|
||||
M: Sakari Ailus <sakari.ailus@linux.intel.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
@ -16763,12 +16783,12 @@ F: sound/soc/codecs/twl4030*
|
||||
TI VPE/CAL DRIVERS
|
||||
M: Benoit Parrot <bparrot@ti.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
W: http://linuxtv.org/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
S: Maintained
|
||||
F: drivers/media/platform/ti-vpe/
|
||||
F: Documentation/devicetree/bindings/media/ti,vpe.yaml
|
||||
F: Documentation/devicetree/bindings/media/ti,cal.yaml
|
||||
F: Documentation/devicetree/bindings/media/ti,vpe.yaml
|
||||
F: drivers/media/platform/ti-vpe/
|
||||
|
||||
TI WILINK WIRELESS DRIVERS
|
||||
L: linux-wireless@vger.kernel.org
|
||||
@ -17460,7 +17480,7 @@ L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: https://linuxtv.org
|
||||
S: Odd Fixes
|
||||
F: drivers/media/usb/usbvision/
|
||||
F: drivers/staging/media/usbvision/
|
||||
|
||||
USB WEBCAM GADGET
|
||||
M: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
|
@ -76,3 +76,7 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&ir {
|
||||
linux,rc-map-name = "rc-videostrong-kii-pro";
|
||||
};
|
||||
|
@ -566,6 +566,7 @@ const char *fwnode_get_name(const struct fwnode_handle *fwnode)
|
||||
{
|
||||
return fwnode_call_ptr_op(fwnode, get_name);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fwnode_get_name);
|
||||
|
||||
/**
|
||||
* fwnode_get_name_prefix - Return the prefix of node for printing purposes
|
||||
|
@ -23,7 +23,7 @@ struct cec_notifier {
|
||||
struct kref kref;
|
||||
struct device *hdmi_dev;
|
||||
struct cec_connector_info conn_info;
|
||||
const char *conn_name;
|
||||
const char *port_name;
|
||||
struct cec_adapter *cec_adap;
|
||||
|
||||
u16 phys_addr;
|
||||
@ -32,16 +32,30 @@ struct cec_notifier {
|
||||
static LIST_HEAD(cec_notifiers);
|
||||
static DEFINE_MUTEX(cec_notifiers_lock);
|
||||
|
||||
struct cec_notifier *
|
||||
cec_notifier_get_conn(struct device *hdmi_dev, const char *conn_name)
|
||||
/**
|
||||
* cec_notifier_get_conn - find or create a new cec_notifier for the given
|
||||
* device and connector tuple.
|
||||
* @hdmi_dev: device that sends the events.
|
||||
* @port_name: the connector name from which the event occurs
|
||||
*
|
||||
* If a notifier for device @dev already exists, then increase the refcount
|
||||
* and return that notifier.
|
||||
*
|
||||
* If it doesn't exist, then allocate a new notifier struct and return a
|
||||
* pointer to that new struct.
|
||||
*
|
||||
* Return NULL if the memory could not be allocated.
|
||||
*/
|
||||
static struct cec_notifier *
|
||||
cec_notifier_get_conn(struct device *hdmi_dev, const char *port_name)
|
||||
{
|
||||
struct cec_notifier *n;
|
||||
|
||||
mutex_lock(&cec_notifiers_lock);
|
||||
list_for_each_entry(n, &cec_notifiers, head) {
|
||||
if (n->hdmi_dev == hdmi_dev &&
|
||||
(!conn_name ||
|
||||
(n->conn_name && !strcmp(n->conn_name, conn_name)))) {
|
||||
(!port_name ||
|
||||
(n->port_name && !strcmp(n->port_name, port_name)))) {
|
||||
kref_get(&n->kref);
|
||||
mutex_unlock(&cec_notifiers_lock);
|
||||
return n;
|
||||
@ -51,9 +65,9 @@ cec_notifier_get_conn(struct device *hdmi_dev, const char *conn_name)
|
||||
if (!n)
|
||||
goto unlock;
|
||||
n->hdmi_dev = hdmi_dev;
|
||||
if (conn_name) {
|
||||
n->conn_name = kstrdup(conn_name, GFP_KERNEL);
|
||||
if (!n->conn_name) {
|
||||
if (port_name) {
|
||||
n->port_name = kstrdup(port_name, GFP_KERNEL);
|
||||
if (!n->port_name) {
|
||||
kfree(n);
|
||||
n = NULL;
|
||||
goto unlock;
|
||||
@ -68,7 +82,6 @@ unlock:
|
||||
mutex_unlock(&cec_notifiers_lock);
|
||||
return n;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cec_notifier_get_conn);
|
||||
|
||||
static void cec_notifier_release(struct kref *kref)
|
||||
{
|
||||
@ -76,7 +89,7 @@ static void cec_notifier_release(struct kref *kref)
|
||||
container_of(kref, struct cec_notifier, kref);
|
||||
|
||||
list_del(&n->head);
|
||||
kfree(n->conn_name);
|
||||
kfree(n->port_name);
|
||||
kfree(n);
|
||||
}
|
||||
|
||||
@ -88,10 +101,10 @@ static void cec_notifier_put(struct cec_notifier *n)
|
||||
}
|
||||
|
||||
struct cec_notifier *
|
||||
cec_notifier_conn_register(struct device *hdmi_dev, const char *conn_name,
|
||||
cec_notifier_conn_register(struct device *hdmi_dev, const char *port_name,
|
||||
const struct cec_connector_info *conn_info)
|
||||
{
|
||||
struct cec_notifier *n = cec_notifier_get_conn(hdmi_dev, conn_name);
|
||||
struct cec_notifier *n = cec_notifier_get_conn(hdmi_dev, port_name);
|
||||
|
||||
if (!n)
|
||||
return n;
|
||||
@ -129,7 +142,7 @@ void cec_notifier_conn_unregister(struct cec_notifier *n)
|
||||
EXPORT_SYMBOL_GPL(cec_notifier_conn_unregister);
|
||||
|
||||
struct cec_notifier *
|
||||
cec_notifier_cec_adap_register(struct device *hdmi_dev, const char *conn_name,
|
||||
cec_notifier_cec_adap_register(struct device *hdmi_dev, const char *port_name,
|
||||
struct cec_adapter *adap)
|
||||
{
|
||||
struct cec_notifier *n;
|
||||
@ -137,7 +150,7 @@ cec_notifier_cec_adap_register(struct device *hdmi_dev, const char *conn_name,
|
||||
if (WARN_ON(!adap))
|
||||
return NULL;
|
||||
|
||||
n = cec_notifier_get_conn(hdmi_dev, conn_name);
|
||||
n = cec_notifier_get_conn(hdmi_dev, port_name);
|
||||
if (!n)
|
||||
return n;
|
||||
|
||||
|
@ -97,8 +97,6 @@ void saa7146_buffer_finish(struct saa7146_dev *dev,
|
||||
DEB_EE("dev:%p, dmaq:%p, state:%d\n", dev, q, state);
|
||||
DEB_EE("q->curr:%p\n", q->curr);
|
||||
|
||||
BUG_ON(!q->curr);
|
||||
|
||||
/* finish current buffer */
|
||||
if (NULL == q->curr) {
|
||||
DEB_D("aiii. no current buffer\n");
|
||||
@ -296,7 +294,7 @@ static int fops_mmap(struct file *file, struct vm_area_struct * vma)
|
||||
int res;
|
||||
|
||||
switch (vdev->vfl_type) {
|
||||
case VFL_TYPE_GRABBER: {
|
||||
case VFL_TYPE_VIDEO: {
|
||||
DEB_EE("V4L2_BUF_TYPE_VIDEO_CAPTURE: file:%p, vma:%p\n",
|
||||
file, vma);
|
||||
q = &fh->video_q;
|
||||
@ -378,7 +376,7 @@ static ssize_t fops_read(struct file *file, char __user *data, size_t count, lof
|
||||
int ret;
|
||||
|
||||
switch (vdev->vfl_type) {
|
||||
case VFL_TYPE_GRABBER:
|
||||
case VFL_TYPE_VIDEO:
|
||||
/*
|
||||
DEB_EE("V4L2_BUF_TYPE_VIDEO_CAPTURE: file:%p, data:%p, count:%lun",
|
||||
file, data, (unsigned long)count);
|
||||
@ -409,7 +407,7 @@ static ssize_t fops_write(struct file *file, const char __user *data, size_t cou
|
||||
int ret;
|
||||
|
||||
switch (vdev->vfl_type) {
|
||||
case VFL_TYPE_GRABBER:
|
||||
case VFL_TYPE_VIDEO:
|
||||
return -EINVAL;
|
||||
case VFL_TYPE_VBI:
|
||||
if (fh->dev->ext_vv_data->vbi_fops.write) {
|
||||
@ -597,7 +595,7 @@ int saa7146_register_device(struct video_device *vfd, struct saa7146_dev *dev,
|
||||
DEB_EE("dev:%p, name:'%s', type:%d\n", dev, name, type);
|
||||
|
||||
vfd->fops = &video_fops;
|
||||
if (type == VFL_TYPE_GRABBER)
|
||||
if (type == VFL_TYPE_VIDEO)
|
||||
vfd->ioctl_ops = &dev->ext_vv_data->vid_ops;
|
||||
else
|
||||
vfd->ioctl_ops = &dev->ext_vv_data->vbi_ops;
|
||||
@ -611,7 +609,7 @@ int saa7146_register_device(struct video_device *vfd, struct saa7146_dev *dev,
|
||||
vfd->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OVERLAY |
|
||||
V4L2_CAP_READWRITE | V4L2_CAP_STREAMING;
|
||||
vfd->device_caps |= dev->ext_vv_data->capabilities;
|
||||
if (type == VFL_TYPE_GRABBER)
|
||||
if (type == VFL_TYPE_VIDEO)
|
||||
vfd->device_caps &=
|
||||
~(V4L2_CAP_VBI_CAPTURE | V4L2_CAP_SLICED_VBI_OUTPUT);
|
||||
else
|
||||
|
@ -45,88 +45,88 @@ static void smsdvb_print_dvb_stats(struct smsdvb_debugfs *debug_data,
|
||||
|
||||
buf = debug_data->stats_data;
|
||||
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"is_rf_locked = %d\n", p->is_rf_locked);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"is_demod_locked = %d\n", p->is_demod_locked);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"is_external_lna_on = %d\n", p->is_external_lna_on);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"SNR = %d\n", p->SNR);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"ber = %d\n", p->ber);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"FIB_CRC = %d\n", p->FIB_CRC);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"ts_per = %d\n", p->ts_per);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"MFER = %d\n", p->MFER);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"RSSI = %d\n", p->RSSI);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"in_band_pwr = %d\n", p->in_band_pwr);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"carrier_offset = %d\n", p->carrier_offset);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"modem_state = %d\n", p->modem_state);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"frequency = %d\n", p->frequency);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"bandwidth = %d\n", p->bandwidth);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"transmission_mode = %d\n", p->transmission_mode);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"modem_state = %d\n", p->modem_state);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"guard_interval = %d\n", p->guard_interval);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"code_rate = %d\n", p->code_rate);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"lp_code_rate = %d\n", p->lp_code_rate);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"hierarchy = %d\n", p->hierarchy);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"constellation = %d\n", p->constellation);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"burst_size = %d\n", p->burst_size);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"burst_duration = %d\n", p->burst_duration);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"burst_cycle_time = %d\n", p->burst_cycle_time);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"calc_burst_cycle_time = %d\n",
|
||||
p->calc_burst_cycle_time);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"num_of_rows = %d\n", p->num_of_rows);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"num_of_padd_cols = %d\n", p->num_of_padd_cols);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"num_of_punct_cols = %d\n", p->num_of_punct_cols);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"error_ts_packets = %d\n", p->error_ts_packets);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"total_ts_packets = %d\n", p->total_ts_packets);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"num_of_valid_mpe_tlbs = %d\n", p->num_of_valid_mpe_tlbs);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"num_of_invalid_mpe_tlbs = %d\n", p->num_of_invalid_mpe_tlbs);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"num_of_corrected_mpe_tlbs = %d\n", p->num_of_corrected_mpe_tlbs);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"ber_error_count = %d\n", p->ber_error_count);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"ber_bit_count = %d\n", p->ber_bit_count);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"sms_to_host_tx_errors = %d\n", p->sms_to_host_tx_errors);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"pre_ber = %d\n", p->pre_ber);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"cell_id = %d\n", p->cell_id);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"dvbh_srv_ind_hp = %d\n", p->dvbh_srv_ind_hp);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"dvbh_srv_ind_lp = %d\n", p->dvbh_srv_ind_lp);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"num_mpe_received = %d\n", p->num_mpe_received);
|
||||
|
||||
debug_data->stats_count = n;
|
||||
@ -148,42 +148,42 @@ static void smsdvb_print_isdb_stats(struct smsdvb_debugfs *debug_data,
|
||||
|
||||
buf = debug_data->stats_data;
|
||||
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"statistics_type = %d\t", p->statistics_type);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"full_size = %d\n", p->full_size);
|
||||
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"is_rf_locked = %d\t\t", p->is_rf_locked);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"is_demod_locked = %d\t", p->is_demod_locked);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"is_external_lna_on = %d\n", p->is_external_lna_on);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"SNR = %d dB\t\t", p->SNR);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"RSSI = %d dBm\t\t", p->RSSI);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"in_band_pwr = %d dBm\n", p->in_band_pwr);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"carrier_offset = %d\t", p->carrier_offset);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"bandwidth = %d\t\t", p->bandwidth);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"frequency = %d Hz\n", p->frequency);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"transmission_mode = %d\t", p->transmission_mode);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"modem_state = %d\t\t", p->modem_state);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"guard_interval = %d\n", p->guard_interval);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"system_type = %d\t\t", p->system_type);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"partial_reception = %d\t", p->partial_reception);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"num_of_layers = %d\n", p->num_of_layers);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"sms_to_host_tx_errors = %d\n", p->sms_to_host_tx_errors);
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
@ -191,31 +191,34 @@ static void smsdvb_print_isdb_stats(struct smsdvb_debugfs *debug_data,
|
||||
p->layer_info[i].number_of_segments > 13)
|
||||
continue;
|
||||
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "\nLayer %d\n", i);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "\tcode_rate = %d\t",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "\nLayer %d\n", i);
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "\tcode_rate = %d\t",
|
||||
p->layer_info[i].code_rate);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "constellation = %d\n",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "constellation = %d\n",
|
||||
p->layer_info[i].constellation);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "\tber = %-5d\t",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "\tber = %-5d\t",
|
||||
p->layer_info[i].ber);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "\tber_error_count = %-5d\t",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"\tber_error_count = %-5d\t",
|
||||
p->layer_info[i].ber_error_count);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "ber_bit_count = %-5d\n",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "ber_bit_count = %-5d\n",
|
||||
p->layer_info[i].ber_bit_count);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "\tpre_ber = %-5d\t",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "\tpre_ber = %-5d\t",
|
||||
p->layer_info[i].pre_ber);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "\tts_per = %-5d\n",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "\tts_per = %-5d\n",
|
||||
p->layer_info[i].ts_per);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "\terror_ts_packets = %-5d\t",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"\terror_ts_packets = %-5d\t",
|
||||
p->layer_info[i].error_ts_packets);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "total_ts_packets = %-5d\t",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"total_ts_packets = %-5d\t",
|
||||
p->layer_info[i].total_ts_packets);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "ti_ldepth_i = %d\n",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "ti_ldepth_i = %d\n",
|
||||
p->layer_info[i].ti_ldepth_i);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"\tnumber_of_segments = %d\t",
|
||||
p->layer_info[i].number_of_segments);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "tmcc_errors = %d\n",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "tmcc_errors = %d\n",
|
||||
p->layer_info[i].tmcc_errors);
|
||||
}
|
||||
|
||||
@ -238,44 +241,44 @@ static void smsdvb_print_isdb_stats_ex(struct smsdvb_debugfs *debug_data,
|
||||
|
||||
buf = debug_data->stats_data;
|
||||
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"statistics_type = %d\t", p->statistics_type);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"full_size = %d\n", p->full_size);
|
||||
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"is_rf_locked = %d\t\t", p->is_rf_locked);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"is_demod_locked = %d\t", p->is_demod_locked);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"is_external_lna_on = %d\n", p->is_external_lna_on);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"SNR = %d dB\t\t", p->SNR);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"RSSI = %d dBm\t\t", p->RSSI);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"in_band_pwr = %d dBm\n", p->in_band_pwr);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"carrier_offset = %d\t", p->carrier_offset);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"bandwidth = %d\t\t", p->bandwidth);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"frequency = %d Hz\n", p->frequency);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"transmission_mode = %d\t", p->transmission_mode);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"modem_state = %d\t\t", p->modem_state);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"guard_interval = %d\n", p->guard_interval);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"system_type = %d\t\t", p->system_type);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"partial_reception = %d\t", p->partial_reception);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"num_of_layers = %d\n", p->num_of_layers);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "segment_number = %d\t",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "segment_number = %d\t",
|
||||
p->segment_number);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "tune_bw = %d\n",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "tune_bw = %d\n",
|
||||
p->tune_bw);
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
@ -283,31 +286,34 @@ static void smsdvb_print_isdb_stats_ex(struct smsdvb_debugfs *debug_data,
|
||||
p->layer_info[i].number_of_segments > 13)
|
||||
continue;
|
||||
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "\nLayer %d\n", i);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "\tcode_rate = %d\t",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "\nLayer %d\n", i);
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "\tcode_rate = %d\t",
|
||||
p->layer_info[i].code_rate);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "constellation = %d\n",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "constellation = %d\n",
|
||||
p->layer_info[i].constellation);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "\tber = %-5d\t",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "\tber = %-5d\t",
|
||||
p->layer_info[i].ber);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "\tber_error_count = %-5d\t",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"\tber_error_count = %-5d\t",
|
||||
p->layer_info[i].ber_error_count);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "ber_bit_count = %-5d\n",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "ber_bit_count = %-5d\n",
|
||||
p->layer_info[i].ber_bit_count);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "\tpre_ber = %-5d\t",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "\tpre_ber = %-5d\t",
|
||||
p->layer_info[i].pre_ber);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "\tts_per = %-5d\n",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "\tts_per = %-5d\n",
|
||||
p->layer_info[i].ts_per);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "\terror_ts_packets = %-5d\t",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"\terror_ts_packets = %-5d\t",
|
||||
p->layer_info[i].error_ts_packets);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "total_ts_packets = %-5d\t",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"total_ts_packets = %-5d\t",
|
||||
p->layer_info[i].total_ts_packets);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "ti_ldepth_i = %d\n",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "ti_ldepth_i = %d\n",
|
||||
p->layer_info[i].ti_ldepth_i);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n,
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n,
|
||||
"\tnumber_of_segments = %d\t",
|
||||
p->layer_info[i].number_of_segments);
|
||||
n += snprintf(&buf[n], PAGE_SIZE - n, "tmcc_errors = %d\n",
|
||||
n += scnprintf(&buf[n], PAGE_SIZE - n, "tmcc_errors = %d\n",
|
||||
p->layer_info[i].tmcc_errors);
|
||||
}
|
||||
|
||||
|
@ -393,7 +393,7 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory,
|
||||
}
|
||||
}
|
||||
|
||||
dprintk(1, "allocated %d buffers, %d plane(s) each\n",
|
||||
dprintk(3, "allocated %d buffers, %d plane(s) each\n",
|
||||
buffer, num_planes);
|
||||
|
||||
return buffer;
|
||||
|
@ -593,7 +593,7 @@ static int vb2_dc_map_dmabuf(void *mem_priv)
|
||||
/* checking if dmabuf is big enough to store contiguous chunk */
|
||||
contig_size = vb2_dc_get_contiguous_size(sgt);
|
||||
if (contig_size < buf->size) {
|
||||
pr_err("contiguous chunk is too small %lu/%lu b\n",
|
||||
pr_err("contiguous chunk is too small %lu/%lu\n",
|
||||
contig_size, buf->size);
|
||||
dma_buf_unmap_attachment(buf->db_attach, sgt, buf->dma_dir);
|
||||
return -EFAULT;
|
||||
|
@ -2182,7 +2182,7 @@ int drxj_dap_atomic_read_reg32(struct i2c_device_addr *dev_addr,
|
||||
u32 *data, u32 flags)
|
||||
{
|
||||
u8 buf[sizeof(*data)] = { 0 };
|
||||
int rc = -EIO;
|
||||
int rc;
|
||||
u32 word = 0;
|
||||
|
||||
if (!data)
|
||||
@ -4229,7 +4229,7 @@ int drxj_dap_scu_atomic_write_reg16(struct i2c_device_addr *dev_addr,
|
||||
u16 data, u32 flags)
|
||||
{
|
||||
u8 buf[2];
|
||||
int rc = -EIO;
|
||||
int rc;
|
||||
|
||||
buf[0] = (u8) (data & 0xff);
|
||||
buf[1] = (u8) ((data >> 8) & 0xff);
|
||||
|
@ -64,6 +64,92 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* m88ds3103b demod has an internal device related to clocking. First the i2c
|
||||
* gate must be opened, for one transaction, then writes will be allowed.
|
||||
*/
|
||||
static int m88ds3103b_dt_write(struct m88ds3103_dev *dev, int reg, int data)
|
||||
{
|
||||
struct i2c_client *client = dev->client;
|
||||
u8 buf[] = {reg, data};
|
||||
u8 val;
|
||||
int ret;
|
||||
struct i2c_msg msg = {
|
||||
.addr = dev->dt_addr, .flags = 0, .buf = buf, .len = 2
|
||||
};
|
||||
|
||||
m88ds3103_update_bits(dev, 0x11, 0x01, 0x00);
|
||||
|
||||
val = 0x11;
|
||||
ret = regmap_write(dev->regmap, 0x03, val);
|
||||
if (ret)
|
||||
dev_dbg(&client->dev, "fail=%d\n", ret);
|
||||
|
||||
ret = i2c_transfer(dev->dt_client->adapter, &msg, 1);
|
||||
if (ret != 1) {
|
||||
dev_err(&client->dev, "0x%02x (ret=%i, reg=0x%02x, value=0x%02x)\n",
|
||||
dev->dt_addr, ret, reg, data);
|
||||
|
||||
m88ds3103_update_bits(dev, 0x11, 0x01, 0x01);
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
m88ds3103_update_bits(dev, 0x11, 0x01, 0x01);
|
||||
|
||||
dev_dbg(&client->dev, "0x%02x reg 0x%02x, value 0x%02x\n",
|
||||
dev->dt_addr, reg, data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* m88ds3103b demod has an internal device related to clocking. First the i2c
|
||||
* gate must be opened, for two transactions, then reads will be allowed.
|
||||
*/
|
||||
static int m88ds3103b_dt_read(struct m88ds3103_dev *dev, u8 reg)
|
||||
{
|
||||
struct i2c_client *client = dev->client;
|
||||
int ret;
|
||||
u8 val;
|
||||
u8 b0[] = { reg };
|
||||
u8 b1[] = { 0 };
|
||||
struct i2c_msg msg[] = {
|
||||
{
|
||||
.addr = dev->dt_addr,
|
||||
.flags = 0,
|
||||
.buf = b0,
|
||||
.len = 1
|
||||
},
|
||||
{
|
||||
.addr = dev->dt_addr,
|
||||
.flags = I2C_M_RD,
|
||||
.buf = b1,
|
||||
.len = 1
|
||||
}
|
||||
};
|
||||
|
||||
m88ds3103_update_bits(dev, 0x11, 0x01, 0x00);
|
||||
|
||||
val = 0x12;
|
||||
ret = regmap_write(dev->regmap, 0x03, val);
|
||||
if (ret)
|
||||
dev_dbg(&client->dev, "fail=%d\n", ret);
|
||||
|
||||
ret = i2c_transfer(dev->dt_client->adapter, msg, 2);
|
||||
if (ret != 2) {
|
||||
dev_err(&client->dev, "0x%02x (ret=%d, reg=0x%02x)\n",
|
||||
dev->dt_addr, ret, reg);
|
||||
|
||||
m88ds3103_update_bits(dev, 0x11, 0x01, 0x01);
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
m88ds3103_update_bits(dev, 0x11, 0x01, 0x01);
|
||||
|
||||
dev_dbg(&client->dev, "0x%02x reg 0x%02x, value 0x%02x\n",
|
||||
dev->dt_addr, reg, b1[0]);
|
||||
|
||||
return b1[0];
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the demodulator AGC PWM voltage setting supplied to the tuner.
|
||||
*/
|
||||
@ -288,6 +374,251 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int m88ds3103b_select_mclk(struct m88ds3103_dev *dev)
|
||||
{
|
||||
struct i2c_client *client = dev->client;
|
||||
struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
|
||||
u32 adc_Freq_MHz[3] = {96, 93, 99};
|
||||
u8 reg16_list[3] = {96, 92, 100}, reg16, reg15;
|
||||
u32 offset_MHz[3];
|
||||
u32 max_offset = 0;
|
||||
u32 old_setting = dev->mclk;
|
||||
u32 tuner_freq_MHz = c->frequency / 1000;
|
||||
u8 i;
|
||||
char big_symbol = 0;
|
||||
|
||||
big_symbol = (c->symbol_rate > 45010000) ? 1 : 0;
|
||||
|
||||
if (big_symbol) {
|
||||
reg16 = 115;
|
||||
} else {
|
||||
reg16 = 96;
|
||||
|
||||
/* TODO: IS THIS NECESSARY ? */
|
||||
for (i = 0; i < 3; i++) {
|
||||
offset_MHz[i] = tuner_freq_MHz % adc_Freq_MHz[i];
|
||||
|
||||
if (offset_MHz[i] > (adc_Freq_MHz[i] / 2))
|
||||
offset_MHz[i] = adc_Freq_MHz[i] - offset_MHz[i];
|
||||
|
||||
if (offset_MHz[i] > max_offset) {
|
||||
max_offset = offset_MHz[i];
|
||||
reg16 = reg16_list[i];
|
||||
dev->mclk = adc_Freq_MHz[i] * 1000 * 1000;
|
||||
|
||||
if (big_symbol)
|
||||
dev->mclk /= 2;
|
||||
|
||||
dev_dbg(&client->dev, "modifying mclk %u -> %u\n",
|
||||
old_setting, dev->mclk);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (dev->mclk == 93000000)
|
||||
regmap_write(dev->regmap, 0xA0, 0x42);
|
||||
else if (dev->mclk == 96000000)
|
||||
regmap_write(dev->regmap, 0xA0, 0x44);
|
||||
else if (dev->mclk == 99000000)
|
||||
regmap_write(dev->regmap, 0xA0, 0x46);
|
||||
else if (dev->mclk == 110250000)
|
||||
regmap_write(dev->regmap, 0xA0, 0x4E);
|
||||
else
|
||||
regmap_write(dev->regmap, 0xA0, 0x44);
|
||||
|
||||
reg15 = m88ds3103b_dt_read(dev, 0x15);
|
||||
|
||||
m88ds3103b_dt_write(dev, 0x05, 0x40);
|
||||
m88ds3103b_dt_write(dev, 0x11, 0x08);
|
||||
|
||||
if (big_symbol)
|
||||
reg15 |= 0x02;
|
||||
else
|
||||
reg15 &= ~0x02;
|
||||
|
||||
m88ds3103b_dt_write(dev, 0x15, reg15);
|
||||
m88ds3103b_dt_write(dev, 0x16, reg16);
|
||||
|
||||
usleep_range(5000, 5500);
|
||||
|
||||
m88ds3103b_dt_write(dev, 0x05, 0x00);
|
||||
m88ds3103b_dt_write(dev, 0x11, (u8)(big_symbol ? 0x0E : 0x0A));
|
||||
|
||||
usleep_range(5000, 5500);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int m88ds3103b_set_mclk(struct m88ds3103_dev *dev, u32 mclk_khz)
|
||||
{
|
||||
u8 reg11 = 0x0A, reg15, reg16, reg1D, reg1E, reg1F, tmp;
|
||||
u8 sm, f0 = 0, f1 = 0, f2 = 0, f3 = 0;
|
||||
u16 pll_div_fb, N;
|
||||
u32 div;
|
||||
|
||||
reg15 = m88ds3103b_dt_read(dev, 0x15);
|
||||
reg16 = m88ds3103b_dt_read(dev, 0x16);
|
||||
reg1D = m88ds3103b_dt_read(dev, 0x1D);
|
||||
|
||||
if (dev->cfg->ts_mode != M88DS3103_TS_SERIAL) {
|
||||
if (reg16 == 92)
|
||||
tmp = 93;
|
||||
else if (reg16 == 100)
|
||||
tmp = 99;
|
||||
else
|
||||
tmp = 96;
|
||||
|
||||
mclk_khz *= tmp;
|
||||
mclk_khz /= 96;
|
||||
}
|
||||
|
||||
pll_div_fb = (reg15 & 0x01) << 8;
|
||||
pll_div_fb += reg16;
|
||||
pll_div_fb += 32;
|
||||
|
||||
div = 9000 * pll_div_fb * 4;
|
||||
div /= mclk_khz;
|
||||
|
||||
if (dev->cfg->ts_mode == M88DS3103_TS_SERIAL) {
|
||||
reg11 |= 0x02;
|
||||
|
||||
if (div <= 32) {
|
||||
N = 2;
|
||||
|
||||
f0 = 0;
|
||||
f1 = div / N;
|
||||
f2 = div - f1;
|
||||
f3 = 0;
|
||||
} else if (div <= 34) {
|
||||
N = 3;
|
||||
|
||||
f0 = div / N;
|
||||
f1 = (div - f0) / (N - 1);
|
||||
f2 = div - f0 - f1;
|
||||
f3 = 0;
|
||||
} else if (div <= 64) {
|
||||
N = 4;
|
||||
|
||||
f0 = div / N;
|
||||
f1 = (div - f0) / (N - 1);
|
||||
f2 = (div - f0 - f1) / (N - 2);
|
||||
f3 = div - f0 - f1 - f2;
|
||||
} else {
|
||||
N = 4;
|
||||
|
||||
f0 = 16;
|
||||
f1 = 16;
|
||||
f2 = 16;
|
||||
f3 = 16;
|
||||
}
|
||||
|
||||
if (f0 == 16)
|
||||
f0 = 0;
|
||||
else if ((f0 < 8) && (f0 != 0))
|
||||
f0 = 8;
|
||||
|
||||
if (f1 == 16)
|
||||
f1 = 0;
|
||||
else if ((f1 < 8) && (f1 != 0))
|
||||
f1 = 8;
|
||||
|
||||
if (f2 == 16)
|
||||
f2 = 0;
|
||||
else if ((f2 < 8) && (f2 != 0))
|
||||
f2 = 8;
|
||||
|
||||
if (f3 == 16)
|
||||
f3 = 0;
|
||||
else if ((f3 < 8) && (f3 != 0))
|
||||
f3 = 8;
|
||||
} else {
|
||||
reg11 &= ~0x02;
|
||||
|
||||
if (div <= 32) {
|
||||
N = 2;
|
||||
|
||||
f0 = 0;
|
||||
f1 = div / N;
|
||||
f2 = div - f1;
|
||||
f3 = 0;
|
||||
} else if (div <= 48) {
|
||||
N = 3;
|
||||
|
||||
f0 = div / N;
|
||||
f1 = (div - f0) / (N - 1);
|
||||
f2 = div - f0 - f1;
|
||||
f3 = 0;
|
||||
} else if (div <= 64) {
|
||||
N = 4;
|
||||
|
||||
f0 = div / N;
|
||||
f1 = (div - f0) / (N - 1);
|
||||
f2 = (div - f0 - f1) / (N - 2);
|
||||
f3 = div - f0 - f1 - f2;
|
||||
} else {
|
||||
N = 4;
|
||||
|
||||
f0 = 16;
|
||||
f1 = 16;
|
||||
f2 = 16;
|
||||
f3 = 16;
|
||||
}
|
||||
|
||||
if (f0 == 16)
|
||||
f0 = 0;
|
||||
else if ((f0 < 9) && (f0 != 0))
|
||||
f0 = 9;
|
||||
|
||||
if (f1 == 16)
|
||||
f1 = 0;
|
||||
else if ((f1 < 9) && (f1 != 0))
|
||||
f1 = 9;
|
||||
|
||||
if (f2 == 16)
|
||||
f2 = 0;
|
||||
else if ((f2 < 9) && (f2 != 0))
|
||||
f2 = 9;
|
||||
|
||||
if (f3 == 16)
|
||||
f3 = 0;
|
||||
else if ((f3 < 9) && (f3 != 0))
|
||||
f3 = 9;
|
||||
}
|
||||
|
||||
sm = N - 1;
|
||||
|
||||
/* Write to registers */
|
||||
//reg15 &= 0x01;
|
||||
//reg15 |= (pll_div_fb >> 8) & 0x01;
|
||||
|
||||
//reg16 = pll_div_fb & 0xFF;
|
||||
|
||||
reg1D &= ~0x03;
|
||||
reg1D |= sm;
|
||||
reg1D |= 0x80;
|
||||
|
||||
reg1E = ((f3 << 4) + f2) & 0xFF;
|
||||
reg1F = ((f1 << 4) + f0) & 0xFF;
|
||||
|
||||
m88ds3103b_dt_write(dev, 0x05, 0x40);
|
||||
m88ds3103b_dt_write(dev, 0x11, 0x08);
|
||||
m88ds3103b_dt_write(dev, 0x1D, reg1D);
|
||||
m88ds3103b_dt_write(dev, 0x1E, reg1E);
|
||||
m88ds3103b_dt_write(dev, 0x1F, reg1F);
|
||||
|
||||
m88ds3103b_dt_write(dev, 0x17, 0xc1);
|
||||
m88ds3103b_dt_write(dev, 0x17, 0x81);
|
||||
|
||||
usleep_range(5000, 5500);
|
||||
|
||||
m88ds3103b_dt_write(dev, 0x05, 0x00);
|
||||
m88ds3103b_dt_write(dev, 0x11, 0x0A);
|
||||
|
||||
usleep_range(5000, 5500);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
||||
{
|
||||
struct m88ds3103_dev *dev = fe->demodulator_priv;
|
||||
@ -298,7 +629,7 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
||||
u8 u8tmp, u8tmp1 = 0, u8tmp2 = 0; /* silence compiler warning */
|
||||
u8 buf[3];
|
||||
u16 u16tmp;
|
||||
u32 tuner_frequency_khz, target_mclk;
|
||||
u32 tuner_frequency_khz, target_mclk, u32tmp;
|
||||
s32 s32tmp;
|
||||
static const struct reg_sequence reset_buf[] = {
|
||||
{0x07, 0x80}, {0x07, 0x00}
|
||||
@ -321,6 +652,20 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
||||
|
||||
/* Disable demod clock path */
|
||||
if (dev->chip_id == M88RS6000_CHIP_ID) {
|
||||
if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) {
|
||||
ret = regmap_read(dev->regmap, 0xb2, &u32tmp);
|
||||
if (ret)
|
||||
goto err;
|
||||
if (u32tmp == 0x01) {
|
||||
ret = regmap_write(dev->regmap, 0x00, 0x00);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap, 0xb2, 0x00);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
ret = regmap_write(dev->regmap, 0x06, 0xe0);
|
||||
if (ret)
|
||||
goto err;
|
||||
@ -346,7 +691,7 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
||||
tuner_frequency_khz = c->frequency;
|
||||
}
|
||||
|
||||
/* select M88RS6000 demod main mclk and ts mclk from tuner die. */
|
||||
/* set M88RS6000/DS3103B demod main mclk and ts mclk from tuner die */
|
||||
if (dev->chip_id == M88RS6000_CHIP_ID) {
|
||||
if (c->symbol_rate > 45010000)
|
||||
dev->mclk = 110250000;
|
||||
@ -358,6 +703,11 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
||||
else
|
||||
target_mclk = 144000000;
|
||||
|
||||
if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) {
|
||||
m88ds3103b_select_mclk(dev);
|
||||
m88ds3103b_set_mclk(dev, target_mclk / 1000);
|
||||
}
|
||||
|
||||
/* Enable demod clock path */
|
||||
ret = regmap_write(dev->regmap, 0x06, 0x00);
|
||||
if (ret)
|
||||
@ -469,13 +819,43 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
||||
ret = m88ds3103_update_bits(dev, 0x9d, 0x08, 0x08);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) {
|
||||
buf[0] = m88ds3103b_dt_read(dev, 0x15);
|
||||
buf[1] = m88ds3103b_dt_read(dev, 0x16);
|
||||
|
||||
if (c->symbol_rate > 45010000) {
|
||||
buf[0] &= ~0x03;
|
||||
buf[0] |= 0x02;
|
||||
buf[0] |= ((147 - 32) >> 8) & 0x01;
|
||||
buf[1] = (147 - 32) & 0xFF;
|
||||
|
||||
dev->mclk = 110250 * 1000;
|
||||
} else {
|
||||
buf[0] &= ~0x03;
|
||||
buf[0] |= ((128 - 32) >> 8) & 0x01;
|
||||
buf[1] = (128 - 32) & 0xFF;
|
||||
|
||||
dev->mclk = 96000 * 1000;
|
||||
}
|
||||
m88ds3103b_dt_write(dev, 0x15, buf[0]);
|
||||
m88ds3103b_dt_write(dev, 0x16, buf[1]);
|
||||
|
||||
regmap_read(dev->regmap, 0x30, &u32tmp);
|
||||
u32tmp &= ~0x80;
|
||||
regmap_write(dev->regmap, 0x30, u32tmp & 0xff);
|
||||
}
|
||||
|
||||
ret = regmap_write(dev->regmap, 0xf1, 0x01);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
if (dev->chiptype != M88DS3103_CHIPTYPE_3103B) {
|
||||
ret = m88ds3103_update_bits(dev, 0x30, 0x80, 0x80);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
switch (dev->cfg->ts_mode) {
|
||||
case M88DS3103_TS_SERIAL:
|
||||
@ -488,6 +868,10 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
||||
break;
|
||||
case M88DS3103_TS_PARALLEL:
|
||||
u8tmp = 0x02;
|
||||
if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) {
|
||||
u8tmp = 0x01;
|
||||
u8tmp1 = 0x01;
|
||||
}
|
||||
break;
|
||||
case M88DS3103_TS_CI:
|
||||
u8tmp = 0x03;
|
||||
@ -516,6 +900,13 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
||||
u8tmp1 = 0x3f;
|
||||
u8tmp2 = 0x3f;
|
||||
break;
|
||||
case M88DS3103_TS_PARALLEL:
|
||||
if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) {
|
||||
ret = m88ds3103_update_bits(dev, 0x29, 0x01, u8tmp1);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
/* fall through */
|
||||
default:
|
||||
u16tmp = DIV_ROUND_UP(target_mclk, dev->cfg->ts_clk);
|
||||
u8tmp1 = u16tmp / 2 - 1;
|
||||
@ -543,6 +934,9 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
||||
else
|
||||
u8tmp = 0x06;
|
||||
|
||||
if (dev->chiptype == M88DS3103_CHIPTYPE_3103B)
|
||||
m88ds3103b_set_mclk(dev, target_mclk / 1000);
|
||||
|
||||
ret = regmap_write(dev->regmap, 0xc3, 0x08);
|
||||
if (ret)
|
||||
goto err;
|
||||
@ -578,6 +972,16 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) {
|
||||
/* enable/disable 192M LDPC clock */
|
||||
ret = m88ds3103_update_bits(dev, 0x29, 0x10,
|
||||
(c->delivery_system == SYS_DVBS) ? 0x10 : 0x0);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = m88ds3103_update_bits(dev, 0xc9, 0x08, 0x08);
|
||||
}
|
||||
|
||||
dev_dbg(&client->dev, "carrier offset=%d\n",
|
||||
(tuner_frequency_khz - c->frequency));
|
||||
|
||||
@ -642,7 +1046,7 @@ static int m88ds3103_init(struct dvb_frontend *fe)
|
||||
if (utmp)
|
||||
goto warm;
|
||||
|
||||
/* global reset, global diseqc reset, golbal fec reset */
|
||||
/* global reset, global diseqc reset, global fec reset */
|
||||
ret = regmap_write(dev->regmap, 0x07, 0xe0);
|
||||
if (ret)
|
||||
goto err;
|
||||
@ -652,12 +1056,15 @@ static int m88ds3103_init(struct dvb_frontend *fe)
|
||||
|
||||
/* cold state - try to download firmware */
|
||||
dev_info(&client->dev, "found a '%s' in cold state\n",
|
||||
m88ds3103_ops.info.name);
|
||||
dev->fe.ops.info.name);
|
||||
|
||||
if (dev->chip_id == M88RS6000_CHIP_ID)
|
||||
if (dev->chiptype == M88DS3103_CHIPTYPE_3103B)
|
||||
name = M88DS3103B_FIRMWARE;
|
||||
else if (dev->chip_id == M88RS6000_CHIP_ID)
|
||||
name = M88RS6000_FIRMWARE;
|
||||
else
|
||||
name = M88DS3103_FIRMWARE;
|
||||
|
||||
/* request the firmware, this will block and timeout */
|
||||
ret = request_firmware(&firmware, name, &client->dev);
|
||||
if (ret) {
|
||||
@ -700,10 +1107,16 @@ static int m88ds3103_init(struct dvb_frontend *fe)
|
||||
}
|
||||
|
||||
dev_info(&client->dev, "found a '%s' in warm state\n",
|
||||
m88ds3103_ops.info.name);
|
||||
dev->fe.ops.info.name);
|
||||
dev_info(&client->dev, "firmware version: %X.%X\n",
|
||||
(utmp >> 4) & 0xf, (utmp >> 0 & 0xf));
|
||||
|
||||
if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) {
|
||||
m88ds3103b_dt_write(dev, 0x21, 0x92);
|
||||
m88ds3103b_dt_write(dev, 0x15, 0x6C);
|
||||
m88ds3103b_dt_write(dev, 0x17, 0xC1);
|
||||
m88ds3103b_dt_write(dev, 0x17, 0x81);
|
||||
}
|
||||
warm:
|
||||
/* warm state */
|
||||
dev->warm = true;
|
||||
@ -1393,6 +1806,8 @@ static int m88ds3103_probe(struct i2c_client *client,
|
||||
goto err_kfree;
|
||||
|
||||
dev->chip_id = utmp >> 1;
|
||||
dev->chiptype = (u8)id->driver_data;
|
||||
|
||||
dev_dbg(&client->dev, "chip_id=%02x\n", dev->chip_id);
|
||||
|
||||
switch (dev->chip_id) {
|
||||
@ -1459,7 +1874,10 @@ static int m88ds3103_probe(struct i2c_client *client,
|
||||
|
||||
/* create dvb_frontend */
|
||||
memcpy(&dev->fe.ops, &m88ds3103_ops, sizeof(struct dvb_frontend_ops));
|
||||
if (dev->chip_id == M88RS6000_CHIP_ID)
|
||||
if (dev->chiptype == M88DS3103_CHIPTYPE_3103B)
|
||||
strscpy(dev->fe.ops.info.name, "Montage Technology M88DS3103B",
|
||||
sizeof(dev->fe.ops.info.name));
|
||||
else if (dev->chip_id == M88RS6000_CHIP_ID)
|
||||
strscpy(dev->fe.ops.info.name, "Montage Technology M88RS6000",
|
||||
sizeof(dev->fe.ops.info.name));
|
||||
if (!pdata->attach_in_use)
|
||||
@ -1470,6 +1888,26 @@ static int m88ds3103_probe(struct i2c_client *client,
|
||||
/* setup callbacks */
|
||||
pdata->get_dvb_frontend = m88ds3103_get_dvb_frontend;
|
||||
pdata->get_i2c_adapter = m88ds3103_get_i2c_adapter;
|
||||
|
||||
if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) {
|
||||
/* enable i2c repeater for tuner */
|
||||
m88ds3103_update_bits(dev, 0x11, 0x01, 0x01);
|
||||
|
||||
/* get frontend address */
|
||||
ret = regmap_read(dev->regmap, 0x29, &utmp);
|
||||
if (ret)
|
||||
goto err_kfree;
|
||||
dev->dt_addr = ((utmp & 0x80) == 0) ? 0x42 >> 1 : 0x40 >> 1;
|
||||
dev_err(&client->dev, "dt addr is 0x%02x", dev->dt_addr);
|
||||
|
||||
dev->dt_client = i2c_new_dummy_device(client->adapter,
|
||||
dev->dt_addr);
|
||||
if (!dev->dt_client) {
|
||||
ret = -ENODEV;
|
||||
goto err_kfree;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
err_kfree:
|
||||
kfree(dev);
|
||||
@ -1484,6 +1922,9 @@ static int m88ds3103_remove(struct i2c_client *client)
|
||||
|
||||
dev_dbg(&client->dev, "\n");
|
||||
|
||||
if (dev->dt_client)
|
||||
i2c_unregister_device(dev->dt_client);
|
||||
|
||||
i2c_mux_del_adapters(dev->muxc);
|
||||
|
||||
kfree(dev);
|
||||
@ -1491,7 +1932,9 @@ static int m88ds3103_remove(struct i2c_client *client)
|
||||
}
|
||||
|
||||
static const struct i2c_device_id m88ds3103_id_table[] = {
|
||||
{"m88ds3103", 0},
|
||||
{"m88ds3103", M88DS3103_CHIPTYPE_3103},
|
||||
{"m88rs6000", M88DS3103_CHIPTYPE_RS6000},
|
||||
{"m88ds3103b", M88DS3103_CHIPTYPE_3103B},
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, m88ds3103_id_table);
|
||||
@ -1513,3 +1956,4 @@ MODULE_DESCRIPTION("Montage Technology M88DS3103 DVB-S/S2 demodulator driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_FIRMWARE(M88DS3103_FIRMWARE);
|
||||
MODULE_FIRMWARE(M88RS6000_FIRMWARE);
|
||||
MODULE_FIRMWARE(M88DS3103B_FIRMWARE);
|
||||
|
@ -16,13 +16,20 @@
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/math64.h>
|
||||
|
||||
#define M88DS3103B_FIRMWARE "dvb-demod-m88ds3103b.fw"
|
||||
#define M88DS3103_FIRMWARE "dvb-demod-m88ds3103.fw"
|
||||
#define M88RS6000_FIRMWARE "dvb-demod-m88rs6000.fw"
|
||||
|
||||
#define M88RS6000_CHIP_ID 0x74
|
||||
#define M88DS3103_CHIP_ID 0x70
|
||||
|
||||
#define M88DS3103_CHIPTYPE_3103 0
|
||||
#define M88DS3103_CHIPTYPE_RS6000 1
|
||||
#define M88DS3103_CHIPTYPE_3103B 2
|
||||
|
||||
struct m88ds3103_dev {
|
||||
struct i2c_client *client;
|
||||
struct i2c_client *dt_client;
|
||||
struct regmap_config regmap_config;
|
||||
struct regmap *regmap;
|
||||
struct m88ds3103_config config;
|
||||
@ -35,10 +42,13 @@ struct m88ds3103_dev {
|
||||
struct i2c_mux_core *muxc;
|
||||
/* auto detect chip id to do different config */
|
||||
u8 chip_id;
|
||||
/* chip type to differentiate m88rs6000 from m88ds3103b */
|
||||
u8 chiptype;
|
||||
/* main mclk is calculated for M88RS6000 dynamically */
|
||||
s32 mclk;
|
||||
u64 post_bit_error;
|
||||
u64 post_bit_count;
|
||||
u8 dt_addr;
|
||||
};
|
||||
|
||||
struct m88ds3103_reg_val {
|
||||
|
@ -470,10 +470,11 @@ static int tda10071_read_status(struct dvb_frontend *fe, enum fe_status *status)
|
||||
goto error;
|
||||
|
||||
if (dev->delivery_system == SYS_DVBS) {
|
||||
dev->dvbv3_ber = buf[0] << 24 | buf[1] << 16 |
|
||||
buf[2] << 8 | buf[3] << 0;
|
||||
dev->post_bit_error += buf[0] << 24 | buf[1] << 16 |
|
||||
u32 bit_error = buf[0] << 24 | buf[1] << 16 |
|
||||
buf[2] << 8 | buf[3] << 0;
|
||||
|
||||
dev->dvbv3_ber = bit_error;
|
||||
dev->post_bit_error += bit_error;
|
||||
c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
|
||||
c->post_bit_error.stat[0].uvalue = dev->post_bit_error;
|
||||
dev->block_error += buf[4] << 8 | buf[5] << 0;
|
||||
|
@ -238,6 +238,7 @@ config VIDEO_ADV7604
|
||||
tristate "Analog Devices ADV7604 decoder"
|
||||
depends on VIDEO_V4L2 && I2C && VIDEO_V4L2_SUBDEV_API
|
||||
depends on GPIOLIB || COMPILE_TEST
|
||||
select REGMAP_I2C
|
||||
select HDMI
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
@ -379,6 +380,7 @@ config VIDEO_TVP5150
|
||||
tristate "Texas Instruments TVP5150 video decoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
select V4L2_FWNODE
|
||||
select REGMAP_I2C
|
||||
help
|
||||
Support for the Texas Instruments TVP5150 video decoder.
|
||||
|
||||
@ -584,6 +586,7 @@ config VIDEO_IMX214
|
||||
tristate "Sony IMX214 sensor support"
|
||||
depends on GPIOLIB && I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on V4L2_FWNODE
|
||||
select REGMAP_I2C
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Sony
|
||||
IMX214 camera.
|
||||
@ -591,6 +594,17 @@ config VIDEO_IMX214
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called imx214.
|
||||
|
||||
config VIDEO_IMX219
|
||||
tristate "Sony IMX219 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Sony
|
||||
IMX219 camera.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called imx219.
|
||||
|
||||
config VIDEO_IMX258
|
||||
tristate "Sony IMX258 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
@ -612,6 +626,7 @@ config VIDEO_IMX274
|
||||
config VIDEO_IMX290
|
||||
tristate "Sony IMX290 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
select REGMAP_I2C
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Sony
|
||||
@ -804,6 +819,7 @@ config VIDEO_OV7670
|
||||
config VIDEO_OV7740
|
||||
tristate "OmniVision OV7740 sensor support"
|
||||
depends on I2C && VIDEO_V4L2
|
||||
select REGMAP_I2C
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV7740 VGA camera sensor.
|
||||
|
@ -111,6 +111,7 @@ obj-$(CONFIG_VIDEO_OV2659) += ov2659.o
|
||||
obj-$(CONFIG_VIDEO_TC358743) += tc358743.o
|
||||
obj-$(CONFIG_VIDEO_HI556) += hi556.o
|
||||
obj-$(CONFIG_VIDEO_IMX214) += imx214.o
|
||||
obj-$(CONFIG_VIDEO_IMX219) += imx219.o
|
||||
obj-$(CONFIG_VIDEO_IMX258) += imx258.o
|
||||
obj-$(CONFIG_VIDEO_IMX274) += imx274.o
|
||||
obj-$(CONFIG_VIDEO_IMX290) += imx290.o
|
||||
|
@ -749,6 +749,17 @@ static int adv7180_set_pad_format(struct v4l2_subdev *sd,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int adv7180_init_cfg(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_pad_config *cfg)
|
||||
{
|
||||
struct v4l2_subdev_format fmt = {
|
||||
.which = cfg ? V4L2_SUBDEV_FORMAT_TRY
|
||||
: V4L2_SUBDEV_FORMAT_ACTIVE,
|
||||
};
|
||||
|
||||
return adv7180_set_pad_format(sd, cfg, &fmt);
|
||||
}
|
||||
|
||||
static int adv7180_g_mbus_config(struct v4l2_subdev *sd,
|
||||
struct v4l2_mbus_config *cfg)
|
||||
{
|
||||
@ -854,6 +865,7 @@ static const struct v4l2_subdev_core_ops adv7180_core_ops = {
|
||||
};
|
||||
|
||||
static const struct v4l2_subdev_pad_ops adv7180_pad_ops = {
|
||||
.init_cfg = adv7180_init_cfg,
|
||||
.enum_mbus_code = adv7180_enum_mbus_code,
|
||||
.set_fmt = adv7180_set_pad_format,
|
||||
.get_fmt = adv7180_get_pad_format,
|
||||
|
@ -803,7 +803,6 @@ err_rpm_put:
|
||||
static int imx214_g_frame_interval(struct v4l2_subdev *subdev,
|
||||
struct v4l2_subdev_frame_interval *fival)
|
||||
{
|
||||
fival->pad = 0;
|
||||
fival->interval.numerator = 1;
|
||||
fival->interval.denominator = IMX214_FPS;
|
||||
|
||||
|
1481
drivers/media/i2c/imx219.c
Normal file
1481
drivers/media/i2c/imx219.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -63,6 +63,10 @@
|
||||
#define OV5675_TEST_PATTERN_ENABLE BIT(7)
|
||||
#define OV5675_TEST_PATTERN_BAR_SHIFT 2
|
||||
|
||||
/* Flip Mirror Controls from sensor */
|
||||
#define OV5675_REG_FORMAT1 0x3820
|
||||
#define OV5675_REG_FORMAT2 0x373d
|
||||
|
||||
#define to_ov5675(_sd) container_of(_sd, struct ov5675, sd)
|
||||
|
||||
enum {
|
||||
@ -314,21 +318,21 @@ static const struct ov5675_reg mode_1296x972_regs[] = {
|
||||
{0x3800, 0x00},
|
||||
{0x3801, 0x00},
|
||||
{0x3802, 0x00},
|
||||
{0x3803, 0xf4},
|
||||
{0x3803, 0x00},
|
||||
{0x3804, 0x0a},
|
||||
{0x3805, 0x3f},
|
||||
{0x3806, 0x06},
|
||||
{0x3807, 0xb3},
|
||||
{0x3806, 0x07},
|
||||
{0x3807, 0xb7},
|
||||
{0x3808, 0x05},
|
||||
{0x3809, 0x00},
|
||||
{0x380a, 0x02},
|
||||
{0x380b, 0xd0},
|
||||
{0x3809, 0x10},
|
||||
{0x380a, 0x03},
|
||||
{0x380b, 0xcc},
|
||||
{0x380c, 0x02},
|
||||
{0x380d, 0xee},
|
||||
{0x380e, 0x07},
|
||||
{0x380f, 0xe4},
|
||||
{0x3811, 0x10},
|
||||
{0x3813, 0x09},
|
||||
{0x380f, 0xd0},
|
||||
{0x3811, 0x08},
|
||||
{0x3813, 0x0d},
|
||||
{0x3814, 0x03},
|
||||
{0x3815, 0x01},
|
||||
{0x3816, 0x03},
|
||||
@ -604,6 +608,53 @@ static int ov5675_test_pattern(struct ov5675 *ov5675, u32 pattern)
|
||||
OV5675_REG_VALUE_08BIT, pattern);
|
||||
}
|
||||
|
||||
/*
|
||||
* OV5675 supports keeping the pixel order by mirror and flip function
|
||||
* The Bayer order isn't affected by the flip controls
|
||||
*/
|
||||
static int ov5675_set_ctrl_hflip(struct ov5675 *ov5675, u32 ctrl_val)
|
||||
{
|
||||
int ret;
|
||||
u32 val;
|
||||
|
||||
ret = ov5675_read_reg(ov5675, OV5675_REG_FORMAT1,
|
||||
OV5675_REG_VALUE_08BIT, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return ov5675_write_reg(ov5675, OV5675_REG_FORMAT1,
|
||||
OV5675_REG_VALUE_08BIT,
|
||||
ctrl_val ? val & ~BIT(3) : val);
|
||||
}
|
||||
|
||||
static int ov5675_set_ctrl_vflip(struct ov5675 *ov5675, u8 ctrl_val)
|
||||
{
|
||||
int ret;
|
||||
u32 val;
|
||||
|
||||
ret = ov5675_read_reg(ov5675, OV5675_REG_FORMAT1,
|
||||
OV5675_REG_VALUE_08BIT, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = ov5675_write_reg(ov5675, OV5675_REG_FORMAT1,
|
||||
OV5675_REG_VALUE_08BIT,
|
||||
ctrl_val ? val | BIT(4) | BIT(5) : val);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = ov5675_read_reg(ov5675, OV5675_REG_FORMAT2,
|
||||
OV5675_REG_VALUE_08BIT, &val);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return ov5675_write_reg(ov5675, OV5675_REG_FORMAT2,
|
||||
OV5675_REG_VALUE_08BIT,
|
||||
ctrl_val ? val | BIT(1) : val);
|
||||
}
|
||||
|
||||
static int ov5675_set_ctrl(struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
struct ov5675 *ov5675 = container_of(ctrl->handler,
|
||||
@ -654,6 +705,14 @@ static int ov5675_set_ctrl(struct v4l2_ctrl *ctrl)
|
||||
ret = ov5675_test_pattern(ov5675, ctrl->val);
|
||||
break;
|
||||
|
||||
case V4L2_CID_HFLIP:
|
||||
ov5675_set_ctrl_hflip(ov5675, ctrl->val);
|
||||
break;
|
||||
|
||||
case V4L2_CID_VFLIP:
|
||||
ov5675_set_ctrl_vflip(ov5675, ctrl->val);
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
@ -722,6 +781,11 @@ static int ov5675_init_controls(struct ov5675 *ov5675)
|
||||
V4L2_CID_TEST_PATTERN,
|
||||
ARRAY_SIZE(ov5675_test_pattern_menu) - 1,
|
||||
0, 0, ov5675_test_pattern_menu);
|
||||
v4l2_ctrl_new_std(ctrl_hdlr, &ov5675_ctrl_ops,
|
||||
V4L2_CID_HFLIP, 0, 1, 1, 0);
|
||||
v4l2_ctrl_new_std(ctrl_hdlr, &ov5675_ctrl_ops,
|
||||
V4L2_CID_VFLIP, 0, 1, 1, 0);
|
||||
|
||||
if (ctrl_hdlr->error)
|
||||
return ctrl_hdlr->error;
|
||||
|
||||
|
@ -971,16 +971,9 @@ unlock_and_return:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Calculate the delay in us by clock rate and clock cycles */
|
||||
static inline u32 ov5695_cal_delay(u32 cycles)
|
||||
{
|
||||
return DIV_ROUND_UP(cycles, OV5695_XVCLK_FREQ / 1000 / 1000);
|
||||
}
|
||||
|
||||
static int __ov5695_power_on(struct ov5695 *ov5695)
|
||||
{
|
||||
int ret;
|
||||
u32 delay_us;
|
||||
int i, ret;
|
||||
struct device *dev = &ov5695->client->dev;
|
||||
|
||||
ret = clk_prepare_enable(ov5695->xvclk);
|
||||
@ -991,21 +984,28 @@ static int __ov5695_power_on(struct ov5695 *ov5695)
|
||||
|
||||
gpiod_set_value_cansleep(ov5695->reset_gpio, 1);
|
||||
|
||||
ret = regulator_bulk_enable(OV5695_NUM_SUPPLIES, ov5695->supplies);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Failed to enable regulators\n");
|
||||
goto disable_clk;
|
||||
/*
|
||||
* The hardware requires the regulators to be powered on in order,
|
||||
* so enable them one by one.
|
||||
*/
|
||||
for (i = 0; i < OV5695_NUM_SUPPLIES; i++) {
|
||||
ret = regulator_enable(ov5695->supplies[i].consumer);
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to enable %s: %d\n",
|
||||
ov5695->supplies[i].supply, ret);
|
||||
goto disable_reg_clk;
|
||||
}
|
||||
}
|
||||
|
||||
gpiod_set_value_cansleep(ov5695->reset_gpio, 0);
|
||||
|
||||
/* 8192 cycles prior to first SCCB transaction */
|
||||
delay_us = ov5695_cal_delay(8192);
|
||||
usleep_range(delay_us, delay_us * 2);
|
||||
usleep_range(1000, 1200);
|
||||
|
||||
return 0;
|
||||
|
||||
disable_clk:
|
||||
disable_reg_clk:
|
||||
for (--i; i >= 0; i--)
|
||||
regulator_disable(ov5695->supplies[i].consumer);
|
||||
clk_disable_unprepare(ov5695->xvclk);
|
||||
|
||||
return ret;
|
||||
@ -1013,9 +1013,22 @@ disable_clk:
|
||||
|
||||
static void __ov5695_power_off(struct ov5695 *ov5695)
|
||||
{
|
||||
struct device *dev = &ov5695->client->dev;
|
||||
int i, ret;
|
||||
|
||||
clk_disable_unprepare(ov5695->xvclk);
|
||||
gpiod_set_value_cansleep(ov5695->reset_gpio, 1);
|
||||
regulator_bulk_disable(OV5695_NUM_SUPPLIES, ov5695->supplies);
|
||||
|
||||
/*
|
||||
* The hardware requires the regulators to be powered off in order,
|
||||
* so disable them one by one.
|
||||
*/
|
||||
for (i = OV5695_NUM_SUPPLIES - 1; i >= 0; i--) {
|
||||
ret = regulator_disable(ov5695->supplies[i].consumer);
|
||||
if (ret)
|
||||
dev_err(dev, "Failed to disable %s: %d\n",
|
||||
ov5695->supplies[i].supply, ret);
|
||||
}
|
||||
}
|
||||
|
||||
static int __maybe_unused ov5695_runtime_resume(struct device *dev)
|
||||
@ -1285,7 +1298,7 @@ static int ov5695_probe(struct i2c_client *client,
|
||||
if (clk_get_rate(ov5695->xvclk) != OV5695_XVCLK_FREQ)
|
||||
dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");
|
||||
|
||||
ov5695->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
|
||||
ov5695->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(ov5695->reset_gpio)) {
|
||||
dev_err(dev, "Failed to get reset-gpios\n");
|
||||
return -EINVAL;
|
||||
|
@ -547,7 +547,7 @@ int s5c73m3_init_controls(struct s5c73m3 *state)
|
||||
V4L2_CTRL_FLAG_UPDATE;
|
||||
v4l2_ctrl_auto_cluster(2, &ctrls->auto_iso, 0, false);
|
||||
ctrls->af_status->flags |= V4L2_CTRL_FLAG_VOLATILE;
|
||||
v4l2_ctrl_cluster(6, &ctrls->focus_auto);
|
||||
v4l2_ctrl_cluster(5, &ctrls->focus_auto);
|
||||
|
||||
state->sensor_sd.ctrl_handler = hdl;
|
||||
|
||||
|
@ -57,6 +57,45 @@ static const struct smiapp_module_ident smiapp_module_idents[] = {
|
||||
*
|
||||
*/
|
||||
|
||||
static u32 smiapp_get_limit(struct smiapp_sensor *sensor,
|
||||
unsigned int limit)
|
||||
{
|
||||
if (WARN_ON(limit >= SMIAPP_LIMIT_LAST))
|
||||
return 1;
|
||||
|
||||
return sensor->limits[limit];
|
||||
}
|
||||
|
||||
#define SMIA_LIM(sensor, limit) \
|
||||
smiapp_get_limit(sensor, SMIAPP_LIMIT_##limit)
|
||||
|
||||
static int smiapp_read_all_smia_limits(struct smiapp_sensor *sensor)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
|
||||
unsigned int i;
|
||||
int rval;
|
||||
|
||||
for (i = 0; i < SMIAPP_LIMIT_LAST; i++) {
|
||||
u32 val;
|
||||
|
||||
rval = smiapp_read(
|
||||
sensor, smiapp_reg_limits[i].addr, &val);
|
||||
if (rval)
|
||||
return rval;
|
||||
|
||||
sensor->limits[i] = val;
|
||||
|
||||
dev_dbg(&client->dev, "0x%8.8x \"%s\" = %u, 0x%x\n",
|
||||
smiapp_reg_limits[i].addr,
|
||||
smiapp_reg_limits[i].what, val, val);
|
||||
}
|
||||
|
||||
if (SMIA_LIM(sensor, SCALER_N_MIN) == 0)
|
||||
smiapp_replace_limit(sensor, SMIAPP_LIMIT_SCALER_N_MIN, 16);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int smiapp_read_frame_fmt(struct smiapp_sensor *sensor)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
|
||||
@ -240,35 +279,35 @@ static int smiapp_pll_try(struct smiapp_sensor *sensor,
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
|
||||
struct smiapp_pll_limits lim = {
|
||||
.min_pre_pll_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_PRE_PLL_CLK_DIV],
|
||||
.max_pre_pll_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_PRE_PLL_CLK_DIV],
|
||||
.min_pll_ip_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_PLL_IP_FREQ_HZ],
|
||||
.max_pll_ip_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_PLL_IP_FREQ_HZ],
|
||||
.min_pll_multiplier = sensor->limits[SMIAPP_LIMIT_MIN_PLL_MULTIPLIER],
|
||||
.max_pll_multiplier = sensor->limits[SMIAPP_LIMIT_MAX_PLL_MULTIPLIER],
|
||||
.min_pll_op_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_PLL_OP_FREQ_HZ],
|
||||
.max_pll_op_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_PLL_OP_FREQ_HZ],
|
||||
.min_pre_pll_clk_div = SMIA_LIM(sensor, MIN_PRE_PLL_CLK_DIV),
|
||||
.max_pre_pll_clk_div = SMIA_LIM(sensor, MAX_PRE_PLL_CLK_DIV),
|
||||
.min_pll_ip_freq_hz = SMIA_LIM(sensor, MIN_PLL_IP_FREQ_HZ),
|
||||
.max_pll_ip_freq_hz = SMIA_LIM(sensor, MAX_PLL_IP_FREQ_HZ),
|
||||
.min_pll_multiplier = SMIA_LIM(sensor, MIN_PLL_MULTIPLIER),
|
||||
.max_pll_multiplier = SMIA_LIM(sensor, MAX_PLL_MULTIPLIER),
|
||||
.min_pll_op_freq_hz = SMIA_LIM(sensor, MIN_PLL_OP_FREQ_HZ),
|
||||
.max_pll_op_freq_hz = SMIA_LIM(sensor, MAX_PLL_OP_FREQ_HZ),
|
||||
|
||||
.op.min_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_OP_SYS_CLK_DIV],
|
||||
.op.max_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_OP_SYS_CLK_DIV],
|
||||
.op.min_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_OP_PIX_CLK_DIV],
|
||||
.op.max_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_OP_PIX_CLK_DIV],
|
||||
.op.min_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_OP_SYS_CLK_FREQ_HZ],
|
||||
.op.max_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_OP_SYS_CLK_FREQ_HZ],
|
||||
.op.min_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_OP_PIX_CLK_FREQ_HZ],
|
||||
.op.max_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_OP_PIX_CLK_FREQ_HZ],
|
||||
.op.min_sys_clk_div = SMIA_LIM(sensor, MIN_OP_SYS_CLK_DIV),
|
||||
.op.max_sys_clk_div = SMIA_LIM(sensor, MAX_OP_SYS_CLK_DIV),
|
||||
.op.min_pix_clk_div = SMIA_LIM(sensor, MIN_OP_PIX_CLK_DIV),
|
||||
.op.max_pix_clk_div = SMIA_LIM(sensor, MAX_OP_PIX_CLK_DIV),
|
||||
.op.min_sys_clk_freq_hz = SMIA_LIM(sensor, MIN_OP_SYS_CLK_FREQ_HZ),
|
||||
.op.max_sys_clk_freq_hz = SMIA_LIM(sensor, MAX_OP_SYS_CLK_FREQ_HZ),
|
||||
.op.min_pix_clk_freq_hz = SMIA_LIM(sensor, MIN_OP_PIX_CLK_FREQ_HZ),
|
||||
.op.max_pix_clk_freq_hz = SMIA_LIM(sensor, MAX_OP_PIX_CLK_FREQ_HZ),
|
||||
|
||||
.vt.min_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_VT_SYS_CLK_DIV],
|
||||
.vt.max_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_VT_SYS_CLK_DIV],
|
||||
.vt.min_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_VT_PIX_CLK_DIV],
|
||||
.vt.max_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_VT_PIX_CLK_DIV],
|
||||
.vt.min_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_VT_SYS_CLK_FREQ_HZ],
|
||||
.vt.max_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_VT_SYS_CLK_FREQ_HZ],
|
||||
.vt.min_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_VT_PIX_CLK_FREQ_HZ],
|
||||
.vt.max_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_VT_PIX_CLK_FREQ_HZ],
|
||||
.vt.min_sys_clk_div = SMIA_LIM(sensor, MIN_VT_SYS_CLK_DIV),
|
||||
.vt.max_sys_clk_div = SMIA_LIM(sensor, MAX_VT_SYS_CLK_DIV),
|
||||
.vt.min_pix_clk_div = SMIA_LIM(sensor, MIN_VT_PIX_CLK_DIV),
|
||||
.vt.max_pix_clk_div = SMIA_LIM(sensor, MAX_VT_PIX_CLK_DIV),
|
||||
.vt.min_sys_clk_freq_hz = SMIA_LIM(sensor, MIN_VT_SYS_CLK_FREQ_HZ),
|
||||
.vt.max_sys_clk_freq_hz = SMIA_LIM(sensor, MAX_VT_SYS_CLK_FREQ_HZ),
|
||||
.vt.min_pix_clk_freq_hz = SMIA_LIM(sensor, MIN_VT_PIX_CLK_FREQ_HZ),
|
||||
.vt.max_pix_clk_freq_hz = SMIA_LIM(sensor, MAX_VT_PIX_CLK_FREQ_HZ),
|
||||
|
||||
.min_line_length_pck_bin = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN],
|
||||
.min_line_length_pck = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK],
|
||||
.min_line_length_pck_bin = SMIA_LIM(sensor, MIN_LINE_LENGTH_PCK_BIN),
|
||||
.min_line_length_pck = SMIA_LIM(sensor, MIN_LINE_LENGTH_PCK),
|
||||
};
|
||||
|
||||
return smiapp_pll_calculate(&client->dev, &lim, pll);
|
||||
@ -311,7 +350,7 @@ static void __smiapp_update_exposure_limits(struct smiapp_sensor *sensor)
|
||||
|
||||
max = sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height
|
||||
+ sensor->vblank->val
|
||||
- sensor->limits[SMIAPP_LIMIT_COARSE_INTEGRATION_TIME_MAX_MARGIN];
|
||||
- SMIA_LIM(sensor, COARSE_INTEGRATION_TIME_MAX_MARGIN);
|
||||
|
||||
__v4l2_ctrl_modify_range(ctrl, ctrl->minimum, max, ctrl->step, max);
|
||||
}
|
||||
@ -568,10 +607,10 @@ static int smiapp_init_controls(struct smiapp_sensor *sensor)
|
||||
sensor->analog_gain = v4l2_ctrl_new_std(
|
||||
&sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops,
|
||||
V4L2_CID_ANALOGUE_GAIN,
|
||||
sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_MIN],
|
||||
sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_MAX],
|
||||
max(sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_STEP], 1U),
|
||||
sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_MIN]);
|
||||
SMIA_LIM(sensor, ANALOGUE_GAIN_CODE_MIN),
|
||||
SMIA_LIM(sensor, ANALOGUE_GAIN_CODE_MAX),
|
||||
max(SMIA_LIM(sensor, ANALOGUE_GAIN_CODE_STEP), 1U),
|
||||
SMIA_LIM(sensor, ANALOGUE_GAIN_CODE_MIN));
|
||||
|
||||
/* Exposure limits will be updated soon, use just something here. */
|
||||
sensor->exposure = v4l2_ctrl_new_std(
|
||||
@ -677,45 +716,6 @@ static void smiapp_free_controls(struct smiapp_sensor *sensor)
|
||||
v4l2_ctrl_handler_free(&sensor->ssds[i].ctrl_handler);
|
||||
}
|
||||
|
||||
static int smiapp_get_limits(struct smiapp_sensor *sensor, int const *limit,
|
||||
unsigned int n)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
|
||||
unsigned int i;
|
||||
u32 val;
|
||||
int rval;
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
rval = smiapp_read(
|
||||
sensor, smiapp_reg_limits[limit[i]].addr, &val);
|
||||
if (rval)
|
||||
return rval;
|
||||
sensor->limits[limit[i]] = val;
|
||||
dev_dbg(&client->dev, "0x%8.8x \"%s\" = %u, 0x%x\n",
|
||||
smiapp_reg_limits[limit[i]].addr,
|
||||
smiapp_reg_limits[limit[i]].what, val, val);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int smiapp_get_all_limits(struct smiapp_sensor *sensor)
|
||||
{
|
||||
unsigned int i;
|
||||
int rval;
|
||||
|
||||
for (i = 0; i < SMIAPP_LIMIT_LAST; i++) {
|
||||
rval = smiapp_get_limits(sensor, &i, 1);
|
||||
if (rval < 0)
|
||||
return rval;
|
||||
}
|
||||
|
||||
if (sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN] == 0)
|
||||
smiapp_replace_limit(sensor, SMIAPP_LIMIT_SCALER_N_MIN, 16);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int smiapp_get_mbus_formats(struct smiapp_sensor *sensor)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
|
||||
@ -869,21 +869,21 @@ static void smiapp_update_blanking(struct smiapp_sensor *sensor)
|
||||
int min, max;
|
||||
|
||||
if (sensor->binning_vertical > 1 || sensor->binning_horizontal > 1) {
|
||||
min_fll = sensor->limits[SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES_BIN];
|
||||
max_fll = sensor->limits[SMIAPP_LIMIT_MAX_FRAME_LENGTH_LINES_BIN];
|
||||
min_llp = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN];
|
||||
max_llp = sensor->limits[SMIAPP_LIMIT_MAX_LINE_LENGTH_PCK_BIN];
|
||||
min_lbp = sensor->limits[SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK_BIN];
|
||||
min_fll = SMIA_LIM(sensor, MIN_FRAME_LENGTH_LINES_BIN);
|
||||
max_fll = SMIA_LIM(sensor, MAX_FRAME_LENGTH_LINES_BIN);
|
||||
min_llp = SMIA_LIM(sensor, MIN_LINE_LENGTH_PCK_BIN);
|
||||
max_llp = SMIA_LIM(sensor, MAX_LINE_LENGTH_PCK_BIN);
|
||||
min_lbp = SMIA_LIM(sensor, MIN_LINE_BLANKING_PCK_BIN);
|
||||
} else {
|
||||
min_fll = sensor->limits[SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES];
|
||||
max_fll = sensor->limits[SMIAPP_LIMIT_MAX_FRAME_LENGTH_LINES];
|
||||
min_llp = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK];
|
||||
max_llp = sensor->limits[SMIAPP_LIMIT_MAX_LINE_LENGTH_PCK];
|
||||
min_lbp = sensor->limits[SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK];
|
||||
min_fll = SMIA_LIM(sensor, MIN_FRAME_LENGTH_LINES);
|
||||
max_fll = SMIA_LIM(sensor, MAX_FRAME_LENGTH_LINES);
|
||||
min_llp = SMIA_LIM(sensor, MIN_LINE_LENGTH_PCK);
|
||||
max_llp = SMIA_LIM(sensor, MAX_LINE_LENGTH_PCK);
|
||||
min_lbp = SMIA_LIM(sensor, MIN_LINE_BLANKING_PCK);
|
||||
}
|
||||
|
||||
min = max_t(int,
|
||||
sensor->limits[SMIAPP_LIMIT_MIN_FRAME_BLANKING_LINES],
|
||||
SMIA_LIM(sensor, MIN_FRAME_BLANKING_LINES),
|
||||
min_fll -
|
||||
sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height);
|
||||
max = max_fll - sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height;
|
||||
@ -961,7 +961,7 @@ static int smiapp_read_nvm_page(struct smiapp_sensor *sensor, u32 p, u8 *nvm,
|
||||
return -ENODATA;
|
||||
}
|
||||
|
||||
if (sensor->limits[SMIAPP_LIMIT_DATA_TRANSFER_IF_CAPABILITY] &
|
||||
if (SMIA_LIM(sensor, DATA_TRANSFER_IF_CAPABILITY) &
|
||||
SMIAPP_DATA_TRANSFER_IF_CAPABILITY_POLL) {
|
||||
for (i = 1000; i > 0; i--) {
|
||||
if (s & SMIAPP_DATA_TRANSFER_IF_1_STATUS_RD_READY)
|
||||
@ -1416,7 +1416,7 @@ static int smiapp_start_streaming(struct smiapp_sensor *sensor)
|
||||
*/
|
||||
|
||||
/* Digital crop */
|
||||
if (sensor->limits[SMIAPP_LIMIT_DIGITAL_CROP_CAPABILITY]
|
||||
if (SMIA_LIM(sensor, DIGITAL_CROP_CAPABILITY)
|
||||
== SMIAPP_DIGITAL_CROP_CAPABILITY_INPUT_CROP) {
|
||||
rval = smiapp_write(
|
||||
sensor, SMIAPP_REG_U16_DIGITAL_CROP_X_OFFSET,
|
||||
@ -1444,7 +1444,7 @@ static int smiapp_start_streaming(struct smiapp_sensor *sensor)
|
||||
}
|
||||
|
||||
/* Scaling */
|
||||
if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY]
|
||||
if (SMIA_LIM(sensor, SCALING_CAPABILITY)
|
||||
!= SMIAPP_SCALING_CAPABILITY_NONE) {
|
||||
rval = smiapp_write(sensor, SMIAPP_REG_U16_SCALING_MODE,
|
||||
sensor->scaling_mode);
|
||||
@ -1467,7 +1467,7 @@ static int smiapp_start_streaming(struct smiapp_sensor *sensor)
|
||||
if (rval < 0)
|
||||
goto out;
|
||||
|
||||
if ((sensor->limits[SMIAPP_LIMIT_FLASH_MODE_CAPABILITY] &
|
||||
if ((SMIA_LIM(sensor, FLASH_MODE_CAPABILITY) &
|
||||
(SMIAPP_FLASH_MODE_CAPABILITY_SINGLE_STROBE |
|
||||
SMIAPP_FLASH_MODE_CAPABILITY_MULTIPLE_STROBE)) &&
|
||||
sensor->hwcfg->strobe_setup != NULL &&
|
||||
@ -1715,8 +1715,7 @@ static void smiapp_propagate(struct v4l2_subdev *subdev,
|
||||
if (which == V4L2_SUBDEV_FORMAT_ACTIVE) {
|
||||
if (ssd == sensor->scaler) {
|
||||
sensor->scale_m =
|
||||
sensor->limits[
|
||||
SMIAPP_LIMIT_SCALER_N_MIN];
|
||||
SMIA_LIM(sensor, SCALER_N_MIN);
|
||||
sensor->scaling_mode =
|
||||
SMIAPP_SCALING_MODE_NONE;
|
||||
} else if (ssd == sensor->binner) {
|
||||
@ -1828,12 +1827,12 @@ static int smiapp_set_format(struct v4l2_subdev *subdev,
|
||||
|
||||
fmt->format.width =
|
||||
clamp(fmt->format.width,
|
||||
sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE],
|
||||
sensor->limits[SMIAPP_LIMIT_MAX_X_OUTPUT_SIZE]);
|
||||
SMIA_LIM(sensor, MIN_X_OUTPUT_SIZE),
|
||||
SMIA_LIM(sensor, MAX_X_OUTPUT_SIZE));
|
||||
fmt->format.height =
|
||||
clamp(fmt->format.height,
|
||||
sensor->limits[SMIAPP_LIMIT_MIN_Y_OUTPUT_SIZE],
|
||||
sensor->limits[SMIAPP_LIMIT_MAX_Y_OUTPUT_SIZE]);
|
||||
SMIA_LIM(sensor, MIN_Y_OUTPUT_SIZE),
|
||||
SMIA_LIM(sensor, MAX_Y_OUTPUT_SIZE));
|
||||
|
||||
smiapp_get_crop_compose(subdev, cfg, crops, NULL, fmt->which);
|
||||
|
||||
@ -1886,7 +1885,7 @@ static int scaling_goodness(struct v4l2_subdev *subdev, int w, int ask_w,
|
||||
val -= abs(w - ask_w);
|
||||
val -= abs(h - ask_h);
|
||||
|
||||
if (w < sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE])
|
||||
if (w < SMIA_LIM(sensor, MIN_X_OUTPUT_SIZE))
|
||||
val -= SCALING_GOODNESS_EXTREME;
|
||||
|
||||
dev_dbg(&client->dev, "w %d ask_w %d h %d ask_h %d goodness %d\n",
|
||||
@ -1952,7 +1951,7 @@ static void smiapp_set_compose_scaler(struct v4l2_subdev *subdev,
|
||||
struct i2c_client *client = v4l2_get_subdevdata(subdev);
|
||||
struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
|
||||
u32 min, max, a, b, max_m;
|
||||
u32 scale_m = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN];
|
||||
u32 scale_m = SMIA_LIM(sensor, SCALER_N_MIN);
|
||||
int mode = SMIAPP_SCALING_MODE_HORIZONTAL;
|
||||
u32 try[4];
|
||||
u32 ntry = 0;
|
||||
@ -1965,19 +1964,19 @@ static void smiapp_set_compose_scaler(struct v4l2_subdev *subdev,
|
||||
crops[SMIAPP_PAD_SINK]->height);
|
||||
|
||||
a = crops[SMIAPP_PAD_SINK]->width
|
||||
* sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN] / sel->r.width;
|
||||
* SMIA_LIM(sensor, SCALER_N_MIN) / sel->r.width;
|
||||
b = crops[SMIAPP_PAD_SINK]->height
|
||||
* sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN] / sel->r.height;
|
||||
* SMIA_LIM(sensor, SCALER_N_MIN) / sel->r.height;
|
||||
max_m = crops[SMIAPP_PAD_SINK]->width
|
||||
* sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]
|
||||
/ sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE];
|
||||
* SMIA_LIM(sensor, SCALER_N_MIN)
|
||||
/ SMIA_LIM(sensor, MIN_X_OUTPUT_SIZE);
|
||||
|
||||
a = clamp(a, sensor->limits[SMIAPP_LIMIT_SCALER_M_MIN],
|
||||
sensor->limits[SMIAPP_LIMIT_SCALER_M_MAX]);
|
||||
b = clamp(b, sensor->limits[SMIAPP_LIMIT_SCALER_M_MIN],
|
||||
sensor->limits[SMIAPP_LIMIT_SCALER_M_MAX]);
|
||||
max_m = clamp(max_m, sensor->limits[SMIAPP_LIMIT_SCALER_M_MIN],
|
||||
sensor->limits[SMIAPP_LIMIT_SCALER_M_MAX]);
|
||||
a = clamp(a, SMIA_LIM(sensor, SCALER_M_MIN),
|
||||
SMIA_LIM(sensor, SCALER_M_MAX));
|
||||
b = clamp(b, SMIA_LIM(sensor, SCALER_M_MIN),
|
||||
SMIA_LIM(sensor, SCALER_M_MAX));
|
||||
max_m = clamp(max_m, SMIA_LIM(sensor, SCALER_M_MIN),
|
||||
SMIA_LIM(sensor, SCALER_M_MAX));
|
||||
|
||||
dev_dbg(&client->dev, "scaling: a %d b %d max_m %d\n", a, b, max_m);
|
||||
|
||||
@ -2004,7 +2003,7 @@ static void smiapp_set_compose_scaler(struct v4l2_subdev *subdev,
|
||||
subdev,
|
||||
crops[SMIAPP_PAD_SINK]->width
|
||||
/ try[i]
|
||||
* sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN],
|
||||
* SMIA_LIM(sensor, SCALER_N_MIN),
|
||||
sel->r.width,
|
||||
crops[SMIAPP_PAD_SINK]->height,
|
||||
sel->r.height,
|
||||
@ -2018,18 +2017,18 @@ static void smiapp_set_compose_scaler(struct v4l2_subdev *subdev,
|
||||
best = this;
|
||||
}
|
||||
|
||||
if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY]
|
||||
if (SMIA_LIM(sensor, SCALING_CAPABILITY)
|
||||
== SMIAPP_SCALING_CAPABILITY_HORIZONTAL)
|
||||
continue;
|
||||
|
||||
this = scaling_goodness(
|
||||
subdev, crops[SMIAPP_PAD_SINK]->width
|
||||
/ try[i]
|
||||
* sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN],
|
||||
* SMIA_LIM(sensor, SCALER_N_MIN),
|
||||
sel->r.width,
|
||||
crops[SMIAPP_PAD_SINK]->height
|
||||
/ try[i]
|
||||
* sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN],
|
||||
* SMIA_LIM(sensor, SCALER_N_MIN),
|
||||
sel->r.height,
|
||||
sel->flags);
|
||||
|
||||
@ -2043,12 +2042,12 @@ static void smiapp_set_compose_scaler(struct v4l2_subdev *subdev,
|
||||
sel->r.width =
|
||||
(crops[SMIAPP_PAD_SINK]->width
|
||||
/ scale_m
|
||||
* sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]) & ~1;
|
||||
* SMIA_LIM(sensor, SCALER_N_MIN)) & ~1;
|
||||
if (mode == SMIAPP_SCALING_MODE_BOTH)
|
||||
sel->r.height =
|
||||
(crops[SMIAPP_PAD_SINK]->height
|
||||
/ scale_m
|
||||
* sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN])
|
||||
* SMIA_LIM(sensor, SCALER_N_MIN))
|
||||
& ~1;
|
||||
else
|
||||
sel->r.height = crops[SMIAPP_PAD_SINK]->height;
|
||||
@ -2104,7 +2103,7 @@ static int __smiapp_sel_supported(struct v4l2_subdev *subdev,
|
||||
return 0;
|
||||
if (ssd == sensor->scaler
|
||||
&& sel->pad == SMIAPP_PAD_SINK
|
||||
&& sensor->limits[SMIAPP_LIMIT_DIGITAL_CROP_CAPABILITY]
|
||||
&& SMIA_LIM(sensor, DIGITAL_CROP_CAPABILITY)
|
||||
== SMIAPP_DIGITAL_CROP_CAPABILITY_INPUT_CROP)
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
@ -2120,7 +2119,7 @@ static int __smiapp_sel_supported(struct v4l2_subdev *subdev,
|
||||
if (ssd == sensor->binner)
|
||||
return 0;
|
||||
if (ssd == sensor->scaler
|
||||
&& sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY]
|
||||
&& SMIA_LIM(sensor, SCALING_CAPABILITY)
|
||||
!= SMIAPP_SCALING_CAPABILITY_NONE)
|
||||
return 0;
|
||||
/* Fall through */
|
||||
@ -2185,8 +2184,8 @@ static void smiapp_get_native_size(struct smiapp_subdev *ssd,
|
||||
{
|
||||
r->top = 0;
|
||||
r->left = 0;
|
||||
r->width = ssd->sensor->limits[SMIAPP_LIMIT_X_ADDR_MAX] + 1;
|
||||
r->height = ssd->sensor->limits[SMIAPP_LIMIT_Y_ADDR_MAX] + 1;
|
||||
r->width = SMIA_LIM(ssd->sensor, X_ADDR_MAX) + 1;
|
||||
r->height = SMIA_LIM(ssd->sensor, Y_ADDR_MAX) + 1;
|
||||
}
|
||||
|
||||
static int __smiapp_get_selection(struct v4l2_subdev *subdev,
|
||||
@ -2271,10 +2270,10 @@ static int smiapp_set_selection(struct v4l2_subdev *subdev,
|
||||
sel->r.height = SMIAPP_ALIGN_DIM(sel->r.height, sel->flags);
|
||||
|
||||
sel->r.width = max_t(unsigned int,
|
||||
sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE],
|
||||
SMIA_LIM(sensor, MIN_X_OUTPUT_SIZE),
|
||||
sel->r.width);
|
||||
sel->r.height = max_t(unsigned int,
|
||||
sensor->limits[SMIAPP_LIMIT_MIN_Y_OUTPUT_SIZE],
|
||||
SMIA_LIM(sensor, MIN_Y_OUTPUT_SIZE),
|
||||
sel->r.height);
|
||||
|
||||
switch (sel->target) {
|
||||
@ -2927,7 +2926,7 @@ static int smiapp_probe(struct i2c_client *client)
|
||||
goto out_power_off;
|
||||
}
|
||||
|
||||
rval = smiapp_get_all_limits(sensor);
|
||||
rval = smiapp_read_all_smia_limits(sensor);
|
||||
if (rval) {
|
||||
rval = -ENODEV;
|
||||
goto out_power_off;
|
||||
@ -2963,7 +2962,7 @@ static int smiapp_probe(struct i2c_client *client)
|
||||
goto out_power_off;
|
||||
}
|
||||
|
||||
if (sensor->limits[SMIAPP_LIMIT_BINNING_CAPABILITY]) {
|
||||
if (SMIA_LIM(sensor, BINNING_CAPABILITY)) {
|
||||
u32 val;
|
||||
|
||||
rval = smiapp_read(sensor,
|
||||
@ -3000,7 +2999,7 @@ static int smiapp_probe(struct i2c_client *client)
|
||||
}
|
||||
|
||||
if (sensor->minfo.smiapp_version &&
|
||||
sensor->limits[SMIAPP_LIMIT_DATA_TRANSFER_IF_CAPABILITY] &
|
||||
SMIA_LIM(sensor, DATA_TRANSFER_IF_CAPABILITY) &
|
||||
SMIAPP_DATA_TRANSFER_IF_CAPABILITY_SUPPORTED) {
|
||||
if (device_create_file(&client->dev, &dev_attr_nvm) != 0) {
|
||||
dev_err(&client->dev, "sysfs nvm entry failed\n");
|
||||
@ -3010,21 +3009,21 @@ static int smiapp_probe(struct i2c_client *client)
|
||||
}
|
||||
|
||||
/* We consider this as profile 0 sensor if any of these are zero. */
|
||||
if (!sensor->limits[SMIAPP_LIMIT_MIN_OP_SYS_CLK_DIV] ||
|
||||
!sensor->limits[SMIAPP_LIMIT_MAX_OP_SYS_CLK_DIV] ||
|
||||
!sensor->limits[SMIAPP_LIMIT_MIN_OP_PIX_CLK_DIV] ||
|
||||
!sensor->limits[SMIAPP_LIMIT_MAX_OP_PIX_CLK_DIV]) {
|
||||
if (!SMIA_LIM(sensor, MIN_OP_SYS_CLK_DIV) ||
|
||||
!SMIA_LIM(sensor, MAX_OP_SYS_CLK_DIV) ||
|
||||
!SMIA_LIM(sensor, MIN_OP_PIX_CLK_DIV) ||
|
||||
!SMIA_LIM(sensor, MAX_OP_PIX_CLK_DIV)) {
|
||||
sensor->minfo.smiapp_profile = SMIAPP_PROFILE_0;
|
||||
} else if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY]
|
||||
} else if (SMIA_LIM(sensor, SCALING_CAPABILITY)
|
||||
!= SMIAPP_SCALING_CAPABILITY_NONE) {
|
||||
if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY]
|
||||
if (SMIA_LIM(sensor, SCALING_CAPABILITY)
|
||||
== SMIAPP_SCALING_CAPABILITY_HORIZONTAL)
|
||||
sensor->minfo.smiapp_profile = SMIAPP_PROFILE_1;
|
||||
else
|
||||
sensor->minfo.smiapp_profile = SMIAPP_PROFILE_2;
|
||||
sensor->scaler = &sensor->ssds[sensor->ssds_used];
|
||||
sensor->ssds_used++;
|
||||
} else if (sensor->limits[SMIAPP_LIMIT_DIGITAL_CROP_CAPABILITY]
|
||||
} else if (SMIA_LIM(sensor, DIGITAL_CROP_CAPABILITY)
|
||||
== SMIAPP_DIGITAL_CROP_CAPABILITY_INPUT_CROP) {
|
||||
sensor->scaler = &sensor->ssds[sensor->ssds_used];
|
||||
sensor->ssds_used++;
|
||||
@ -3034,13 +3033,13 @@ static int smiapp_probe(struct i2c_client *client)
|
||||
sensor->pixel_array = &sensor->ssds[sensor->ssds_used];
|
||||
sensor->ssds_used++;
|
||||
|
||||
sensor->scale_m = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN];
|
||||
sensor->scale_m = SMIA_LIM(sensor, SCALER_N_MIN);
|
||||
|
||||
/* prepare PLL configuration input values */
|
||||
sensor->pll.bus_type = SMIAPP_PLL_BUS_TYPE_CSI2;
|
||||
sensor->pll.csi2.lanes = sensor->hwcfg->lanes;
|
||||
sensor->pll.ext_clk_freq_hz = sensor->hwcfg->ext_clk;
|
||||
sensor->pll.scale_n = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN];
|
||||
sensor->pll.scale_n = SMIA_LIM(sensor, SCALER_N_MIN);
|
||||
/* Profile 0 sensors have no separate OP clock branch. */
|
||||
if (sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0)
|
||||
sensor->pll.flags |= SMIAPP_PLL_FLAG_NO_OP_CLOCKS;
|
||||
|
@ -35,6 +35,10 @@
|
||||
#define SMIAPP_FLASH_MODE_CAPABILITY_SINGLE_STROBE BIT(0)
|
||||
#define SMIAPP_FLASH_MODE_CAPABILITY_MULTIPLE_STROBE BIT(1)
|
||||
|
||||
#define SMIAPP_CSI_SIGNALLING_MODE_CCP2_DATA_CLOCK 0
|
||||
#define SMIAPP_CSI_SIGNALLING_MODE_CCP2_DATA_STROBE 1
|
||||
#define SMIAPP_CSI_SIGNALLING_MODE_CSI2 2
|
||||
|
||||
#define SMIAPP_DPHY_CTRL_AUTOMATIC 0
|
||||
/* DPHY control based on REQUESTED_LINK_BIT_RATE_MBPS */
|
||||
#define SMIAPP_DPHY_CTRL_UI 1
|
||||
|
@ -8,6 +8,8 @@
|
||||
* Contact: Sakari Ailus <sakari.ailus@iki.fi>
|
||||
*/
|
||||
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/i2c.h>
|
||||
|
||||
@ -69,18 +71,19 @@ static int ____smiapp_read(struct smiapp_sensor *sensor, u16 reg,
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
|
||||
struct i2c_msg msg;
|
||||
unsigned char data[4];
|
||||
u16 offset = reg;
|
||||
unsigned char data_buf[sizeof(u32)] = { 0 };
|
||||
unsigned char offset_buf[sizeof(u16)];
|
||||
int r;
|
||||
|
||||
if (len > sizeof(data_buf))
|
||||
return -EINVAL;
|
||||
|
||||
msg.addr = client->addr;
|
||||
msg.flags = 0;
|
||||
msg.len = 2;
|
||||
msg.buf = data;
|
||||
msg.len = sizeof(offset_buf);
|
||||
msg.buf = offset_buf;
|
||||
put_unaligned_be16(reg, offset_buf);
|
||||
|
||||
/* high byte goes out first */
|
||||
data[0] = (u8) (offset >> 8);
|
||||
data[1] = (u8) offset;
|
||||
r = i2c_transfer(client->adapter, &msg, 1);
|
||||
if (r != 1) {
|
||||
if (r >= 0)
|
||||
@ -90,6 +93,8 @@ static int ____smiapp_read(struct smiapp_sensor *sensor, u16 reg,
|
||||
|
||||
msg.len = len;
|
||||
msg.flags = I2C_M_RD;
|
||||
msg.buf = &data_buf[sizeof(data_buf) - len];
|
||||
|
||||
r = i2c_transfer(client->adapter, &msg, 1);
|
||||
if (r != 1) {
|
||||
if (r >= 0)
|
||||
@ -97,27 +102,12 @@ static int ____smiapp_read(struct smiapp_sensor *sensor, u16 reg,
|
||||
goto err;
|
||||
}
|
||||
|
||||
*val = 0;
|
||||
/* high byte comes first */
|
||||
switch (len) {
|
||||
case SMIAPP_REG_32BIT:
|
||||
*val = (data[0] << 24) + (data[1] << 16) + (data[2] << 8) +
|
||||
data[3];
|
||||
break;
|
||||
case SMIAPP_REG_16BIT:
|
||||
*val = (data[0] << 8) + data[1];
|
||||
break;
|
||||
case SMIAPP_REG_8BIT:
|
||||
*val = data[0];
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
*val = get_unaligned_be32(data_buf);
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
dev_err(&client->dev, "read from offset 0x%x error %d\n", offset, r);
|
||||
dev_err(&client->dev, "read from offset 0x%x error %d\n", reg, r);
|
||||
|
||||
return r;
|
||||
}
|
||||
@ -158,7 +148,7 @@ static int __smiapp_read(struct smiapp_sensor *sensor, u32 reg, u32 *val,
|
||||
&& len != SMIAPP_REG_32BIT)
|
||||
return -EINVAL;
|
||||
|
||||
if (len == SMIAPP_REG_8BIT || !only8)
|
||||
if (!only8)
|
||||
rval = ____smiapp_read(sensor, SMIAPP_REG_ADDR(reg), len, val);
|
||||
else
|
||||
rval = ____smiapp_read_8only(sensor, SMIAPP_REG_ADDR(reg), len,
|
||||
@ -214,13 +204,10 @@ int smiapp_write_no_quirk(struct smiapp_sensor *sensor, u32 reg, u32 val)
|
||||
struct i2c_msg msg;
|
||||
unsigned char data[6];
|
||||
unsigned int retries;
|
||||
u8 flags = SMIAPP_REG_FLAGS(reg);
|
||||
u8 len = SMIAPP_REG_WIDTH(reg);
|
||||
u16 offset = SMIAPP_REG_ADDR(reg);
|
||||
int r;
|
||||
|
||||
if ((len != SMIAPP_REG_8BIT && len != SMIAPP_REG_16BIT &&
|
||||
len != SMIAPP_REG_32BIT) || flags)
|
||||
if (len > sizeof(data) - 2)
|
||||
return -EINVAL;
|
||||
|
||||
msg.addr = client->addr;
|
||||
@ -228,27 +215,8 @@ int smiapp_write_no_quirk(struct smiapp_sensor *sensor, u32 reg, u32 val)
|
||||
msg.len = 2 + len;
|
||||
msg.buf = data;
|
||||
|
||||
/* high byte goes out first */
|
||||
data[0] = (u8) (reg >> 8);
|
||||
data[1] = (u8) (reg & 0xff);
|
||||
|
||||
switch (len) {
|
||||
case SMIAPP_REG_8BIT:
|
||||
data[2] = val;
|
||||
break;
|
||||
case SMIAPP_REG_16BIT:
|
||||
data[2] = val >> 8;
|
||||
data[3] = val;
|
||||
break;
|
||||
case SMIAPP_REG_32BIT:
|
||||
data[2] = val >> 24;
|
||||
data[3] = val >> 16;
|
||||
data[4] = val >> 8;
|
||||
data[5] = val;
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
put_unaligned_be16(SMIAPP_REG_ADDR(reg), data);
|
||||
put_unaligned_be32(val << (8 * (sizeof(val) - len)), data + 2);
|
||||
|
||||
for (retries = 0; retries < 5; retries++) {
|
||||
/*
|
||||
@ -269,7 +237,8 @@ int smiapp_write_no_quirk(struct smiapp_sensor *sensor, u32 reg, u32 val)
|
||||
}
|
||||
|
||||
dev_err(&client->dev,
|
||||
"wrote 0x%x to offset 0x%x error %d\n", val, offset, r);
|
||||
"wrote 0x%x to offset 0x%x error %d\n", val,
|
||||
SMIAPP_REG_ADDR(reg), r);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
@ -14,7 +14,6 @@
|
||||
#include <linux/mutex.h>
|
||||
#include <media/v4l2-ctrls.h>
|
||||
#include <media/v4l2-subdev.h>
|
||||
#include <media/i2c/smiapp.h>
|
||||
|
||||
#include "smiapp-pll.h"
|
||||
#include "smiapp-reg.h"
|
||||
@ -42,6 +41,49 @@
|
||||
|
||||
#define SMIAPP_COLOUR_COMPONENTS 4
|
||||
|
||||
#define SMIAPP_NAME "smiapp"
|
||||
|
||||
#define SMIAPP_DFL_I2C_ADDR (0x20 >> 1) /* Default I2C Address */
|
||||
#define SMIAPP_ALT_I2C_ADDR (0x6e >> 1) /* Alternate I2C Address */
|
||||
|
||||
/*
|
||||
* Sometimes due to board layout considerations the camera module can be
|
||||
* mounted rotated. The typical rotation used is 180 degrees which can be
|
||||
* corrected by giving a default H-FLIP and V-FLIP in the sensor readout.
|
||||
* FIXME: rotation also changes the bayer pattern.
|
||||
*/
|
||||
enum smiapp_module_board_orient {
|
||||
SMIAPP_MODULE_BOARD_ORIENT_0 = 0,
|
||||
SMIAPP_MODULE_BOARD_ORIENT_180,
|
||||
};
|
||||
|
||||
struct smiapp_flash_strobe_parms {
|
||||
u8 mode;
|
||||
u32 strobe_width_high_us;
|
||||
u16 strobe_delay;
|
||||
u16 stobe_start_point;
|
||||
u8 trigger;
|
||||
};
|
||||
|
||||
struct smiapp_hwconfig {
|
||||
/*
|
||||
* Change the cci address if i2c_addr_alt is set.
|
||||
* Both default and alternate cci addr need to be present
|
||||
*/
|
||||
unsigned short i2c_addr_dfl; /* Default i2c addr */
|
||||
unsigned short i2c_addr_alt; /* Alternate i2c addr */
|
||||
|
||||
uint32_t ext_clk; /* sensor external clk */
|
||||
|
||||
unsigned int lanes; /* Number of CSI-2 lanes */
|
||||
uint32_t csi_signalling_mode; /* SMIAPP_CSI_SIGNALLING_MODE_* */
|
||||
uint64_t *op_sys_clock;
|
||||
|
||||
enum smiapp_module_board_orient module_board_orient;
|
||||
|
||||
struct smiapp_flash_strobe_parms *strobe_setup;
|
||||
};
|
||||
|
||||
#include "smiapp-limits.h"
|
||||
|
||||
struct smiapp_quirk;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -255,7 +255,7 @@ static int amg88xx_set_power(struct video_i2c_data *data, bool on)
|
||||
return amg88xx_set_power_off(data);
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_HWMON)
|
||||
#if IS_REACHABLE(CONFIG_HWMON)
|
||||
|
||||
static const u32 amg88xx_temp_config[] = {
|
||||
HWMON_T_INPUT,
|
||||
@ -858,7 +858,7 @@ static int video_i2c_probe(struct i2c_client *client,
|
||||
}
|
||||
}
|
||||
|
||||
ret = video_register_device(&data->vdev, VFL_TYPE_GRABBER, -1);
|
||||
ret = video_register_device(&data->vdev, VFL_TYPE_VIDEO, -1);
|
||||
if (ret < 0)
|
||||
goto error_pm_disable;
|
||||
|
||||
|
@ -662,9 +662,14 @@ media_create_pad_link(struct media_entity *source, u16 source_pad,
|
||||
struct media_link *link;
|
||||
struct media_link *backlink;
|
||||
|
||||
BUG_ON(source == NULL || sink == NULL);
|
||||
BUG_ON(source_pad >= source->num_pads);
|
||||
BUG_ON(sink_pad >= sink->num_pads);
|
||||
if (WARN_ON(!source || !sink) ||
|
||||
WARN_ON(source_pad >= source->num_pads) ||
|
||||
WARN_ON(sink_pad >= sink->num_pads))
|
||||
return -EINVAL;
|
||||
if (WARN_ON(!(source->pads[source_pad].flags & MEDIA_PAD_FL_SOURCE)))
|
||||
return -EINVAL;
|
||||
if (WARN_ON(!(sink->pads[sink_pad].flags & MEDIA_PAD_FL_SINK)))
|
||||
return -EINVAL;
|
||||
|
||||
link = media_add_link(&source->links);
|
||||
if (link == NULL)
|
||||
|
@ -2964,7 +2964,7 @@ static int bttv_open(struct file *file)
|
||||
|
||||
dprintk("open dev=%s\n", video_device_node_name(vdev));
|
||||
|
||||
if (vdev->vfl_type == VFL_TYPE_GRABBER) {
|
||||
if (vdev->vfl_type == VFL_TYPE_VIDEO) {
|
||||
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
} else if (vdev->vfl_type == VFL_TYPE_VBI) {
|
||||
type = V4L2_BUF_TYPE_VBI_CAPTURE;
|
||||
@ -3905,7 +3905,7 @@ static int bttv_register_video(struct bttv *btv)
|
||||
if (no_overlay <= 0)
|
||||
btv->video_dev.device_caps |= V4L2_CAP_VIDEO_OVERLAY;
|
||||
|
||||
if (video_register_device(&btv->video_dev, VFL_TYPE_GRABBER,
|
||||
if (video_register_device(&btv->video_dev, VFL_TYPE_VIDEO,
|
||||
video_nr[btv->c.nr]) < 0)
|
||||
goto err;
|
||||
pr_info("%d: registered device %s\n",
|
||||
|
@ -1272,7 +1272,7 @@ static int cobalt_node_register(struct cobalt *cobalt, int node)
|
||||
video_set_drvdata(vdev, s);
|
||||
ret = vb2_queue_init(q);
|
||||
if (!s->is_audio && ret == 0)
|
||||
ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
|
||||
ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
|
||||
else if (!s->is_dummy)
|
||||
ret = cobalt_alsa_init(s);
|
||||
|
||||
|
@ -48,19 +48,19 @@ static struct {
|
||||
} cx18_stream_info[] = {
|
||||
{ /* CX18_ENC_STREAM_TYPE_MPG */
|
||||
"encoder MPEG",
|
||||
VFL_TYPE_GRABBER, 0,
|
||||
VFL_TYPE_VIDEO, 0,
|
||||
PCI_DMA_FROMDEVICE,
|
||||
V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
|
||||
V4L2_CAP_AUDIO | V4L2_CAP_TUNER
|
||||
},
|
||||
{ /* CX18_ENC_STREAM_TYPE_TS */
|
||||
"TS",
|
||||
VFL_TYPE_GRABBER, -1,
|
||||
VFL_TYPE_VIDEO, -1,
|
||||
PCI_DMA_FROMDEVICE,
|
||||
},
|
||||
{ /* CX18_ENC_STREAM_TYPE_YUV */
|
||||
"encoder YUV",
|
||||
VFL_TYPE_GRABBER, CX18_V4L2_ENC_YUV_OFFSET,
|
||||
VFL_TYPE_VIDEO, CX18_V4L2_ENC_YUV_OFFSET,
|
||||
PCI_DMA_FROMDEVICE,
|
||||
V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
|
||||
V4L2_CAP_STREAMING | V4L2_CAP_AUDIO | V4L2_CAP_TUNER
|
||||
@ -74,13 +74,13 @@ static struct {
|
||||
},
|
||||
{ /* CX18_ENC_STREAM_TYPE_PCM */
|
||||
"encoder PCM audio",
|
||||
VFL_TYPE_GRABBER, CX18_V4L2_ENC_PCM_OFFSET,
|
||||
VFL_TYPE_VIDEO, CX18_V4L2_ENC_PCM_OFFSET,
|
||||
PCI_DMA_FROMDEVICE,
|
||||
V4L2_CAP_TUNER | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE,
|
||||
},
|
||||
{ /* CX18_ENC_STREAM_TYPE_IDX */
|
||||
"encoder IDX",
|
||||
VFL_TYPE_GRABBER, -1,
|
||||
VFL_TYPE_VIDEO, -1,
|
||||
PCI_DMA_FROMDEVICE,
|
||||
},
|
||||
{ /* CX18_ENC_STREAM_TYPE_RAD */
|
||||
@ -434,7 +434,7 @@ static int cx18_reg_dev(struct cx18 *cx, int type)
|
||||
name = video_device_node_name(&s->video_dev);
|
||||
|
||||
switch (vfl_type) {
|
||||
case VFL_TYPE_GRABBER:
|
||||
case VFL_TYPE_VIDEO:
|
||||
CX18_INFO("Registered device %s for %s (%d x %d.%02d kB)\n",
|
||||
name, s->name, cx->stream_buffers[type],
|
||||
cx->stream_buf_size[type] / 1024,
|
||||
|
@ -1545,7 +1545,7 @@ int cx23885_417_register(struct cx23885_dev *dev)
|
||||
if (dev->tuner_type != TUNER_ABSENT)
|
||||
dev->v4l_device->device_caps |= V4L2_CAP_TUNER;
|
||||
err = video_register_device(dev->v4l_device,
|
||||
VFL_TYPE_GRABBER, -1);
|
||||
VFL_TYPE_VIDEO, -1);
|
||||
if (err < 0) {
|
||||
pr_info("%s: can't register mpeg device\n", dev->name);
|
||||
return err;
|
||||
|
@ -1304,7 +1304,7 @@ int cx23885_video_register(struct cx23885_dev *dev)
|
||||
V4L2_CAP_AUDIO | V4L2_CAP_VIDEO_CAPTURE;
|
||||
if (dev->tuner_type != TUNER_ABSENT)
|
||||
dev->video_dev->device_caps |= V4L2_CAP_TUNER;
|
||||
err = video_register_device(dev->video_dev, VFL_TYPE_GRABBER,
|
||||
err = video_register_device(dev->video_dev, VFL_TYPE_VIDEO,
|
||||
video_nr[dev->nr]);
|
||||
if (err < 0) {
|
||||
pr_info("%s: can't register video device\n",
|
||||
|
@ -757,7 +757,7 @@ int cx25821_video_register(struct cx25821_dev *dev)
|
||||
snprintf(vdev->name, sizeof(vdev->name), "%s #%d", dev->name, i);
|
||||
video_set_drvdata(vdev, chan);
|
||||
|
||||
err = video_register_device(vdev, VFL_TYPE_GRABBER,
|
||||
err = video_register_device(vdev, VFL_TYPE_VIDEO,
|
||||
video_nr[dev->nr]);
|
||||
|
||||
if (err < 0)
|
||||
|
@ -1138,7 +1138,7 @@ static int blackbird_register_video(struct cx8802_dev *dev)
|
||||
V4L2_CAP_VIDEO_CAPTURE;
|
||||
if (dev->core->board.tuner_type != UNSET)
|
||||
dev->mpeg_dev.device_caps |= V4L2_CAP_TUNER;
|
||||
err = video_register_device(&dev->mpeg_dev, VFL_TYPE_GRABBER, -1);
|
||||
err = video_register_device(&dev->mpeg_dev, VFL_TYPE_VIDEO, -1);
|
||||
if (err < 0) {
|
||||
pr_info("can't register mpeg device\n");
|
||||
return err;
|
||||
|
@ -1451,7 +1451,7 @@ static int cx8800_initdev(struct pci_dev *pci_dev,
|
||||
V4L2_CAP_VIDEO_CAPTURE;
|
||||
if (core->board.tuner_type != UNSET)
|
||||
dev->video_dev.device_caps |= V4L2_CAP_TUNER;
|
||||
err = video_register_device(&dev->video_dev, VFL_TYPE_GRABBER,
|
||||
err = video_register_device(&dev->video_dev, VFL_TYPE_VIDEO,
|
||||
video_nr[core->nr]);
|
||||
if (err < 0) {
|
||||
pr_err("can't register video device\n");
|
||||
|
@ -550,7 +550,7 @@ static int dt3155_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
IRQF_SHARED, DT3155_NAME, pd);
|
||||
if (err)
|
||||
goto err_iounmap;
|
||||
err = video_register_device(&pd->vdev, VFL_TYPE_GRABBER, -1);
|
||||
err = video_register_device(&pd->vdev, VFL_TYPE_VIDEO, -1);
|
||||
if (err)
|
||||
goto err_free_irq;
|
||||
dev_info(&pdev->dev, "/dev/video%i is ready\n", pd->vdev.minor);
|
||||
|
@ -1647,7 +1647,7 @@ static int cio2_queue_init(struct cio2_device *cio2, struct cio2_queue *q)
|
||||
vdev->queue = &q->vbq;
|
||||
vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE_MPLANE | V4L2_CAP_STREAMING;
|
||||
video_set_drvdata(vdev, cio2);
|
||||
r = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
|
||||
r = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
|
||||
if (r) {
|
||||
dev_err(&cio2->pci_dev->dev,
|
||||
"failed to register video device (%d)\n", r);
|
||||
|
@ -99,7 +99,7 @@ static struct {
|
||||
} ivtv_stream_info[] = {
|
||||
{ /* IVTV_ENC_STREAM_TYPE_MPG */
|
||||
"encoder MPG",
|
||||
VFL_TYPE_GRABBER, 0,
|
||||
VFL_TYPE_VIDEO, 0,
|
||||
PCI_DMA_FROMDEVICE, 0,
|
||||
V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TUNER |
|
||||
V4L2_CAP_AUDIO | V4L2_CAP_READWRITE,
|
||||
@ -107,7 +107,7 @@ static struct {
|
||||
},
|
||||
{ /* IVTV_ENC_STREAM_TYPE_YUV */
|
||||
"encoder YUV",
|
||||
VFL_TYPE_GRABBER, IVTV_V4L2_ENC_YUV_OFFSET,
|
||||
VFL_TYPE_VIDEO, IVTV_V4L2_ENC_YUV_OFFSET,
|
||||
PCI_DMA_FROMDEVICE, 0,
|
||||
V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TUNER |
|
||||
V4L2_CAP_AUDIO | V4L2_CAP_READWRITE,
|
||||
@ -123,7 +123,7 @@ static struct {
|
||||
},
|
||||
{ /* IVTV_ENC_STREAM_TYPE_PCM */
|
||||
"encoder PCM",
|
||||
VFL_TYPE_GRABBER, IVTV_V4L2_ENC_PCM_OFFSET,
|
||||
VFL_TYPE_VIDEO, IVTV_V4L2_ENC_PCM_OFFSET,
|
||||
PCI_DMA_FROMDEVICE, 0,
|
||||
V4L2_CAP_TUNER | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE,
|
||||
&ivtv_v4l2_enc_fops
|
||||
@ -137,7 +137,7 @@ static struct {
|
||||
},
|
||||
{ /* IVTV_DEC_STREAM_TYPE_MPG */
|
||||
"decoder MPG",
|
||||
VFL_TYPE_GRABBER, IVTV_V4L2_DEC_MPG_OFFSET,
|
||||
VFL_TYPE_VIDEO, IVTV_V4L2_DEC_MPG_OFFSET,
|
||||
PCI_DMA_TODEVICE, 0,
|
||||
V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE,
|
||||
&ivtv_v4l2_dec_fops
|
||||
@ -158,7 +158,7 @@ static struct {
|
||||
},
|
||||
{ /* IVTV_DEC_STREAM_TYPE_YUV */
|
||||
"decoder YUV",
|
||||
VFL_TYPE_GRABBER, IVTV_V4L2_DEC_YUV_OFFSET,
|
||||
VFL_TYPE_VIDEO, IVTV_V4L2_DEC_YUV_OFFSET,
|
||||
PCI_DMA_TODEVICE, 0,
|
||||
V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE,
|
||||
&ivtv_v4l2_dec_fops
|
||||
@ -318,7 +318,7 @@ static int ivtv_reg_dev(struct ivtv *itv, int type)
|
||||
name = video_device_node_name(&s->vdev);
|
||||
|
||||
switch (vfl_type) {
|
||||
case VFL_TYPE_GRABBER:
|
||||
case VFL_TYPE_VIDEO:
|
||||
IVTV_INFO("Registered device %s for %s (%d kB)\n",
|
||||
name, s->name, itv->options.kilobytes[type]);
|
||||
break;
|
||||
|
@ -1711,7 +1711,7 @@ static int meye_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
|
||||
v4l2_ctrl_handler_setup(&meye.hdl);
|
||||
meye.vdev.ctrl_handler = &meye.hdl;
|
||||
|
||||
if (video_register_device(&meye.vdev, VFL_TYPE_GRABBER,
|
||||
if (video_register_device(&meye.vdev, VFL_TYPE_VIDEO,
|
||||
video_nr) < 0) {
|
||||
v4l2_err(v4l2_dev, "video_register_device failed\n");
|
||||
goto outvideoreg;
|
||||
|
@ -1214,7 +1214,7 @@ static int saa7134_initdev(struct pci_dev *pci_dev,
|
||||
if (saa7134_no_overlay <= 0)
|
||||
dev->video_dev->device_caps |= V4L2_CAP_VIDEO_OVERLAY;
|
||||
|
||||
err = video_register_device(dev->video_dev,VFL_TYPE_GRABBER,
|
||||
err = video_register_device(dev->video_dev,VFL_TYPE_VIDEO,
|
||||
video_nr[dev->nr]);
|
||||
if (err < 0) {
|
||||
pr_info("%s: can't register video device\n",
|
||||
|
@ -291,7 +291,7 @@ static int empress_init(struct saa7134_dev *dev)
|
||||
dev->empress_dev->device_caps |= V4L2_CAP_TUNER;
|
||||
|
||||
video_set_drvdata(dev->empress_dev, dev);
|
||||
err = video_register_device(dev->empress_dev,VFL_TYPE_GRABBER,
|
||||
err = video_register_device(dev->empress_dev,VFL_TYPE_VIDEO,
|
||||
empress_nr[dev->nr]);
|
||||
if (err < 0) {
|
||||
pr_info("%s: can't register video device\n",
|
||||
|
@ -289,7 +289,7 @@ static int hexium_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_d
|
||||
vv_data.vid_ops.vidioc_enum_input = vidioc_enum_input;
|
||||
vv_data.vid_ops.vidioc_g_input = vidioc_g_input;
|
||||
vv_data.vid_ops.vidioc_s_input = vidioc_s_input;
|
||||
ret = saa7146_register_device(&hexium->video_dev, dev, "hexium gemini", VFL_TYPE_GRABBER);
|
||||
ret = saa7146_register_device(&hexium->video_dev, dev, "hexium gemini", VFL_TYPE_VIDEO);
|
||||
if (ret < 0) {
|
||||
pr_err("cannot register capture v4l2 device. skipping.\n");
|
||||
saa7146_vv_release(dev);
|
||||
|
@ -362,7 +362,7 @@ static int hexium_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_d
|
||||
vv_data.vid_ops.vidioc_enum_input = vidioc_enum_input;
|
||||
vv_data.vid_ops.vidioc_g_input = vidioc_g_input;
|
||||
vv_data.vid_ops.vidioc_s_input = vidioc_s_input;
|
||||
if (0 != saa7146_register_device(&hexium->video_dev, dev, "hexium orion", VFL_TYPE_GRABBER)) {
|
||||
if (0 != saa7146_register_device(&hexium->video_dev, dev, "hexium orion", VFL_TYPE_VIDEO)) {
|
||||
pr_err("cannot register capture v4l2 device. skipping.\n");
|
||||
return -1;
|
||||
}
|
||||
|
@ -707,7 +707,7 @@ static int mxb_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_data
|
||||
vv_data.vid_ops.vidioc_g_register = vidioc_g_register;
|
||||
vv_data.vid_ops.vidioc_s_register = vidioc_s_register;
|
||||
#endif
|
||||
if (saa7146_register_device(&mxb->video_dev, dev, "mxb", VFL_TYPE_GRABBER)) {
|
||||
if (saa7146_register_device(&mxb->video_dev, dev, "mxb", VFL_TYPE_VIDEO)) {
|
||||
ERR("cannot register capture v4l2 device. skipping.\n");
|
||||
saa7146_vv_release(dev);
|
||||
return -1;
|
||||
|
@ -1087,7 +1087,7 @@ int saa7164_encoder_register(struct saa7164_port *port)
|
||||
v4l2_ctrl_handler_setup(hdl);
|
||||
video_set_drvdata(port->v4l_device, port);
|
||||
result = video_register_device(port->v4l_device,
|
||||
VFL_TYPE_GRABBER, -1);
|
||||
VFL_TYPE_VIDEO, -1);
|
||||
if (result < 0) {
|
||||
printk(KERN_INFO "%s: can't register mpeg device\n",
|
||||
dev->name);
|
||||
|
@ -1304,7 +1304,7 @@ static struct solo_enc_dev *solo_enc_alloc(struct solo_dev *solo_dev,
|
||||
solo_enc->vfd->queue = &solo_enc->vidq;
|
||||
solo_enc->vfd->lock = &solo_enc->lock;
|
||||
video_set_drvdata(solo_enc->vfd, solo_enc);
|
||||
ret = video_register_device(solo_enc->vfd, VFL_TYPE_GRABBER, nr);
|
||||
ret = video_register_device(solo_enc->vfd, VFL_TYPE_VIDEO, nr);
|
||||
if (ret < 0)
|
||||
goto vdev_release;
|
||||
|
||||
|
@ -692,7 +692,7 @@ int solo_v4l2_init(struct solo_dev *solo_dev, unsigned nr)
|
||||
while (erase_off(solo_dev))
|
||||
/* Do nothing */;
|
||||
|
||||
ret = video_register_device(solo_dev->vfd, VFL_TYPE_GRABBER, nr);
|
||||
ret = video_register_device(solo_dev->vfd, VFL_TYPE_VIDEO, nr);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
|
||||
|
@ -1069,7 +1069,7 @@ static int sta2x11_vip_init_one(struct pci_dev *pdev,
|
||||
vip->video_dev.lock = &vip->v4l_lock;
|
||||
video_set_drvdata(&vip->video_dev, vip);
|
||||
|
||||
ret = video_register_device(&vip->video_dev, VFL_TYPE_GRABBER, -1);
|
||||
ret = video_register_device(&vip->video_dev, VFL_TYPE_VIDEO, -1);
|
||||
if (ret)
|
||||
goto vrelease;
|
||||
|
||||
|
@ -831,7 +831,7 @@ int av7110_init_v4l(struct av7110 *av7110)
|
||||
if (FW_VERSION(av7110->arm_app) < 0x2623)
|
||||
vv_data->capabilities &= ~V4L2_CAP_SLICED_VBI_OUTPUT;
|
||||
|
||||
if (saa7146_register_device(&av7110->v4l_dev, dev, "av7110", VFL_TYPE_GRABBER)) {
|
||||
if (saa7146_register_device(&av7110->v4l_dev, dev, "av7110", VFL_TYPE_VIDEO)) {
|
||||
ERR("cannot register capture device. skipping\n");
|
||||
saa7146_vv_release(dev);
|
||||
return -ENODEV;
|
||||
|
@ -1470,7 +1470,7 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio
|
||||
vv_data.vid_ops.vidioc_g_input = vidioc_g_input;
|
||||
vv_data.vid_ops.vidioc_s_input = vidioc_s_input;
|
||||
|
||||
if ((err = saa7146_register_device(&budget_av->vd, dev, "knc1", VFL_TYPE_GRABBER))) {
|
||||
if ((err = saa7146_register_device(&budget_av->vd, dev, "knc1", VFL_TYPE_VIDEO))) {
|
||||
/* fixme: proper cleanup here */
|
||||
ERR("cannot register capture v4l2 device\n");
|
||||
saa7146_vv_release(dev);
|
||||
|
@ -1156,7 +1156,7 @@ static int tw5864_video_input_init(struct tw5864_input *input, int video_nr)
|
||||
input->gop = GOP_SIZE;
|
||||
input->frame_interval = 1;
|
||||
|
||||
ret = video_register_device(&input->vdev, VFL_TYPE_GRABBER, video_nr);
|
||||
ret = video_register_device(&input->vdev, VFL_TYPE_VIDEO, video_nr);
|
||||
if (ret)
|
||||
goto free_v4l2_hdl;
|
||||
|
||||
|
@ -962,7 +962,7 @@ int tw68_video_init2(struct tw68_dev *dev, int video_nr)
|
||||
dev->vdev.lock = &dev->lock;
|
||||
dev->vdev.queue = &dev->vidq;
|
||||
video_set_drvdata(&dev->vdev, dev);
|
||||
return video_register_device(&dev->vdev, VFL_TYPE_GRABBER, video_nr);
|
||||
return video_register_device(&dev->vdev, VFL_TYPE_VIDEO, video_nr);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1282,7 +1282,7 @@ int tw686x_video_init(struct tw686x_dev *dev)
|
||||
vc->device = vdev;
|
||||
video_set_drvdata(vdev, vc);
|
||||
|
||||
err = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
|
||||
err = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
|
||||
if (err < 0)
|
||||
goto error;
|
||||
vc->num = vdev->num;
|
||||
|
@ -507,6 +507,18 @@ config VIDEO_SUN8I_DEINTERLACE
|
||||
capability found on some SoCs, like H3.
|
||||
To compile this driver as a module choose m here.
|
||||
|
||||
config VIDEO_SUN8I_ROTATE
|
||||
tristate "Allwinner DE2 rotation driver"
|
||||
depends on VIDEO_DEV && VIDEO_V4L2
|
||||
depends on ARCH_SUNXI || COMPILE_TEST
|
||||
depends on COMMON_CLK && OF
|
||||
depends on PM
|
||||
select VIDEOBUF2_DMA_CONTIG
|
||||
select V4L2_MEM2MEM_DEV
|
||||
help
|
||||
Support for the Allwinner DE2 rotation unit.
|
||||
To compile this driver as a module choose m here.
|
||||
|
||||
endif # V4L_MEM2MEM_DRIVERS
|
||||
|
||||
# TI VIDEO PORT Helper Modules
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user