mirror of
https://github.com/torvalds/linux.git
synced 2024-12-26 12:52:30 +00:00
media updates for v6.5-rc1
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE+QmuaPwR3wnBdVwACF8+vY7k4RUFAmSlDSsACgkQCF8+vY7k 4RXm5Q/+IvIzEr2CBTmIvSXOdLjXiBvIB/tGCJ5617K7AWpASodm5BJLgJwJrLhi JZc12iXSJIwx+7YUVTYoBzf5AnQcXLmKx+MdPmks5AZeMxErPCnTIrUDZYCKogYg P0vt0HYmDgz0iMObrvnnZN5yXEUVqoWtob5sJSrgxin9cRGyWkE1B8PFNf+jHZXm /PWYSfQK4epbXKSYklJz5rTKdx+TIqSpv88EeFlB0QAZgRWbkkWUNutmtQm+nLRD vk70Uwgj8kUcY9A4A2YlWhojtt1T7YEhrfBUwtR+86wvNtcpTR0VHoQGydYiQD8u 5Ydut+5+94RzyIJI8IISSuFUyc0cOj4PO7UU9xULVoytsxgTN0ocC8+k9eAXw4Uc IMQM2OZsKFRIJ1Mrk8at0a5zij8zCMl1bveqvwdzSmAgN1mc9WgQEXOGFuWlAKMX D0nODJeyTvUQF7Z29LaYTKXjrP02aHN97dkS12jRIFQ3CQ7pIugIUxW2RC+Hqlk5 +R9UN933Ag0Gzd5giOQ1/iWCrFj1iI8j6VXF24bT9UGpJjAS0raevnUwoIQfloge SGqWM+s4/XZYyZh1nI1AaM/Y8C/W9ieF4WLX1sqA+407CgMSIVO0BA7QC/SOz3jn 5qp+C+NRudsig4+D8Kljr5CenPN9Jh2fwLbvpTFT4O2IWpx+OlA= =YwIy -----END PGP SIGNATURE----- Merge tag 'media/v6.5-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media Pull media updates from Mauro Carvalho Chehab: - Lots of improvement at atomisp driver, which is starting to look in good shape - Mediatek vcodec driver has gained support for av1 and hevc stateless codecs - New sensor driver: ov01a10 - verisilicon driver has gained AV1 entropy helpers - tegra-video has gained support for Tegra20 parallel input - dvb core has gained an extra property to better support DVB-S2X - as usual, lots of cleanups, fixes and improvements on media drivers * tag 'media/v6.5-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (253 commits) media: wl128x: fix a clang warning media: dvb: mb86a20s: get rid of a clang-15 warning media: cec: i2c: ch7322: also select REGMAP media: add HAS_IOPORT dependencies media: tc358746: select CONFIG_GENERIC_PHY media: mediatek: vcodec: Add dbgfs help function media: mediatek: vcodec: Add encode to support dbgfs media: mediatek: vcodec: Change dbgfs interface to support encode media: mediatek: vcodec: Get each instance format type media: mediatek: vcodec: Get each context resolution information media: mediatek: vcodec: Add a debugfs file to get different useful information media: mediatek: vcodec: Add debug params to control different log level media: mediatek: vcodec: Add debugfs interface to get debug information media: mediatek: vcodec: support stateless AV1 decoder media: verisilicon: Conditionally ignore native formats media: verisilicon: Enable AV1 decoder on rk3588 media: verisilicon: Add film grain feature to AV1 driver media: verisilicon: Add Rockchip AV1 decoder media: verisilicon: Add AV1 entropy helpers media: verisilicon: Compute motion vectors size for AV1 frames ...
This commit is contained in:
commit
15ac468614
@ -10,8 +10,8 @@ Introduction
|
||||
============
|
||||
|
||||
This file documents the driver for the Rockchip ISP1 that is part of RK3288
|
||||
and RK3399 SoCs. The driver is located under drivers/staging/media/rkisp1
|
||||
and uses the Media-Controller API.
|
||||
and RK3399 SoCs. The driver is located under drivers/media/platform/rockchip/
|
||||
rkisp1 and uses the Media-Controller API.
|
||||
|
||||
Revisions
|
||||
=========
|
||||
|
@ -73,6 +73,18 @@ properties:
|
||||
avdd-dsi-csi-supply:
|
||||
description: DSI/CSI power supply. Must supply 1.2 V.
|
||||
|
||||
vip:
|
||||
$ref: /schemas/display/tegra/nvidia,tegra20-vip.yaml
|
||||
|
||||
ports:
|
||||
$ref: /schemas/graph.yaml#/properties/ports
|
||||
|
||||
properties:
|
||||
port@0:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description:
|
||||
Input from the VIP (parallel input capture) module
|
||||
|
||||
patternProperties:
|
||||
"^csi@[0-9a-f]+$":
|
||||
type: object
|
||||
@ -108,6 +120,22 @@ examples:
|
||||
#include <dt-bindings/clock/tegra20-car.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
camera@48 {
|
||||
compatible = "aptina,mt9v111";
|
||||
reg = <0x48>;
|
||||
clocks = <&camera_clk>;
|
||||
|
||||
port {
|
||||
mt9v111_out: endpoint {
|
||||
remote-endpoint = <&vi_vip_in>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
vi@54080000 {
|
||||
compatible = "nvidia,tegra20-vi";
|
||||
reg = <0x54080000 0x00040000>;
|
||||
@ -115,6 +143,37 @@ examples:
|
||||
clocks = <&tegra_car TEGRA20_CLK_VI>;
|
||||
resets = <&tegra_car 100>;
|
||||
reset-names = "vi";
|
||||
|
||||
vip {
|
||||
compatible = "nvidia,tegra20-vip";
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
vi_vip_in: endpoint {
|
||||
remote-endpoint = <&mt9v111_out>;
|
||||
};
|
||||
};
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
vi_vip_out: endpoint {
|
||||
remote-endpoint = <&vi_in>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
vi_in: endpoint {
|
||||
remote-endpoint = <&vi_vip_out>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
- |
|
||||
|
@ -0,0 +1,41 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/display/tegra/nvidia,tegra20-vip.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: NVIDIA Tegra VIP (parallel video capture) controller
|
||||
|
||||
maintainers:
|
||||
- Luca Ceresoli <luca.ceresoli@bootlin.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- nvidia,tegra20-vip
|
||||
|
||||
ports:
|
||||
$ref: /schemas/graph.yaml#/properties/ports
|
||||
|
||||
properties:
|
||||
port@0:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description:
|
||||
Port receiving the video stream from the sensor
|
||||
|
||||
port@1:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description:
|
||||
Port sending the video stream to the VI
|
||||
|
||||
required:
|
||||
- port@0
|
||||
- port@1
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- ports
|
||||
|
||||
# see nvidia,tegra20-vi.yaml for an example
|
@ -65,9 +65,14 @@ properties:
|
||||
|
||||
properties:
|
||||
data-lanes: true
|
||||
bus-type:
|
||||
enum:
|
||||
- 1 # MEDIA_BUS_TYPE_CSI2_CPHY
|
||||
- 4 # MEDIA_BUS_TYPE_CSI2_DPHY
|
||||
|
||||
required:
|
||||
- data-lanes
|
||||
- bus-type
|
||||
|
||||
required:
|
||||
- port@4
|
||||
@ -82,6 +87,7 @@ additionalProperties: false
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/media/video-interfaces.h>
|
||||
|
||||
i2c@e6508000 {
|
||||
#address-cells = <1>;
|
||||
@ -101,6 +107,7 @@ examples:
|
||||
port@4 {
|
||||
reg = <4>;
|
||||
max96712_out0: endpoint {
|
||||
bus-type = <MEDIA_BUS_TYPE_CSI2_DPHY>;
|
||||
clock-lanes = <0>;
|
||||
data-lanes = <1 2 3 4>;
|
||||
remote-endpoint = <&csi40_in>;
|
||||
|
@ -155,7 +155,7 @@ examples:
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/clock/qcom,gcc-msm8916.h>
|
||||
|
||||
camss: camss@1b00000 {
|
||||
camss: camss@1b0ac00 {
|
||||
compatible = "qcom,msm8916-camss";
|
||||
|
||||
clocks = <&gcc GCC_CAMSS_TOP_AHB_CLK>,
|
||||
|
@ -221,7 +221,7 @@ examples:
|
||||
#include <dt-bindings/clock/qcom,gcc-msm8996.h>
|
||||
#include <dt-bindings/clock/qcom,mmcc-msm8996.h>
|
||||
|
||||
camss: camss@a00000 {
|
||||
camss: camss@a34000 {
|
||||
compatible = "qcom,msm8996-camss";
|
||||
|
||||
clocks = <&mmcc CAMSS_TOP_AHB_CLK>,
|
||||
|
@ -227,7 +227,7 @@ examples:
|
||||
#include <dt-bindings/clock/qcom,gcc-sdm660.h>
|
||||
#include <dt-bindings/clock/qcom,mmcc-sdm660.h>
|
||||
|
||||
camss: camss@ca00000 {
|
||||
camss: camss@ca00020 {
|
||||
compatible = "qcom,sdm660-camss";
|
||||
|
||||
clocks = <&mmcc CAMSS_AHB_CLK>,
|
||||
|
@ -219,7 +219,7 @@ examples:
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
|
||||
camss: camss@a00000 {
|
||||
camss: camss@acb3000 {
|
||||
compatible = "qcom,sdm845-camss";
|
||||
|
||||
clocks = <&clock_camcc CAM_CC_CAMNOC_AXI_CLK>,
|
||||
|
@ -24,6 +24,7 @@ properties:
|
||||
- rockchip,rk3399-vpu
|
||||
- rockchip,px30-vpu
|
||||
- rockchip,rk3568-vpu
|
||||
- rockchip,rk3588-av1-vpu
|
||||
- items:
|
||||
- const: rockchip,rk3188-vpu
|
||||
- const: rockchip,rk3066-vpu
|
||||
|
@ -151,3 +151,25 @@ used to obtain device's power state after the power state transition:
|
||||
The function returns a non-zero value if it succeeded getting the power count or
|
||||
runtime PM was disabled, in either of which cases the driver may proceed to
|
||||
access the device.
|
||||
|
||||
Rotation, orientation and flipping
|
||||
----------------------------------
|
||||
|
||||
Some systems have the camera sensor mounted upside down compared to its natural
|
||||
mounting rotation. In such cases, drivers shall expose the information to
|
||||
userspace with the :ref:`V4L2_CID_CAMERA_SENSOR_ROTATION
|
||||
<v4l2-camera-sensor-rotation>` control.
|
||||
|
||||
Sensor drivers shall also report the sensor's mounting orientation with the
|
||||
:ref:`V4L2_CID_CAMERA_SENSOR_ORIENTATION <v4l2-camera-sensor-orientation>`.
|
||||
|
||||
Use ``v4l2_fwnode_device_parse()`` to obtain rotation and orientation
|
||||
information from system firmware and ``v4l2_ctrl_new_fwnode_properties()`` to
|
||||
register the appropriate controls.
|
||||
|
||||
Sensor drivers that have any vertical or horizontal flips embedded in the
|
||||
register programming sequences shall initialize the V4L2_CID_HFLIP and
|
||||
V4L2_CID_VFLIP controls with the values programmed by the register sequences.
|
||||
The default values of these controls shall be 0 (disabled). Especially these
|
||||
controls shall not be inverted, independently of the sensor's mounting
|
||||
rotation.
|
||||
|
@ -142,6 +142,10 @@ ignore symbol FEC_26_45
|
||||
ignore symbol FEC_28_45
|
||||
ignore symbol FEC_32_45
|
||||
ignore symbol FEC_77_90
|
||||
ignore symbol FEC_11_45
|
||||
ignore symbol FEC_4_15
|
||||
ignore symbol FEC_14_45
|
||||
ignore symbol FEC_7_15
|
||||
|
||||
ignore symbol TRANSMISSION_MODE_AUTO
|
||||
ignore symbol TRANSMISSION_MODE_1K
|
||||
|
@ -427,3 +427,12 @@ VP9
|
||||
:title: VP9 Bitstream & Decoding Process Specification
|
||||
|
||||
:author: Adrian Grange (Google), Peter de Rivaz (Argon Design), Jonathan Hunt (Argon Design)
|
||||
|
||||
.. _av1:
|
||||
|
||||
AV1
|
||||
===
|
||||
|
||||
:title: AV1 Bitstream & Decoding Process Specification
|
||||
|
||||
:author: Peter de Rivaz, Argon Design Ltd, Jack Haughton, Argon Design Ltd
|
||||
|
@ -506,6 +506,8 @@ enum v4l2_scene_mode -
|
||||
value down. A value of zero stops the motion if one is in progress
|
||||
and has no effect otherwise.
|
||||
|
||||
.. _v4l2-camera-sensor-orientation:
|
||||
|
||||
``V4L2_CID_CAMERA_ORIENTATION (menu)``
|
||||
This read-only control describes the camera orientation by reporting its
|
||||
mounting position on the device where the camera is installed. The control
|
||||
@ -536,6 +538,7 @@ enum v4l2_scene_mode -
|
||||
- The camera is not directly attached to the device and is freely movable.
|
||||
|
||||
|
||||
.. _v4l2-camera-sensor-rotation:
|
||||
|
||||
``V4L2_CID_CAMERA_SENSOR_ROTATION (integer)``
|
||||
This read-only control describes the rotation correction in degrees in the
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -12,10 +12,10 @@ These formats are used for the :ref:`metadata` interface only.
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
pixfmt-meta-d4xx
|
||||
pixfmt-meta-intel-ipu3
|
||||
pixfmt-meta-rkisp1
|
||||
pixfmt-meta-uvc
|
||||
pixfmt-meta-vsp1-hgo
|
||||
pixfmt-meta-vsp1-hgt
|
||||
pixfmt-meta-vivid
|
||||
metafmt-d4xx
|
||||
metafmt-intel-ipu3
|
||||
metafmt-rkisp1
|
||||
metafmt-uvc
|
||||
metafmt-vsp1-hgo
|
||||
metafmt-vsp1-hgt
|
||||
metafmt-vivid
|
||||
|
@ -12,7 +12,7 @@ Intel D4xx UVC Cameras Metadata
|
||||
Description
|
||||
===========
|
||||
|
||||
Intel D4xx (D435 and other) cameras include per-frame metadata in their UVC
|
||||
Intel D4xx (D435, D455 and others) cameras include per-frame metadata in their UVC
|
||||
payload headers, following the Microsoft(R) UVC extension proposal [1_]. That
|
||||
means, that the private D4XX metadata, following the standard UVC header, is
|
||||
organised in blocks. D4XX cameras implement several standard block types,
|
||||
@ -26,6 +26,8 @@ V4L2_META_FMT_UVC with the only difference, that it also includes proprietary
|
||||
payload header data. D4xx cameras use bulk transfers and only send one payload
|
||||
per frame, therefore their headers cannot be larger than 255 bytes.
|
||||
|
||||
This document implements Intel Configuration version 3 [9_].
|
||||
|
||||
Below are proprietary Microsoft style metadata types, used by D4xx cameras,
|
||||
where all fields are in little endian order:
|
||||
|
||||
@ -43,10 +45,10 @@ where all fields are in little endian order:
|
||||
* - __u32 ID
|
||||
- 0x80000000
|
||||
* - __u32 Size
|
||||
- Size in bytes (currently 56)
|
||||
- Size in bytes, include ID (all protocol versions: 60)
|
||||
* - __u32 Version
|
||||
- Version of this structure. The documentation herein corresponds to
|
||||
version xxx. The version number will be incremented when new fields are
|
||||
- Version of this structure. The documentation herein covers versions 1,
|
||||
2 and 3. The version number will be incremented when new fields are
|
||||
added.
|
||||
* - __u32 Flags
|
||||
- A bitmask of flags: see [2_] below
|
||||
@ -72,13 +74,17 @@ where all fields are in little endian order:
|
||||
- Bottom border of the AE Region of Interest
|
||||
* - __u32 Preset
|
||||
- Preset selector value, default: 0, unless changed by the user
|
||||
* - __u32 Laser mode
|
||||
- 0: off, 1: on
|
||||
* - __u8 Emitter mode (v3 only) (__u32 Laser mode for v1) [8_]
|
||||
- 0: off, 1: on, same as __u32 Laser mode for v1
|
||||
* - __u8 RFU byte (v3 only)
|
||||
- Spare byte for future use
|
||||
* - __u16 LED Power (v3 only)
|
||||
- Led power value 0-360 (F416 SKU)
|
||||
* - :cspan:`1` *Capture Timing*
|
||||
* - __u32 ID
|
||||
- 0x80000001
|
||||
* - __u32 Size
|
||||
- Size in bytes (currently 40)
|
||||
- Size in bytes, include ID (all protocol versions: 40)
|
||||
* - __u32 Version
|
||||
- Version of this structure. The documentation herein corresponds to
|
||||
version xxx. The version number will be incremented when new fields are
|
||||
@ -101,7 +107,7 @@ where all fields are in little endian order:
|
||||
* - __u32 ID
|
||||
- 0x80000002
|
||||
* - __u32 Size
|
||||
- Size in bytes (currently 40)
|
||||
- Size in bytes, include ID (v1:36, v3:40)
|
||||
* - __u32 Version
|
||||
- Version of this structure. The documentation herein corresponds to
|
||||
version xxx. The version number will be incremented when new fields are
|
||||
@ -124,6 +130,14 @@ where all fields are in little endian order:
|
||||
- Requested frame rate per second
|
||||
* - __u16 Trigger
|
||||
- Byte 0: bit 0: depth and RGB are synchronised, bit 1: external trigger
|
||||
* - __u16 Calibration count (v3 only)
|
||||
- Calibration counter, see [4_] below
|
||||
* - __u8 GPIO input data (v3 only)
|
||||
- GPIO readout, see [4_] below (Supported from FW 5.12.7.0)
|
||||
* - __u32 Sub-preset info (v3 only)
|
||||
- Sub-preset choice information, see [4_] below
|
||||
* - __u8 reserved (v3 only)
|
||||
- RFU byte.
|
||||
|
||||
.. _1:
|
||||
|
||||
@ -140,6 +154,8 @@ where all fields are in little endian order:
|
||||
0x00000010 Exposure priority
|
||||
0x00000020 AE ROI
|
||||
0x00000040 Preset
|
||||
0x00000080 Emitter mode
|
||||
0x00000100 LED Power
|
||||
|
||||
.. _3:
|
||||
|
||||
@ -165,6 +181,8 @@ where all fields are in little endian order:
|
||||
0x00000040 Framerate
|
||||
0x00000080 Trigger
|
||||
0x00000100 Cal count
|
||||
0x00000200 GPIO Input Data
|
||||
0x00000400 Sub-preset Info
|
||||
|
||||
.. _5:
|
||||
|
||||
@ -211,3 +229,24 @@ Left sensor: ::
|
||||
Fish Eye sensor: ::
|
||||
|
||||
1 RAW8
|
||||
|
||||
.. _8:
|
||||
|
||||
[8] The "Laser mode" has been replaced in version 3 by three different fields.
|
||||
"Laser" has been renamed to "Emitter" as there are multiple technologies for
|
||||
camera projectors. As we have another field for "Laser Power" we introduced
|
||||
"LED Power" for extra emitter.
|
||||
|
||||
The "Laser mode" __u32 fiels has been split into: ::
|
||||
1 __u8 Emitter mode
|
||||
2 __u8 RFU byte
|
||||
3 __u16 LED Power
|
||||
|
||||
This is a change between versions 1 and 3. All versions 1, 2 and 3 are backward
|
||||
compatible with the same data format and they are supported. See [2_] for which
|
||||
attributes are valid.
|
||||
|
||||
.. _9:
|
||||
|
||||
[9] LibRealSense SDK metadata source:
|
||||
https://github.com/IntelRealSense/librealsense/blob/master/src/metadata.h
|
@ -258,6 +258,22 @@ Compressed Formats
|
||||
RV9 players - the format and decoder did not change, only
|
||||
the encoder did. As a result, it uses the same FourCC.
|
||||
|
||||
* .. _V4L2-PIX-FMT-AV1-FRAME:
|
||||
|
||||
- ``V4L2_PIX_FMT_AV1_FRAME``
|
||||
- 'AV1F'
|
||||
- AV1 parsed frame, including the frame header, as extracted from the container.
|
||||
This format is adapted for stateless video decoders that implement a AV1
|
||||
pipeline with the :ref:`stateless_decoder`. Metadata associated with the
|
||||
frame to decode is required to be passed through the
|
||||
``V4L2_CID_STATELESS_AV1_SEQUENCE``, ``V4L2_CID_STATELESS_AV1_FRAME``,
|
||||
and ``V4L2_CID_STATELESS_AV1_TILE_GROUP_ENTRY`` controls.
|
||||
See the :ref:`associated Codec Control IDs <v4l2-codec-stateless-av1>`.
|
||||
Exactly one output and one capture buffer must be provided for use with
|
||||
this pixel format. The output buffer must contain the appropriate number
|
||||
of macroblocks to decode a full corresponding frame to the matching
|
||||
capture buffer.
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\normalsize
|
||||
|
@ -137,6 +137,13 @@ All components are stored with the same number of bits per component.
|
||||
- Cb, Cr
|
||||
- No
|
||||
- Linear
|
||||
* - V4L2_PIX_FMT_NV15_4L4
|
||||
- 'VT15'
|
||||
- 15
|
||||
- 4:2:0
|
||||
- Cb, Cr
|
||||
- Yes
|
||||
- 4x4 tiles
|
||||
* - V4L2_PIX_FMT_NV16
|
||||
- 'NV16'
|
||||
- 8
|
||||
@ -378,6 +385,15 @@ two non-contiguous planes.
|
||||
|
||||
Example V4L2_PIX_FMT_NV12MT memory layout of tiles
|
||||
|
||||
.. _V4L2-PIX-FMT-NV15-4L4:
|
||||
|
||||
Tiled NV15
|
||||
----------
|
||||
|
||||
Semi-planar 10-bit YUV 4:2:0 formats, using 4x4 tiling.
|
||||
All components are packed without any padding between each other.
|
||||
As a side-effect, each group of 4 components are stored over 5 bytes
|
||||
(YYYY or UVUV = 4 * 10 bits = 40 bits = 5 bytes).
|
||||
|
||||
.. _V4L2-PIX-FMT-NV16:
|
||||
.. _V4L2-PIX-FMT-NV61:
|
||||
|
@ -185,12 +185,12 @@ still cause this situation.
|
||||
- ``p_u32``
|
||||
- A pointer to a matrix control of unsigned 32-bit values. Valid if
|
||||
this control is of type ``V4L2_CTRL_TYPE_U32``.
|
||||
* - __u32 *
|
||||
* - __s32 *
|
||||
- ``p_s32``
|
||||
- A pointer to a matrix control of signed 32-bit values. Valid if
|
||||
this control is of type ``V4L2_CTRL_TYPE_INTEGER`` and
|
||||
``V4L2_CTRL_FLAG_HAS_PAYLOAD`` is set.
|
||||
* - __u32 *
|
||||
* - __s64 *
|
||||
- ``p_s64``
|
||||
- A pointer to a matrix control of signed 64-bit values. Valid if
|
||||
this control is of type ``V4L2_CTRL_TYPE_INTEGER64`` and
|
||||
@ -279,6 +279,22 @@ still cause this situation.
|
||||
- ``p_hevc_decode_params``
|
||||
- A pointer to a struct :c:type:`v4l2_ctrl_hevc_decode_params`. Valid if this
|
||||
control is of type ``V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS``.
|
||||
* - struct :c:type:`v4l2_ctrl_av1_sequence` *
|
||||
- ``p_av1_sequence``
|
||||
- A pointer to a struct :c:type:`v4l2_ctrl_av1_sequence`. Valid if this control is
|
||||
of type ``V4L2_CTRL_TYPE_AV1_SEQUENCE``.
|
||||
* - struct :c:type:`v4l2_ctrl_av1_tile_group_entry` *
|
||||
- ``p_av1_tile_group_entry``
|
||||
- A pointer to a struct :c:type:`v4l2_ctrl_av1_tile_group_entry`. Valid if this control is
|
||||
of type ``V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY``.
|
||||
* - struct :c:type:`v4l2_ctrl_av1_frame` *
|
||||
- ``p_av1_frame``
|
||||
- A pointer to a struct :c:type:`v4l2_ctrl_av1_frame`. Valid if this control is
|
||||
of type ``V4L2_CTRL_TYPE_AV1_FRAME``.
|
||||
* - struct :c:type:`v4l2_ctrl_av1_film_grain` *
|
||||
- ``p_av1_film_grain``
|
||||
- A pointer to a struct :c:type:`v4l2_ctrl_av1_film_grain`. Valid if this control is
|
||||
of type ``V4L2_CTRL_TYPE_AV1_FILM_GRAIN``.
|
||||
* - void *
|
||||
- ``ptr``
|
||||
- A pointer to a compound type which can be an N-dimensional array
|
||||
|
@ -525,6 +525,30 @@ See also the examples in :ref:`control`.
|
||||
- n/a
|
||||
- A struct :c:type:`v4l2_ctrl_vp9_frame`, containing VP9
|
||||
frame decode parameters for stateless video decoders.
|
||||
* - ``V4L2_CTRL_TYPE_AV1_SEQUENCE``
|
||||
- n/a
|
||||
- n/a
|
||||
- n/a
|
||||
- A struct :c:type:`v4l2_ctrl_av1_sequence`, containing AV1 Sequence OBU
|
||||
decoding parameters for stateless video decoders.
|
||||
* - ``V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY``
|
||||
- n/a
|
||||
- n/a
|
||||
- n/a
|
||||
- A struct :c:type:`v4l2_ctrl_av1_tile_group_entry`, containing AV1 Tile Group
|
||||
OBU decoding parameters for stateless video decoders.
|
||||
* - ``V4L2_CTRL_TYPE_AV1_FRAME``
|
||||
- n/a
|
||||
- n/a
|
||||
- n/a
|
||||
- A struct :c:type:`v4l2_ctrl_av1_frame`, containing AV1 Frame/Frame
|
||||
Header OBU decoding parameters for stateless video decoders.
|
||||
* - ``V4L2_CTRL_TYPE_AV1_FILM_GRAIN``
|
||||
- n/a
|
||||
- n/a
|
||||
- n/a
|
||||
- A struct :c:type:`v4l2_ctrl_av1_film_grain`, containing AV1 Film Grain
|
||||
parameters for stateless video decoders.
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
|
@ -122,7 +122,7 @@ for all the route entries and call ``VIDIOC_SUBDEV_G_ROUTING`` again.
|
||||
:widths: 3 1 4
|
||||
|
||||
* - V4L2_SUBDEV_ROUTE_FL_ACTIVE
|
||||
- 0
|
||||
- 0x0001
|
||||
- The route is enabled. Set by applications.
|
||||
|
||||
Return Value
|
||||
|
@ -161,6 +161,10 @@ replace symbol V4L2_CTRL_TYPE_HEVC_PPS :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_AV1_SEQUENCE :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_AV1_FRAME :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_AV1_FILM_GRAIN :c:type:`v4l2_ctrl_type`
|
||||
|
||||
# V4L2 capability defines
|
||||
replace define V4L2_CAP_VIDEO_CAPTURE device-capabilities
|
||||
|
15
MAINTAINERS
15
MAINTAINERS
@ -10570,7 +10570,7 @@ L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/admin-guide/media/ipu3.rst
|
||||
F: Documentation/admin-guide/media/ipu3_rcb.svg
|
||||
F: Documentation/userspace-api/media/v4l/pixfmt-meta-intel-ipu3.rst
|
||||
F: Documentation/userspace-api/media/v4l/metafmt-intel-ipu3.rst
|
||||
F: drivers/staging/media/ipu3/
|
||||
|
||||
INTEL ISHTP ECLITE DRIVER
|
||||
@ -15607,6 +15607,13 @@ L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/og01a1b.c
|
||||
|
||||
OMNIVISION OV01A10 SENSOR DRIVER
|
||||
M: Bingbu Cao <bingbu.cao@intel.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
F: drivers/media/i2c/ov01a10.c
|
||||
|
||||
OMNIVISION OV02A10 SENSOR DRIVER
|
||||
M: Dongchun Zhu <dongchun.zhu@mediatek.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
@ -17713,6 +17720,7 @@ F: drivers/usb/typec/tcpm/qcom/
|
||||
QUALCOMM VENUS VIDEO ACCELERATOR DRIVER
|
||||
M: Stanimir Varbanov <stanimir.k.varbanov@gmail.com>
|
||||
M: Vikash Garodia <quic_vgarodia@quicinc.com>
|
||||
R: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
|
||||
L: linux-media@vger.kernel.org
|
||||
L: linux-arm-msm@vger.kernel.org
|
||||
S: Maintained
|
||||
@ -18401,7 +18409,7 @@ L: linux-rockchip@lists.infradead.org
|
||||
S: Maintained
|
||||
F: Documentation/admin-guide/media/rkisp1.rst
|
||||
F: Documentation/devicetree/bindings/media/rockchip-isp1.yaml
|
||||
F: Documentation/userspace-api/media/v4l/pixfmt-meta-rkisp1.rst
|
||||
F: Documentation/userspace-api/media/v4l/metafmt-rkisp1.rst
|
||||
F: drivers/media/platform/rockchip/rkisp1
|
||||
F: include/uapi/linux/rkisp1-config.h
|
||||
|
||||
@ -21050,10 +21058,13 @@ TEGRA VIDEO DRIVER
|
||||
M: Thierry Reding <thierry.reding@gmail.com>
|
||||
M: Jonathan Hunter <jonathanh@nvidia.com>
|
||||
M: Sowjanya Komatineni <skomatineni@nvidia.com>
|
||||
M: Luca Ceresoli <luca.ceresoli@bootlin.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
L: linux-tegra@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-host1x.yaml
|
||||
F: Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-vi.yaml
|
||||
F: Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-vip.yaml
|
||||
F: drivers/staging/media/tegra-video/
|
||||
|
||||
TEGRA XUSB PADCTL DRIVER
|
||||
|
@ -5,6 +5,7 @@
|
||||
config CEC_CH7322
|
||||
tristate "Chrontel CH7322 CEC controller"
|
||||
depends on I2C
|
||||
select REGMAP
|
||||
select REGMAP_I2C
|
||||
select CEC_CORE
|
||||
help
|
||||
|
@ -591,7 +591,7 @@ static struct i2c_driver ch7322_i2c_driver = {
|
||||
.name = "ch7322",
|
||||
.of_match_table = of_match_ptr(ch7322_of_match),
|
||||
},
|
||||
.probe_new = ch7322_probe,
|
||||
.probe = ch7322_probe,
|
||||
.remove = ch7322_remove,
|
||||
};
|
||||
|
||||
|
@ -133,8 +133,8 @@ int saa7146_wait_for_debi_done(struct saa7146_dev *dev, int nobusyloop)
|
||||
****************************************************************************/
|
||||
|
||||
/* this is videobuf_vmalloc_to_sg() from videobuf-dma-sg.c
|
||||
make sure virt has been allocated with vmalloc_32(), otherwise the BUG()
|
||||
may be triggered on highmem machines */
|
||||
make sure virt has been allocated with vmalloc_32(), otherwise return NULL
|
||||
on highmem machines */
|
||||
static struct scatterlist* vmalloc_to_sg(unsigned char *virt, int nr_pages)
|
||||
{
|
||||
struct scatterlist *sglist;
|
||||
@ -150,7 +150,7 @@ static struct scatterlist* vmalloc_to_sg(unsigned char *virt, int nr_pages)
|
||||
if (NULL == pg)
|
||||
goto err;
|
||||
if (WARN_ON(PageHighMem(pg)))
|
||||
return NULL;
|
||||
goto err;
|
||||
sg_set_page(&sglist[i], pg, PAGE_SIZE, 0);
|
||||
}
|
||||
return sglist;
|
||||
|
@ -61,21 +61,21 @@ static const char * const dnames[] = {
|
||||
#define DVB_MAX_IDS 4
|
||||
|
||||
static const u8 minor_type[] = {
|
||||
[DVB_DEVICE_VIDEO] = 0,
|
||||
[DVB_DEVICE_AUDIO] = 1,
|
||||
[DVB_DEVICE_SEC] = 2,
|
||||
[DVB_DEVICE_FRONTEND] = 3,
|
||||
[DVB_DEVICE_DEMUX] = 4,
|
||||
[DVB_DEVICE_DVR] = 5,
|
||||
[DVB_DEVICE_CA] = 6,
|
||||
[DVB_DEVICE_NET] = 7,
|
||||
[DVB_DEVICE_OSD] = 8,
|
||||
[DVB_DEVICE_VIDEO] = 0,
|
||||
[DVB_DEVICE_AUDIO] = 1,
|
||||
[DVB_DEVICE_SEC] = 2,
|
||||
[DVB_DEVICE_FRONTEND] = 3,
|
||||
[DVB_DEVICE_DEMUX] = 4,
|
||||
[DVB_DEVICE_DVR] = 5,
|
||||
[DVB_DEVICE_CA] = 6,
|
||||
[DVB_DEVICE_NET] = 7,
|
||||
[DVB_DEVICE_OSD] = 8,
|
||||
};
|
||||
|
||||
#define nums2minor(num, type, id) \
|
||||
(((num) << 6) | ((id) << 4) | minor_type[type])
|
||||
(((num) << 6) | ((id) << 4) | minor_type[type])
|
||||
|
||||
#define MAX_DVB_MINORS (DVB_MAX_ADAPTERS*64)
|
||||
#define MAX_DVB_MINORS (DVB_MAX_ADAPTERS * 64)
|
||||
#endif
|
||||
|
||||
static struct class *dvb_class;
|
||||
@ -112,9 +112,7 @@ fail:
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
||||
static const struct file_operations dvb_device_fops =
|
||||
{
|
||||
static const struct file_operations dvb_device_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = dvb_device_open,
|
||||
.llseek = noop_llseek,
|
||||
@ -147,7 +145,6 @@ int dvb_generic_open(struct inode *inode, struct file *file)
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_generic_open);
|
||||
|
||||
|
||||
int dvb_generic_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct dvb_device *dvbdev = file->private_data;
|
||||
@ -155,11 +152,10 @@ int dvb_generic_release(struct inode *inode, struct file *file)
|
||||
if (!dvbdev)
|
||||
return -ENODEV;
|
||||
|
||||
if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
|
||||
if ((file->f_flags & O_ACCMODE) == O_RDONLY)
|
||||
dvbdev->readers++;
|
||||
} else {
|
||||
else
|
||||
dvbdev->writers++;
|
||||
}
|
||||
|
||||
dvbdev->users++;
|
||||
|
||||
@ -169,7 +165,6 @@ int dvb_generic_release(struct inode *inode, struct file *file)
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_generic_release);
|
||||
|
||||
|
||||
long dvb_generic_ioctl(struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
@ -185,13 +180,13 @@ long dvb_generic_ioctl(struct file *file,
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_generic_ioctl);
|
||||
|
||||
|
||||
static int dvbdev_get_free_id (struct dvb_adapter *adap, int type)
|
||||
static int dvbdev_get_free_id(struct dvb_adapter *adap, int type)
|
||||
{
|
||||
u32 id = 0;
|
||||
|
||||
while (id < DVB_MAX_IDS) {
|
||||
struct dvb_device *dev;
|
||||
|
||||
list_for_each_entry(dev, &adap->device_list, list_head)
|
||||
if (dev->type == type && dev->id == id)
|
||||
goto skip;
|
||||
@ -245,7 +240,7 @@ static void dvb_media_device_free(struct dvb_device *dvbdev)
|
||||
|
||||
#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
|
||||
static int dvb_create_tsout_entity(struct dvb_device *dvbdev,
|
||||
const char *name, int npads)
|
||||
const char *name, int npads)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -387,7 +382,7 @@ static int dvb_create_media_entity(struct dvb_device *dvbdev,
|
||||
|
||||
static int dvb_register_media_device(struct dvb_device *dvbdev,
|
||||
int type, int minor,
|
||||
unsigned demux_sink_pads)
|
||||
unsigned int demux_sink_pads)
|
||||
{
|
||||
#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
|
||||
struct media_link *link;
|
||||
@ -462,7 +457,8 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
|
||||
mutex_lock(&dvbdev_register_lock);
|
||||
|
||||
if ((id = dvbdev_get_free_id (adap, type)) < 0) {
|
||||
id = dvbdev_get_free_id(adap, type);
|
||||
if (id < 0) {
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
*pdvbdev = NULL;
|
||||
pr_err("%s: couldn't find free device id\n", __func__);
|
||||
@ -470,7 +466,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
}
|
||||
|
||||
*pdvbdev = dvbdev = kzalloc(sizeof(*dvbdev), GFP_KERNEL);
|
||||
if (!dvbdev){
|
||||
if (!dvbdev) {
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
return -ENOMEM;
|
||||
}
|
||||
@ -482,14 +478,13 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
*/
|
||||
list_for_each_entry(node, &dvbdevfops_list, list_head) {
|
||||
if (node->fops->owner == adap->module &&
|
||||
node->type == type &&
|
||||
node->template == template) {
|
||||
node->type == type && node->template == template) {
|
||||
dvbdevfops = node->fops;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (dvbdevfops == NULL) {
|
||||
if (!dvbdevfops) {
|
||||
dvbdevfops = kmemdup(template->fops, sizeof(*dvbdevfops), GFP_KERNEL);
|
||||
if (!dvbdevfops) {
|
||||
kfree(dvbdev);
|
||||
@ -497,7 +492,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
new_node = kzalloc(sizeof(struct dvbdevfops_node), GFP_KERNEL);
|
||||
new_node = kzalloc(sizeof(*new_node), GFP_KERNEL);
|
||||
if (!new_node) {
|
||||
kfree(dvbdevfops);
|
||||
kfree(dvbdev);
|
||||
@ -508,7 +503,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
new_node->fops = dvbdevfops;
|
||||
new_node->type = type;
|
||||
new_node->template = template;
|
||||
list_add_tail (&new_node->list_head, &dvbdevfops_list);
|
||||
list_add_tail(&new_node->list_head, &dvbdevfops_list);
|
||||
}
|
||||
|
||||
memcpy(dvbdev, template, sizeof(struct dvb_device));
|
||||
@ -518,21 +513,21 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
dvbdev->adapter = adap;
|
||||
dvbdev->priv = priv;
|
||||
dvbdev->fops = dvbdevfops;
|
||||
init_waitqueue_head (&dvbdev->wait_queue);
|
||||
init_waitqueue_head(&dvbdev->wait_queue);
|
||||
dvbdevfops->owner = adap->module;
|
||||
list_add_tail (&dvbdev->list_head, &adap->device_list);
|
||||
list_add_tail(&dvbdev->list_head, &adap->device_list);
|
||||
down_write(&minor_rwsem);
|
||||
#ifdef CONFIG_DVB_DYNAMIC_MINORS
|
||||
for (minor = 0; minor < MAX_DVB_MINORS; minor++)
|
||||
if (dvb_minors[minor] == NULL)
|
||||
if (!dvb_minors[minor])
|
||||
break;
|
||||
if (minor == MAX_DVB_MINORS) {
|
||||
if (new_node) {
|
||||
list_del (&new_node->list_head);
|
||||
list_del(&new_node->list_head);
|
||||
kfree(dvbdevfops);
|
||||
kfree(new_node);
|
||||
}
|
||||
list_del (&dvbdev->list_head);
|
||||
list_del(&dvbdev->list_head);
|
||||
kfree(dvbdev);
|
||||
up_write(&minor_rwsem);
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
@ -547,14 +542,14 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
ret = dvb_register_media_device(dvbdev, type, minor, demux_sink_pads);
|
||||
if (ret) {
|
||||
pr_err("%s: dvb_register_media_device failed to create the mediagraph\n",
|
||||
__func__);
|
||||
__func__);
|
||||
if (new_node) {
|
||||
list_del (&new_node->list_head);
|
||||
list_del(&new_node->list_head);
|
||||
kfree(dvbdevfops);
|
||||
kfree(new_node);
|
||||
}
|
||||
dvb_media_device_free(dvbdev);
|
||||
list_del (&dvbdev->list_head);
|
||||
list_del(&dvbdev->list_head);
|
||||
kfree(dvbdev);
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
return ret;
|
||||
@ -567,12 +562,12 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
pr_err("%s: failed to create device dvb%d.%s%d (%ld)\n",
|
||||
__func__, adap->num, dnames[type], id, PTR_ERR(clsdev));
|
||||
if (new_node) {
|
||||
list_del (&new_node->list_head);
|
||||
list_del(&new_node->list_head);
|
||||
kfree(dvbdevfops);
|
||||
kfree(new_node);
|
||||
}
|
||||
dvb_media_device_free(dvbdev);
|
||||
list_del (&dvbdev->list_head);
|
||||
list_del(&dvbdev->list_head);
|
||||
kfree(dvbdev);
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
return PTR_ERR(clsdev);
|
||||
@ -586,7 +581,6 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_register_device);
|
||||
|
||||
|
||||
void dvb_remove_device(struct dvb_device *dvbdev)
|
||||
{
|
||||
if (!dvbdev)
|
||||
@ -601,19 +595,17 @@ void dvb_remove_device(struct dvb_device *dvbdev)
|
||||
|
||||
device_destroy(dvb_class, MKDEV(DVB_MAJOR, dvbdev->minor));
|
||||
|
||||
list_del (&dvbdev->list_head);
|
||||
list_del(&dvbdev->list_head);
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_remove_device);
|
||||
|
||||
|
||||
static void dvb_free_device(struct kref *ref)
|
||||
{
|
||||
struct dvb_device *dvbdev = container_of(ref, struct dvb_device, ref);
|
||||
|
||||
kfree (dvbdev);
|
||||
kfree(dvbdev);
|
||||
}
|
||||
|
||||
|
||||
struct dvb_device *dvb_device_get(struct dvb_device *dvbdev)
|
||||
{
|
||||
kref_get(&dvbdev->ref);
|
||||
@ -621,14 +613,12 @@ struct dvb_device *dvb_device_get(struct dvb_device *dvbdev)
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_device_get);
|
||||
|
||||
|
||||
void dvb_device_put(struct dvb_device *dvbdev)
|
||||
{
|
||||
if (dvbdev)
|
||||
kref_put(&dvbdev->ref, dvb_free_device);
|
||||
}
|
||||
|
||||
|
||||
void dvb_unregister_device(struct dvb_device *dvbdev)
|
||||
{
|
||||
dvb_remove_device(dvbdev);
|
||||
@ -636,7 +626,6 @@ void dvb_unregister_device(struct dvb_device *dvbdev)
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_unregister_device);
|
||||
|
||||
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER_DVB
|
||||
|
||||
static int dvb_create_io_intf_links(struct dvb_adapter *adap,
|
||||
@ -669,9 +658,9 @@ int dvb_create_media_graph(struct dvb_adapter *adap,
|
||||
struct media_entity *demux = NULL, *ca = NULL;
|
||||
struct media_link *link;
|
||||
struct media_interface *intf;
|
||||
unsigned demux_pad = 0;
|
||||
unsigned dvr_pad = 0;
|
||||
unsigned ntuner = 0, ndemod = 0;
|
||||
unsigned int demux_pad = 0;
|
||||
unsigned int dvr_pad = 0;
|
||||
unsigned int ntuner = 0, ndemod = 0;
|
||||
int ret, pad_source, pad_sink;
|
||||
static const char *connector_name = "Television";
|
||||
|
||||
@ -741,7 +730,7 @@ int dvb_create_media_graph(struct dvb_adapter *adap,
|
||||
MEDIA_LNK_FL_ENABLED,
|
||||
false);
|
||||
} else {
|
||||
pad_sink = media_get_pad_index(tuner, true,
|
||||
pad_sink = media_get_pad_index(tuner, MEDIA_PAD_FL_SINK,
|
||||
PAD_SIGNAL_ANALOG);
|
||||
if (pad_sink < 0)
|
||||
return -EINVAL;
|
||||
@ -759,7 +748,7 @@ int dvb_create_media_graph(struct dvb_adapter *adap,
|
||||
|
||||
if (ntuner && ndemod) {
|
||||
/* NOTE: first found tuner source pad presumed correct */
|
||||
pad_source = media_get_pad_index(tuner, false,
|
||||
pad_source = media_get_pad_index(tuner, MEDIA_PAD_FL_SOURCE,
|
||||
PAD_SIGNAL_ANALOG);
|
||||
if (pad_source < 0)
|
||||
return -EINVAL;
|
||||
@ -795,18 +784,18 @@ int dvb_create_media_graph(struct dvb_adapter *adap,
|
||||
media_device_for_each_entity(entity, mdev) {
|
||||
if (entity->function == MEDIA_ENT_F_IO_DTV) {
|
||||
if (!strncmp(entity->name, DVR_TSOUT,
|
||||
strlen(DVR_TSOUT))) {
|
||||
strlen(DVR_TSOUT))) {
|
||||
ret = media_create_pad_link(demux,
|
||||
++dvr_pad,
|
||||
entity, 0, 0);
|
||||
++dvr_pad,
|
||||
entity, 0, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
if (!strncmp(entity->name, DEMUX_TSOUT,
|
||||
strlen(DEMUX_TSOUT))) {
|
||||
strlen(DEMUX_TSOUT))) {
|
||||
ret = media_create_pad_link(demux,
|
||||
++demux_pad,
|
||||
entity, 0, 0);
|
||||
++demux_pad,
|
||||
entity, 0, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
@ -864,8 +853,10 @@ EXPORT_SYMBOL_GPL(dvb_create_media_graph);
|
||||
static int dvbdev_check_free_adapter_num(int num)
|
||||
{
|
||||
struct list_head *entry;
|
||||
|
||||
list_for_each(entry, &dvb_adapter_list) {
|
||||
struct dvb_adapter *adap;
|
||||
|
||||
adap = list_entry(entry, struct dvb_adapter, list_head);
|
||||
if (adap->num == num)
|
||||
return 0;
|
||||
@ -873,7 +864,7 @@ static int dvbdev_check_free_adapter_num(int num)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int dvbdev_get_free_adapter_num (void)
|
||||
static int dvbdev_get_free_adapter_num(void)
|
||||
{
|
||||
int num = 0;
|
||||
|
||||
@ -886,7 +877,6 @@ static int dvbdev_get_free_adapter_num (void)
|
||||
return -ENFILE;
|
||||
}
|
||||
|
||||
|
||||
int dvb_register_adapter(struct dvb_adapter *adap, const char *name,
|
||||
struct module *module, struct device *device,
|
||||
short *adapter_nums)
|
||||
@ -913,8 +903,8 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name,
|
||||
return -ENFILE;
|
||||
}
|
||||
|
||||
memset (adap, 0, sizeof(struct dvb_adapter));
|
||||
INIT_LIST_HEAD (&adap->device_list);
|
||||
memset(adap, 0, sizeof(struct dvb_adapter));
|
||||
INIT_LIST_HEAD(&adap->device_list);
|
||||
|
||||
pr_info("DVB: registering new adapter (%s)\n", name);
|
||||
|
||||
@ -924,13 +914,13 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name,
|
||||
adap->device = device;
|
||||
adap->mfe_shared = 0;
|
||||
adap->mfe_dvbdev = NULL;
|
||||
mutex_init (&adap->mfe_lock);
|
||||
mutex_init(&adap->mfe_lock);
|
||||
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER_DVB
|
||||
mutex_init(&adap->mdev_lock);
|
||||
#endif
|
||||
|
||||
list_add_tail (&adap->list_head, &dvb_adapter_list);
|
||||
list_add_tail(&adap->list_head, &dvb_adapter_list);
|
||||
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
|
||||
@ -938,25 +928,26 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name,
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_register_adapter);
|
||||
|
||||
|
||||
int dvb_unregister_adapter(struct dvb_adapter *adap)
|
||||
{
|
||||
mutex_lock(&dvbdev_register_lock);
|
||||
list_del (&adap->list_head);
|
||||
list_del(&adap->list_head);
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_unregister_adapter);
|
||||
|
||||
/* if the miracle happens and "generic_usercopy()" is included into
|
||||
the kernel, then this can vanish. please don't make the mistake and
|
||||
define this as video_usercopy(). this will introduce a dependency
|
||||
to the v4l "videodev.o" module, which is unnecessary for some
|
||||
cards (ie. the budget dvb-cards don't need the v4l module...) */
|
||||
/*
|
||||
* if the miracle happens and "generic_usercopy()" is included into
|
||||
* the kernel, then this can vanish. please don't make the mistake and
|
||||
* define this as video_usercopy(). this will introduce a dependency
|
||||
* to the v4l "videodev.o" module, which is unnecessary for some
|
||||
* cards (ie. the budget dvb-cards don't need the v4l module...)
|
||||
*/
|
||||
int dvb_usercopy(struct file *file,
|
||||
unsigned int cmd, unsigned long arg,
|
||||
int (*func)(struct file *file,
|
||||
unsigned int cmd, void *arg))
|
||||
unsigned int cmd, unsigned long arg,
|
||||
int (*func)(struct file *file,
|
||||
unsigned int cmd, void *arg))
|
||||
{
|
||||
char sbuf[128];
|
||||
void *mbuf = NULL;
|
||||
@ -970,7 +961,7 @@ int dvb_usercopy(struct file *file,
|
||||
* For this command, the pointer is actually an integer
|
||||
* argument.
|
||||
*/
|
||||
parg = (void *) arg;
|
||||
parg = (void *)arg;
|
||||
break;
|
||||
case _IOC_READ: /* some v4l ioctls are marked wrong ... */
|
||||
case _IOC_WRITE:
|
||||
@ -980,7 +971,7 @@ int dvb_usercopy(struct file *file,
|
||||
} else {
|
||||
/* too big to allocate from stack */
|
||||
mbuf = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL);
|
||||
if (NULL == mbuf)
|
||||
if (!mbuf)
|
||||
return -ENOMEM;
|
||||
parg = mbuf;
|
||||
}
|
||||
@ -992,15 +983,15 @@ int dvb_usercopy(struct file *file,
|
||||
}
|
||||
|
||||
/* call driver */
|
||||
if ((err = func(file, cmd, parg)) == -ENOIOCTLCMD)
|
||||
err = func(file, cmd, parg);
|
||||
if (err == -ENOIOCTLCMD)
|
||||
err = -ENOTTY;
|
||||
|
||||
if (err < 0)
|
||||
goto out;
|
||||
|
||||
/* Copy results into user buffer */
|
||||
switch (_IOC_DIR(cmd))
|
||||
{
|
||||
switch (_IOC_DIR(cmd)) {
|
||||
case _IOC_READ:
|
||||
case (_IOC_WRITE | _IOC_READ):
|
||||
if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
|
||||
@ -1080,19 +1071,20 @@ static char *dvb_devnode(const struct device *dev, umode_t *mode)
|
||||
dvbdev->adapter->num, dnames[dvbdev->type], dvbdev->id);
|
||||
}
|
||||
|
||||
|
||||
static int __init init_dvbdev(void)
|
||||
{
|
||||
int retval;
|
||||
dev_t dev = MKDEV(DVB_MAJOR, 0);
|
||||
|
||||
if ((retval = register_chrdev_region(dev, MAX_DVB_MINORS, "DVB")) != 0) {
|
||||
retval = register_chrdev_region(dev, MAX_DVB_MINORS, "DVB");
|
||||
if (retval != 0) {
|
||||
pr_err("dvb-core: unable to get major %d\n", DVB_MAJOR);
|
||||
return retval;
|
||||
}
|
||||
|
||||
cdev_init(&dvb_device_cdev, &dvb_device_fops);
|
||||
if ((retval = cdev_add(&dvb_device_cdev, dev, MAX_DVB_MINORS)) != 0) {
|
||||
retval = cdev_add(&dvb_device_cdev, dev, MAX_DVB_MINORS);
|
||||
if (retval != 0) {
|
||||
pr_err("dvb-core: unable register character device\n");
|
||||
goto error;
|
||||
}
|
||||
@ -1112,7 +1104,6 @@ error:
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
static void __exit exit_dvbdev(void)
|
||||
{
|
||||
struct dvbdevfops_node *node, *next;
|
||||
@ -1122,7 +1113,7 @@ static void __exit exit_dvbdev(void)
|
||||
unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS);
|
||||
|
||||
list_for_each_entry_safe(node, next, &dvbdevfops_list, list_head) {
|
||||
list_del (&node->list_head);
|
||||
list_del(&node->list_head);
|
||||
kfree(node->fops);
|
||||
kfree(node);
|
||||
}
|
||||
|
@ -266,7 +266,7 @@ static struct i2c_driver a8293_driver = {
|
||||
.name = "a8293",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe_new = a8293_probe,
|
||||
.probe = a8293_probe,
|
||||
.remove = a8293_remove,
|
||||
.id_table = a8293_id_table,
|
||||
};
|
||||
|
@ -1563,7 +1563,7 @@ static struct i2c_driver af9013_driver = {
|
||||
.name = "af9013",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe_new = af9013_probe,
|
||||
.probe = af9013_probe,
|
||||
.remove = af9013_remove,
|
||||
.id_table = af9013_id_table,
|
||||
};
|
||||
|
@ -1183,7 +1183,7 @@ static struct i2c_driver af9033_driver = {
|
||||
.name = "af9033",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe_new = af9033_probe,
|
||||
.probe = af9033_probe,
|
||||
.remove = af9033_remove,
|
||||
.id_table = af9033_id_table,
|
||||
};
|
||||
|
@ -776,7 +776,7 @@ static struct i2c_driver au8522_driver = {
|
||||
.driver = {
|
||||
.name = "au8522",
|
||||
},
|
||||
.probe_new = au8522_probe,
|
||||
.probe = au8522_probe,
|
||||
.remove = au8522_remove,
|
||||
.id_table = au8522_id,
|
||||
};
|
||||
|
@ -681,7 +681,7 @@ static struct i2c_driver cxd2099_driver = {
|
||||
.driver = {
|
||||
.name = "cxd2099",
|
||||
},
|
||||
.probe_new = cxd2099_probe,
|
||||
.probe = cxd2099_probe,
|
||||
.remove = cxd2099_remove,
|
||||
.id_table = cxd2099_id,
|
||||
};
|
||||
|
@ -733,7 +733,7 @@ static struct i2c_driver cxd2820r_driver = {
|
||||
.name = "cxd2820r",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe_new = cxd2820r_probe,
|
||||
.probe = cxd2820r_probe,
|
||||
.remove = cxd2820r_remove,
|
||||
.id_table = cxd2820r_id_table,
|
||||
};
|
||||
|
@ -942,7 +942,7 @@ static struct i2c_driver dvb_pll_driver = {
|
||||
.driver = {
|
||||
.name = "dvb_pll",
|
||||
},
|
||||
.probe_new = dvb_pll_probe,
|
||||
.probe = dvb_pll_probe,
|
||||
.remove = dvb_pll_remove,
|
||||
.id_table = dvb_pll_id,
|
||||
};
|
||||
|
@ -1110,7 +1110,7 @@ static struct i2c_driver helene_driver = {
|
||||
.driver = {
|
||||
.name = "helene",
|
||||
},
|
||||
.probe_new = helene_probe,
|
||||
.probe = helene_probe,
|
||||
.id_table = helene_id,
|
||||
};
|
||||
module_i2c_driver(helene_driver);
|
||||
|
@ -2249,7 +2249,7 @@ static struct i2c_driver lgdt3306a_driver = {
|
||||
.name = "lgdt3306a",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe_new = lgdt3306a_probe,
|
||||
.probe = lgdt3306a_probe,
|
||||
.remove = lgdt3306a_remove,
|
||||
.id_table = lgdt3306a_id_table,
|
||||
};
|
||||
|
@ -993,7 +993,7 @@ static struct i2c_driver lgdt330x_driver = {
|
||||
.name = "lgdt330x",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe_new = lgdt330x_probe,
|
||||
.probe = lgdt330x_probe,
|
||||
.remove = lgdt330x_remove,
|
||||
.id_table = lgdt330x_id_table,
|
||||
};
|
||||
|
@ -1941,7 +1941,7 @@ static struct i2c_driver m88ds3103_driver = {
|
||||
.name = "m88ds3103",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe_new = m88ds3103_probe,
|
||||
.probe = m88ds3103_probe,
|
||||
.remove = m88ds3103_remove,
|
||||
.id_table = m88ds3103_id_table,
|
||||
};
|
||||
|
@ -1569,7 +1569,7 @@ static int mb86a20s_get_stats(struct dvb_frontend *fe, int status_nr)
|
||||
u32 t_post_bit_error = 0, t_post_bit_count = 0;
|
||||
u32 block_error = 0, block_count = 0;
|
||||
u32 t_block_error = 0, t_block_count = 0;
|
||||
int active_layers = 0, pre_ber_layers = 0, post_ber_layers = 0;
|
||||
int pre_ber_layers = 0, post_ber_layers = 0;
|
||||
int per_layers = 0;
|
||||
|
||||
dev_dbg(&state->i2c->dev, "%s called.\n", __func__);
|
||||
@ -1589,9 +1589,6 @@ static int mb86a20s_get_stats(struct dvb_frontend *fe, int status_nr)
|
||||
|
||||
for (layer = 0; layer < NUM_LAYERS; layer++) {
|
||||
if (c->isdbt_layer_enabled & (1 << layer)) {
|
||||
/* Layer is active and has rc segments */
|
||||
active_layers++;
|
||||
|
||||
/* Handle BER before vterbi */
|
||||
rc = mb86a20s_get_pre_ber(fe, layer,
|
||||
&bit_error, &bit_count);
|
||||
|
@ -800,7 +800,7 @@ static struct i2c_driver mn88443x_driver = {
|
||||
.name = "mn88443x",
|
||||
.of_match_table = mn88443x_of_match,
|
||||
},
|
||||
.probe_new = mn88443x_probe,
|
||||
.probe = mn88443x_probe,
|
||||
.remove = mn88443x_remove,
|
||||
.id_table = mn88443x_i2c_id,
|
||||
};
|
||||
|
@ -718,7 +718,7 @@ static struct i2c_driver mn88472_driver = {
|
||||
.name = "mn88472",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe_new = mn88472_probe,
|
||||
.probe = mn88472_probe,
|
||||
.remove = mn88472_remove,
|
||||
.id_table = mn88472_id_table,
|
||||
};
|
||||
|
@ -753,7 +753,7 @@ static struct i2c_driver mn88473_driver = {
|
||||
.name = "mn88473",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe_new = mn88473_probe,
|
||||
.probe = mn88473_probe,
|
||||
.remove = mn88473_remove,
|
||||
.id_table = mn88473_id_table,
|
||||
};
|
||||
|
@ -1355,7 +1355,7 @@ static struct i2c_driver mxl692_driver = {
|
||||
.driver = {
|
||||
.name = "mxl692",
|
||||
},
|
||||
.probe_new = mxl692_probe,
|
||||
.probe = mxl692_probe,
|
||||
.remove = mxl692_remove,
|
||||
.id_table = mxl692_id_table,
|
||||
};
|
||||
|
@ -886,7 +886,7 @@ static struct i2c_driver rtl2830_driver = {
|
||||
.name = "rtl2830",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe_new = rtl2830_probe,
|
||||
.probe = rtl2830_probe,
|
||||
.remove = rtl2830_remove,
|
||||
.id_table = rtl2830_id_table,
|
||||
};
|
||||
|
@ -1135,7 +1135,7 @@ static struct i2c_driver rtl2832_driver = {
|
||||
.name = "rtl2832",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe_new = rtl2832_probe,
|
||||
.probe = rtl2832_probe,
|
||||
.remove = rtl2832_remove,
|
||||
.id_table = rtl2832_id_table,
|
||||
};
|
||||
|
@ -1292,7 +1292,7 @@ static struct i2c_driver si2165_driver = {
|
||||
.driver = {
|
||||
.name = "si2165",
|
||||
},
|
||||
.probe_new = si2165_probe,
|
||||
.probe = si2165_probe,
|
||||
.remove = si2165_remove,
|
||||
.id_table = si2165_id_table,
|
||||
};
|
||||
|
@ -798,7 +798,7 @@ static struct i2c_driver si2168_driver = {
|
||||
.name = "si2168",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe_new = si2168_probe,
|
||||
.probe = si2168_probe,
|
||||
.remove = si2168_remove,
|
||||
.id_table = si2168_id_table,
|
||||
};
|
||||
|
@ -416,7 +416,7 @@ static struct i2c_driver sp2_driver = {
|
||||
.driver = {
|
||||
.name = "sp2",
|
||||
},
|
||||
.probe_new = sp2_probe,
|
||||
.probe = sp2_probe,
|
||||
.remove = sp2_remove,
|
||||
.id_table = sp2_id,
|
||||
};
|
||||
|
@ -5084,7 +5084,7 @@ static struct i2c_driver stv090x_driver = {
|
||||
.name = "stv090x",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe_new = stv090x_probe,
|
||||
.probe = stv090x_probe,
|
||||
.remove = stv090x_remove,
|
||||
.id_table = stv090x_id_table,
|
||||
};
|
||||
|
@ -480,7 +480,7 @@ static struct i2c_driver stv6110x_driver = {
|
||||
.name = "stv6110x",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe_new = stv6110x_probe,
|
||||
.probe = stv6110x_probe,
|
||||
.remove = stv6110x_remove,
|
||||
.id_table = stv6110x_id_table,
|
||||
};
|
||||
|
@ -840,7 +840,7 @@ static struct i2c_driver tc90522_driver = {
|
||||
.driver = {
|
||||
.name = "tc90522",
|
||||
},
|
||||
.probe_new = tc90522_probe,
|
||||
.probe = tc90522_probe,
|
||||
.remove = tc90522_remove,
|
||||
.id_table = tc90522_id,
|
||||
};
|
||||
|
@ -1240,7 +1240,7 @@ static struct i2c_driver tda10071_driver = {
|
||||
.name = "tda10071",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe_new = tda10071_probe,
|
||||
.probe = tda10071_probe,
|
||||
.remove = tda10071_remove,
|
||||
.id_table = tda10071_id_table,
|
||||
};
|
||||
|
@ -720,7 +720,7 @@ static struct i2c_driver ts2020_driver = {
|
||||
.driver = {
|
||||
.name = "ts2020",
|
||||
},
|
||||
.probe_new = ts2020_probe,
|
||||
.probe = ts2020_probe,
|
||||
.remove = ts2020_remove,
|
||||
.id_table = ts2020_id_table,
|
||||
};
|
||||
|
@ -338,6 +338,19 @@ config VIDEO_OG01A1B
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called og01a1b.
|
||||
|
||||
config VIDEO_OV01A10
|
||||
tristate "OmniVision OV01A10 sensor support"
|
||||
depends on VIDEO_DEV && I2C
|
||||
select MEDIA_CONTROLLER
|
||||
select VIDEO_V4L2_SUBDEV_API
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV01A10 camera.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called ov01a10.
|
||||
|
||||
config VIDEO_OV02A10
|
||||
tristate "OmniVision OV02A10 sensor support"
|
||||
depends on VIDEO_DEV && I2C
|
||||
@ -1292,6 +1305,7 @@ config VIDEO_TC358746
|
||||
select VIDEO_V4L2_SUBDEV_API
|
||||
select MEDIA_CONTROLLER
|
||||
select V4L2_FWNODE
|
||||
select GENERIC_PHY
|
||||
select GENERIC_PHY_MIPI_DPHY
|
||||
select REGMAP_I2C
|
||||
help
|
||||
|
@ -67,6 +67,7 @@ obj-$(CONFIG_VIDEO_MT9V011) += mt9v011.o
|
||||
obj-$(CONFIG_VIDEO_MT9V032) += mt9v032.o
|
||||
obj-$(CONFIG_VIDEO_MT9V111) += mt9v111.o
|
||||
obj-$(CONFIG_VIDEO_OG01A1B) += og01a1b.o
|
||||
obj-$(CONFIG_VIDEO_OV01A10) += ov01a10.o
|
||||
obj-$(CONFIG_VIDEO_OV02A10) += ov02a10.o
|
||||
obj-$(CONFIG_VIDEO_OV08D10) += ov08d10.o
|
||||
obj-$(CONFIG_VIDEO_OV08X40) += ov08x40.o
|
||||
|
@ -370,7 +370,7 @@ static struct i2c_driver ad5820_i2c_driver = {
|
||||
.pm = &ad5820_pm,
|
||||
.of_match_table = ad5820_of_table,
|
||||
},
|
||||
.probe_new = ad5820_probe,
|
||||
.probe = ad5820_probe,
|
||||
.remove = ad5820_remove,
|
||||
.id_table = ad5820_id_table,
|
||||
};
|
||||
|
@ -535,7 +535,7 @@ static struct i2c_driver adp1653_i2c_driver = {
|
||||
.name = ADP1653_NAME,
|
||||
.pm = &adp1653_pm_ops,
|
||||
},
|
||||
.probe_new = adp1653_probe,
|
||||
.probe = adp1653_probe,
|
||||
.remove = adp1653_remove,
|
||||
.id_table = adp1653_id_table,
|
||||
};
|
||||
|
@ -387,7 +387,7 @@ static struct i2c_driver adv7170_driver = {
|
||||
.driver = {
|
||||
.name = "adv7170",
|
||||
},
|
||||
.probe_new = adv7170_probe,
|
||||
.probe = adv7170_probe,
|
||||
.remove = adv7170_remove,
|
||||
.id_table = adv7170_id,
|
||||
};
|
||||
|
@ -442,7 +442,7 @@ static struct i2c_driver adv7175_driver = {
|
||||
.driver = {
|
||||
.name = "adv7175",
|
||||
},
|
||||
.probe_new = adv7175_probe,
|
||||
.probe = adv7175_probe,
|
||||
.remove = adv7175_remove,
|
||||
.id_table = adv7175_id,
|
||||
};
|
||||
|
@ -1610,7 +1610,7 @@ static struct i2c_driver adv7180_driver = {
|
||||
.pm = ADV7180_PM_OPS,
|
||||
.of_match_table = of_match_ptr(adv7180_of_id),
|
||||
},
|
||||
.probe_new = adv7180_probe,
|
||||
.probe = adv7180_probe,
|
||||
.remove = adv7180_remove,
|
||||
.id_table = adv7180_id,
|
||||
};
|
||||
|
@ -631,7 +631,7 @@ static struct i2c_driver adv7183_driver = {
|
||||
.driver = {
|
||||
.name = "adv7183",
|
||||
},
|
||||
.probe_new = adv7183_probe,
|
||||
.probe = adv7183_probe,
|
||||
.remove = adv7183_remove,
|
||||
.id_table = adv7183_id,
|
||||
};
|
||||
|
@ -521,7 +521,7 @@ static struct i2c_driver adv7343_driver = {
|
||||
.of_match_table = of_match_ptr(adv7343_of_match),
|
||||
.name = "adv7343",
|
||||
},
|
||||
.probe_new = adv7343_probe,
|
||||
.probe = adv7343_probe,
|
||||
.remove = adv7343_remove,
|
||||
.id_table = adv7343_id,
|
||||
};
|
||||
|
@ -455,7 +455,7 @@ static struct i2c_driver adv7393_driver = {
|
||||
.driver = {
|
||||
.name = "adv7393",
|
||||
},
|
||||
.probe_new = adv7393_probe,
|
||||
.probe = adv7393_probe,
|
||||
.remove = adv7393_remove,
|
||||
.id_table = adv7393_id,
|
||||
};
|
||||
|
@ -847,7 +847,7 @@ static struct i2c_driver adv748x_driver = {
|
||||
.of_match_table = adv748x_of_table,
|
||||
.pm = &adv748x_pm_ops,
|
||||
},
|
||||
.probe_new = adv748x_probe,
|
||||
.probe = adv748x_probe,
|
||||
.remove = adv748x_remove,
|
||||
};
|
||||
|
||||
|
@ -1957,7 +1957,7 @@ static struct i2c_driver adv7511_driver = {
|
||||
.driver = {
|
||||
.name = "adv7511-v4l2",
|
||||
},
|
||||
.probe_new = adv7511_probe,
|
||||
.probe = adv7511_probe,
|
||||
.remove = adv7511_remove,
|
||||
.id_table = adv7511_id,
|
||||
};
|
||||
|
@ -3689,7 +3689,7 @@ static struct i2c_driver adv76xx_driver = {
|
||||
.name = "adv7604",
|
||||
.of_match_table = of_match_ptr(adv76xx_of_id),
|
||||
},
|
||||
.probe_new = adv76xx_probe,
|
||||
.probe = adv76xx_probe,
|
||||
.remove = adv76xx_remove,
|
||||
.id_table = adv76xx_i2c_id,
|
||||
};
|
||||
|
@ -3619,7 +3619,7 @@ static struct i2c_driver adv7842_driver = {
|
||||
.driver = {
|
||||
.name = "adv7842",
|
||||
},
|
||||
.probe_new = adv7842_probe,
|
||||
.probe = adv7842_probe,
|
||||
.remove = adv7842_remove,
|
||||
.id_table = adv7842_id,
|
||||
};
|
||||
|
@ -306,7 +306,7 @@ static struct i2c_driver ak7375_i2c_driver = {
|
||||
.pm = &ak7375_pm_ops,
|
||||
.of_match_table = ak7375_of_table,
|
||||
},
|
||||
.probe_new = ak7375_probe,
|
||||
.probe = ak7375_probe,
|
||||
.remove = ak7375_remove,
|
||||
};
|
||||
module_i2c_driver(ak7375_i2c_driver);
|
||||
|
@ -314,7 +314,7 @@ static struct i2c_driver ak881x_i2c_driver = {
|
||||
.driver = {
|
||||
.name = "ak881x",
|
||||
},
|
||||
.probe_new = ak881x_probe,
|
||||
.probe = ak881x_probe,
|
||||
.remove = ak881x_remove,
|
||||
.id_table = ak881x_id,
|
||||
};
|
||||
|
@ -1198,7 +1198,7 @@ static struct i2c_driver ar0521_i2c_driver = {
|
||||
.pm = &ar0521_pm_ops,
|
||||
.of_match_table = ar0521_dt_ids,
|
||||
},
|
||||
.probe_new = ar0521_probe,
|
||||
.probe = ar0521_probe,
|
||||
.remove = ar0521_remove,
|
||||
};
|
||||
|
||||
|
@ -468,7 +468,7 @@ static struct i2c_driver bt819_driver = {
|
||||
.driver = {
|
||||
.name = "bt819",
|
||||
},
|
||||
.probe_new = bt819_probe,
|
||||
.probe = bt819_probe,
|
||||
.remove = bt819_remove,
|
||||
.id_table = bt819_id,
|
||||
};
|
||||
|
@ -239,7 +239,7 @@ static struct i2c_driver bt856_driver = {
|
||||
.driver = {
|
||||
.name = "bt856",
|
||||
},
|
||||
.probe_new = bt856_probe,
|
||||
.probe = bt856_probe,
|
||||
.remove = bt856_remove,
|
||||
.id_table = bt856_id,
|
||||
};
|
||||
|
@ -206,7 +206,7 @@ static struct i2c_driver bt866_driver = {
|
||||
.driver = {
|
||||
.name = "bt866",
|
||||
},
|
||||
.probe_new = bt866_probe,
|
||||
.probe = bt866_probe,
|
||||
.remove = bt866_remove,
|
||||
.id_table = bt866_id,
|
||||
};
|
||||
|
@ -3731,7 +3731,7 @@ static struct i2c_driver ccs_i2c_driver = {
|
||||
.name = CCS_NAME,
|
||||
.pm = &ccs_pm_ops,
|
||||
},
|
||||
.probe_new = ccs_probe,
|
||||
.probe = ccs_probe,
|
||||
.remove = ccs_remove,
|
||||
};
|
||||
|
||||
|
@ -118,7 +118,7 @@ static struct i2c_driver cs3308_driver = {
|
||||
.driver = {
|
||||
.name = "cs3308",
|
||||
},
|
||||
.probe_new = cs3308_probe,
|
||||
.probe = cs3308_probe,
|
||||
.remove = cs3308_remove,
|
||||
.id_table = cs3308_id,
|
||||
};
|
||||
|
@ -198,7 +198,7 @@ static struct i2c_driver cs5345_driver = {
|
||||
.driver = {
|
||||
.name = "cs5345",
|
||||
},
|
||||
.probe_new = cs5345_probe,
|
||||
.probe = cs5345_probe,
|
||||
.remove = cs5345_remove,
|
||||
.id_table = cs5345_id,
|
||||
};
|
||||
|
@ -209,7 +209,7 @@ static struct i2c_driver cs53l32a_driver = {
|
||||
.driver = {
|
||||
.name = "cs53l32a",
|
||||
},
|
||||
.probe_new = cs53l32a_probe,
|
||||
.probe = cs53l32a_probe,
|
||||
.remove = cs53l32a_remove,
|
||||
.id_table = cs53l32a_id,
|
||||
};
|
||||
|
@ -6045,7 +6045,7 @@ static struct i2c_driver cx25840_driver = {
|
||||
.driver = {
|
||||
.name = "cx25840",
|
||||
},
|
||||
.probe_new = cx25840_probe,
|
||||
.probe = cx25840_probe,
|
||||
.remove = cx25840_remove,
|
||||
.id_table = cx25840_id,
|
||||
};
|
||||
|
@ -299,7 +299,7 @@ static struct i2c_driver dw9714_i2c_driver = {
|
||||
.pm = &dw9714_pm_ops,
|
||||
.of_match_table = dw9714_of_table,
|
||||
},
|
||||
.probe_new = dw9714_probe,
|
||||
.probe = dw9714_probe,
|
||||
.remove = dw9714_remove,
|
||||
.id_table = dw9714_id_table,
|
||||
};
|
||||
|
@ -549,7 +549,7 @@ static struct i2c_driver dw9768_i2c_driver = {
|
||||
.pm = &dw9768_pm_ops,
|
||||
.of_match_table = dw9768_of_table,
|
||||
},
|
||||
.probe_new = dw9768_probe,
|
||||
.probe = dw9768_probe,
|
||||
.remove = dw9768_remove,
|
||||
};
|
||||
module_i2c_driver(dw9768_i2c_driver);
|
||||
|
@ -310,7 +310,7 @@ static struct i2c_driver dw9807_i2c_driver = {
|
||||
.pm = &dw9807_pm_ops,
|
||||
.of_match_table = dw9807_of_table,
|
||||
},
|
||||
.probe_new = dw9807_probe,
|
||||
.probe = dw9807_probe,
|
||||
.remove = dw9807_remove,
|
||||
};
|
||||
|
||||
|
@ -1501,7 +1501,7 @@ static struct i2c_driver et8ek8_i2c_driver = {
|
||||
.pm = &et8ek8_pm_ops,
|
||||
.of_match_table = et8ek8_of_table,
|
||||
},
|
||||
.probe_new = et8ek8_probe,
|
||||
.probe = et8ek8_probe,
|
||||
.remove = __exit_p(et8ek8_remove),
|
||||
.id_table = et8ek8_id_table,
|
||||
};
|
||||
|
@ -1350,7 +1350,7 @@ static struct i2c_driver hi556_i2c_driver = {
|
||||
.pm = &hi556_pm_ops,
|
||||
.acpi_match_table = ACPI_PTR(hi556_acpi_ids),
|
||||
},
|
||||
.probe_new = hi556_probe,
|
||||
.probe = hi556_probe,
|
||||
.remove = hi556_remove,
|
||||
.flags = I2C_DRV_ACPI_WAIVE_D0_PROBE,
|
||||
};
|
||||
|
@ -1353,7 +1353,8 @@ static int hi846_set_ctrl(struct v4l2_ctrl *ctrl)
|
||||
exposure_max);
|
||||
}
|
||||
|
||||
if (!pm_runtime_get_if_in_use(&client->dev))
|
||||
ret = pm_runtime_get_if_in_use(&client->dev);
|
||||
if (!ret || ret == -EAGAIN)
|
||||
return 0;
|
||||
|
||||
switch (ctrl->id) {
|
||||
@ -2189,7 +2190,7 @@ static struct i2c_driver hi846_i2c_driver = {
|
||||
.pm = &hi846_pm_ops,
|
||||
.of_match_table = hi846_of_match,
|
||||
},
|
||||
.probe_new = hi846_probe,
|
||||
.probe = hi846_probe,
|
||||
.remove = hi846_remove,
|
||||
};
|
||||
|
||||
|
@ -2999,7 +2999,7 @@ static struct i2c_driver hi847_i2c_driver = {
|
||||
.pm = &hi847_pm_ops,
|
||||
.acpi_match_table = ACPI_PTR(hi847_acpi_ids),
|
||||
},
|
||||
.probe_new = hi847_probe,
|
||||
.probe = hi847_probe,
|
||||
.remove = hi847_remove,
|
||||
};
|
||||
|
||||
|
@ -1100,7 +1100,7 @@ static struct i2c_driver imx208_i2c_driver = {
|
||||
.pm = &imx208_pm_ops,
|
||||
.acpi_match_table = ACPI_PTR(imx208_acpi_ids),
|
||||
},
|
||||
.probe_new = imx208_probe,
|
||||
.probe = imx208_probe,
|
||||
.remove = imx208_remove,
|
||||
.flags = I2C_DRV_ACPI_WAIVE_D0_PROBE,
|
||||
};
|
||||
|
@ -1112,7 +1112,7 @@ static struct i2c_driver imx214_i2c_driver = {
|
||||
.pm = &imx214_pm_ops,
|
||||
.name = "imx214",
|
||||
},
|
||||
.probe_new = imx214_probe,
|
||||
.probe = imx214_probe,
|
||||
.remove = imx214_remove,
|
||||
};
|
||||
|
||||
|
@ -1583,7 +1583,7 @@ static struct i2c_driver imx219_i2c_driver = {
|
||||
.of_match_table = imx219_dt_ids,
|
||||
.pm = &imx219_pm_ops,
|
||||
},
|
||||
.probe_new = imx219_probe,
|
||||
.probe = imx219_probe,
|
||||
.remove = imx219_remove,
|
||||
};
|
||||
|
||||
|
@ -1395,7 +1395,7 @@ static struct i2c_driver imx258_i2c_driver = {
|
||||
.acpi_match_table = ACPI_PTR(imx258_acpi_ids),
|
||||
.of_match_table = imx258_dt_ids,
|
||||
},
|
||||
.probe_new = imx258_probe,
|
||||
.probe = imx258_probe,
|
||||
.remove = imx258_remove,
|
||||
};
|
||||
|
||||
|
@ -2168,7 +2168,7 @@ static struct i2c_driver imx274_i2c_driver = {
|
||||
.pm = &imx274_pm_ops,
|
||||
.of_match_table = imx274_of_id_table,
|
||||
},
|
||||
.probe_new = imx274_probe,
|
||||
.probe = imx274_probe,
|
||||
.remove = imx274_remove,
|
||||
.id_table = imx274_id,
|
||||
};
|
||||
|
@ -1716,10 +1716,10 @@ static const struct of_device_id imx290_of_match[] = {
|
||||
MODULE_DEVICE_TABLE(of, imx290_of_match);
|
||||
|
||||
static struct i2c_driver imx290_i2c_driver = {
|
||||
.probe_new = imx290_probe,
|
||||
.probe = imx290_probe,
|
||||
.remove = imx290_remove,
|
||||
.driver = {
|
||||
.name = "imx290",
|
||||
.name = "imx290",
|
||||
.pm = pm_ptr(&imx290_pm_ops),
|
||||
.of_match_table = imx290_of_match,
|
||||
},
|
||||
|
@ -922,10 +922,12 @@ static int imx296_read_temperature(struct imx296 *sensor, int *temp)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
tmdout = imx296_read(sensor, IMX296_TMDOUT) & IMX296_TMDOUT_MASK;
|
||||
tmdout = imx296_read(sensor, IMX296_TMDOUT);
|
||||
if (tmdout < 0)
|
||||
return tmdout;
|
||||
|
||||
tmdout &= IMX296_TMDOUT_MASK;
|
||||
|
||||
/* T(°C) = 246.312 - 0.304 * TMDOUT */;
|
||||
*temp = 246312 - 304 * tmdout;
|
||||
|
||||
@ -1152,7 +1154,7 @@ static struct i2c_driver imx296_i2c_driver = {
|
||||
.name = "imx296",
|
||||
.pm = &imx296_pm_ops
|
||||
},
|
||||
.probe_new = imx296_probe,
|
||||
.probe = imx296_probe,
|
||||
.remove = imx296_remove,
|
||||
};
|
||||
|
||||
|
@ -2558,7 +2558,7 @@ static struct i2c_driver imx319_i2c_driver = {
|
||||
.pm = &imx319_pm_ops,
|
||||
.acpi_match_table = ACPI_PTR(imx319_acpi_ids),
|
||||
},
|
||||
.probe_new = imx319_probe,
|
||||
.probe = imx319_probe,
|
||||
.remove = imx319_remove,
|
||||
.flags = I2C_DRV_ACPI_WAIVE_D0_PROBE,
|
||||
};
|
||||
|
@ -49,7 +49,8 @@
|
||||
#define IMX334_INCLK_RATE 24000000
|
||||
|
||||
/* CSI2 HW configuration */
|
||||
#define IMX334_LINK_FREQ 891000000
|
||||
#define IMX334_LINK_FREQ_891M 891000000
|
||||
#define IMX334_LINK_FREQ_445M 445500000
|
||||
#define IMX334_NUM_DATA_LANES 4
|
||||
|
||||
#define IMX334_REG_MIN 0x00
|
||||
@ -117,6 +118,7 @@ struct imx334_mode {
|
||||
* @vblank: Vertical blanking in lines
|
||||
* @cur_mode: Pointer to current selected sensor mode
|
||||
* @mutex: Mutex for serializing sensor controls
|
||||
* @menu_skip_mask: Menu skip mask for link_freq_ctrl
|
||||
* @cur_code: current selected format code
|
||||
* @streaming: Flag indicating streaming state
|
||||
*/
|
||||
@ -139,12 +141,14 @@ struct imx334 {
|
||||
u32 vblank;
|
||||
const struct imx334_mode *cur_mode;
|
||||
struct mutex mutex;
|
||||
unsigned long menu_skip_mask;
|
||||
u32 cur_code;
|
||||
bool streaming;
|
||||
};
|
||||
|
||||
static const s64 link_freq[] = {
|
||||
IMX334_LINK_FREQ,
|
||||
IMX334_LINK_FREQ_891M,
|
||||
IMX334_LINK_FREQ_445M,
|
||||
};
|
||||
|
||||
/* Sensor mode registers for 1920x1080@30fps */
|
||||
@ -468,7 +472,7 @@ static const struct imx334_mode supported_modes[] = {
|
||||
.vblank_min = 45,
|
||||
.vblank_max = 132840,
|
||||
.pclk = 297000000,
|
||||
.link_freq_idx = 0,
|
||||
.link_freq_idx = 1,
|
||||
.reg_list = {
|
||||
.num_of_regs = ARRAY_SIZE(mode_1920x1080_regs),
|
||||
.regs = mode_1920x1080_regs,
|
||||
@ -598,13 +602,22 @@ static int imx334_update_controls(struct imx334 *imx334,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = __v4l2_ctrl_modify_range(imx334->pclk_ctrl, mode->pclk,
|
||||
mode->pclk, 1, mode->pclk);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = __v4l2_ctrl_modify_range(imx334->hblank_ctrl, mode->hblank,
|
||||
mode->hblank, 1, mode->hblank);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return __v4l2_ctrl_modify_range(imx334->vblank_ctrl, mode->vblank_min,
|
||||
ret = __v4l2_ctrl_modify_range(imx334->vblank_ctrl, mode->vblank_min,
|
||||
mode->vblank_max, 1, mode->vblank);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return __v4l2_ctrl_s_ctrl(imx334->vblank_ctrl, mode->vblank);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -698,6 +711,8 @@ static int imx334_set_ctrl(struct v4l2_ctrl *ctrl)
|
||||
pm_runtime_put(imx334->dev);
|
||||
|
||||
break;
|
||||
case V4L2_CID_PIXEL_RATE:
|
||||
case V4L2_CID_LINK_FREQ:
|
||||
case V4L2_CID_HBLANK:
|
||||
ret = 0;
|
||||
break;
|
||||
@ -885,7 +900,17 @@ static int imx334_init_pad_cfg(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_format fmt = { 0 };
|
||||
|
||||
fmt.which = sd_state ? V4L2_SUBDEV_FORMAT_TRY : V4L2_SUBDEV_FORMAT_ACTIVE;
|
||||
imx334_fill_pad_format(imx334, &supported_modes[0], &fmt);
|
||||
|
||||
mutex_lock(&imx334->mutex);
|
||||
|
||||
imx334_fill_pad_format(imx334, imx334->cur_mode, &fmt);
|
||||
|
||||
__v4l2_ctrl_modify_range(imx334->link_freq_ctrl, 0,
|
||||
__fls(imx334->menu_skip_mask),
|
||||
~(imx334->menu_skip_mask),
|
||||
__ffs(imx334->menu_skip_mask));
|
||||
|
||||
mutex_unlock(&imx334->mutex);
|
||||
|
||||
return imx334_set_pad_format(sd, sd_state, &fmt);
|
||||
}
|
||||
@ -1046,8 +1071,8 @@ static int imx334_parse_hw_config(struct imx334 *imx334)
|
||||
};
|
||||
struct fwnode_handle *ep;
|
||||
unsigned long rate;
|
||||
unsigned int i, j;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
if (!fwnode)
|
||||
return -ENXIO;
|
||||
@ -1097,11 +1122,20 @@ static int imx334_parse_hw_config(struct imx334 *imx334)
|
||||
goto done_endpoint_free;
|
||||
}
|
||||
|
||||
for (i = 0; i < bus_cfg.nr_of_link_frequencies; i++)
|
||||
if (bus_cfg.link_frequencies[i] == IMX334_LINK_FREQ)
|
||||
goto done_endpoint_free;
|
||||
for (i = 0; i < bus_cfg.nr_of_link_frequencies; i++) {
|
||||
for (j = 0; j < ARRAY_SIZE(link_freq); j++) {
|
||||
if (bus_cfg.link_frequencies[i] == link_freq[j]) {
|
||||
set_bit(j, &imx334->menu_skip_mask);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ret = -EINVAL;
|
||||
if (j == ARRAY_SIZE(link_freq)) {
|
||||
ret = dev_err_probe(imx334->dev, -EINVAL,
|
||||
"no supported link freq found\n");
|
||||
goto done_endpoint_free;
|
||||
}
|
||||
}
|
||||
|
||||
done_endpoint_free:
|
||||
v4l2_fwnode_endpoint_free(&bus_cfg);
|
||||
@ -1232,10 +1266,10 @@ static int imx334_init_controls(struct imx334 *imx334)
|
||||
imx334->link_freq_ctrl = v4l2_ctrl_new_int_menu(ctrl_hdlr,
|
||||
&imx334_ctrl_ops,
|
||||
V4L2_CID_LINK_FREQ,
|
||||
ARRAY_SIZE(link_freq) -
|
||||
1,
|
||||
mode->link_freq_idx,
|
||||
__fls(imx334->menu_skip_mask),
|
||||
__ffs(imx334->menu_skip_mask),
|
||||
link_freq);
|
||||
|
||||
if (imx334->link_freq_ctrl)
|
||||
imx334->link_freq_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
|
||||
|
||||
@ -1302,7 +1336,7 @@ static int imx334_probe(struct i2c_client *client)
|
||||
}
|
||||
|
||||
/* Set default mode to max resolution */
|
||||
imx334->cur_mode = &supported_modes[0];
|
||||
imx334->cur_mode = &supported_modes[__ffs(imx334->menu_skip_mask)];
|
||||
imx334->cur_code = imx334_mbus_codes[0];
|
||||
imx334->vblank = imx334->cur_mode->vblank;
|
||||
|
||||
@ -1382,7 +1416,7 @@ static const struct of_device_id imx334_of_match[] = {
|
||||
MODULE_DEVICE_TABLE(of, imx334_of_match);
|
||||
|
||||
static struct i2c_driver imx334_driver = {
|
||||
.probe_new = imx334_probe,
|
||||
.probe = imx334_probe,
|
||||
.remove = imx334_remove,
|
||||
.driver = {
|
||||
.name = "imx334",
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user