mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 13:41:51 +00:00
media updates for v6.2-rc1
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE+QmuaPwR3wnBdVwACF8+vY7k4RUFAmOW44IACgkQCF8+vY7k 4RWt2RAAnUPY7bj2DDGo5rJ54KjMXhz6usdOnh9Hzg5eegGzK2xXAOyKVg4AFsNk rXWkbEc5Rg2LJnMZg8dojsG/utOV+xtCidQCYdhUKLPDREDMjSuUy/vs3utllwkg MhO8JDY+OQHhqXaMFRz0suGvr1W4kDmRR7+4VciEEPX9k9CX+FMYnuVlNyxLZG03 Hu/PSDC4ltU+P0xnLap3U681PWfUDAoSvhyQmvde39EspSBxzFTVy7Cw1VL7DvwQ Idrcxo37buGf8eF9Em02PBgzC00TV6yCy5wOPOemcozBgtDSeLSQjlUUaOqHZgKI uY4k8LI0efnJPWIqt/rGZ4OREK+m7RbyAKvQ/9ckblm3bjsJV/T8WGtnNHxDRBVD ypoSvFyJ+RU6eFUw2jG61Fx0vPocK8AGnQLK860ns52h5DxyxpPxWtvPyNZLNs59 bjZPetbU7bgvGZ8aBJno84Q+4Bliel8zXWnQKrAV28gjwCt/q/Lbd9G7sUYCZwIE EMxcOP9r2J1Q8zQK6s9xdZx2lRINWD+9Hgh1toS2KGhkAtT5BWyBmD2MXqt88v04 8MeyneYt6uiv5Lst41BhxT/hvIyFb9g3pW28TAUCPV9r5pjyJVRNvPjJEv6dnR2e eRmBHcyLG6/Q1Do+HY2DjjgOsAL7yDxQJNahqFM/cFGYMVmYNFU= =i0X1 -----END PGP SIGNATURE----- Merge tag 'media/v6.2-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media Pull media updates from Mauro Carvalho Chehab: - DVB core changes to avoid refcount troubles and UAF - DVB API/core has gained support for DVB-C2 and DVB-S2X - New sensor drivers: ov08x40, ov4689.c, st-vgxy61 and tc358746.c - Removal of an unused sensor driver: s5k4ecgx - Move microchip_csi2dc to a new directory, named after the manufacturer - Add media controller support to Microship drivers - Old Atmel/Microship drivers that don't use media controler got moved to staging - New drivers added for Renesas RZ/G2L CRU and MIPI CSI-2 support - Allwinner A31 camera sensor driver code was now split into a bridge and a separate processor driver - Added a virtual stateless decoder driver in order to test core support for stateless drivers and test userspace apps using it - removed platform-based support for ov9650, as this is not used anymore - atomisp now uses videobuf2 and supports normal mmap mode - the imx7-media-csi driver got promoted from staging - rcar-vin driver has gained support for gen3 UDS (Up Down Scaler) - most i2c drivers now use I2C .probe_new() kAPI - lots of drivers fixes, cleanups and improvements * tag 'media/v6.2-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (544 commits) media: s5c73m3: Switch to GPIO descriptors media: i2c: s5k5baf: switch to using gpiod API media: i2c: s5k6a3: switch to using gpiod API media: imx: remove code for non-existing config IMX_GPT_ICAP media: si470x: Fix use-after-free in si470x_int_in_callback() media: staging: stkwebcam: Restore MEDIA_{USB,CAMERA}_SUPPORT dependencies media: coda: Add check for kmalloc media: coda: Add check for dcoda_iram_alloc dt-bindings: media: s5c73m3: Fix reset-gpio descriptor media: dt-bindings: allwinner: h6-vpu-g2: Add IOMMU reference property media: s5k4ecgx: Delete driver media: s5k4ecgx: Switch to GPIO descriptors media: Switch to use dev_err_probe() helper headers: Remove some left-over license text in include/uapi/linux/v4l2-* headers: Remove some left-over license text in include/uapi/linux/dvb/ media: usb: pwc-uncompress: Use flex array destination for memcpy() media: s5p-mfc: Fix to handle reference queue during finishing media: s5p-mfc: Clear workbit to handle error condition media: s5p-mfc: Fix in register read and write for H264 media: imx: Use get_mbus_config instead of parsing upstream DT endpoints ...
This commit is contained in:
commit
cdb9d35377
@ -1,10 +0,0 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
=================================
|
||||
CEC driver-specific documentation
|
||||
=================================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
pulse8-cec
|
369
Documentation/admin-guide/media/cec.rst
Normal file
369
Documentation/admin-guide/media/cec.rst
Normal file
@ -0,0 +1,369 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
========
|
||||
HDMI CEC
|
||||
========
|
||||
|
||||
Supported hardware in mainline
|
||||
==============================
|
||||
|
||||
HDMI Transmitters:
|
||||
|
||||
- Exynos4
|
||||
- Exynos5
|
||||
- STIH4xx HDMI CEC
|
||||
- V4L2 adv7511 (same HW, but a different driver from the drm adv7511)
|
||||
- stm32
|
||||
- Allwinner A10 (sun4i)
|
||||
- Raspberry Pi
|
||||
- dw-hdmi (Synopsis IP)
|
||||
- amlogic (meson ao-cec and ao-cec-g12a)
|
||||
- drm adv7511/adv7533
|
||||
- omap4
|
||||
- tegra
|
||||
- rk3288, rk3399
|
||||
- tda998x
|
||||
- DisplayPort CEC-Tunneling-over-AUX on i915, nouveau and amdgpu
|
||||
- ChromeOS EC CEC
|
||||
- CEC for SECO boards (UDOO x86).
|
||||
- Chrontel CH7322
|
||||
|
||||
|
||||
HDMI Receivers:
|
||||
|
||||
- adv7604/11/12
|
||||
- adv7842
|
||||
- tc358743
|
||||
|
||||
USB Dongles (see below for additional information on how to use these
|
||||
dongles):
|
||||
|
||||
- Pulse-Eight: the pulse8-cec driver implements the following module option:
|
||||
``persistent_config``: by default this is off, but when set to 1 the driver
|
||||
will store the current settings to the device's internal eeprom and restore
|
||||
it the next time the device is connected to the USB port.
|
||||
- RainShadow Tech. Note: this driver does not support the persistent_config
|
||||
module option of the Pulse-Eight driver. The hardware supports it, but I
|
||||
have no plans to add this feature. But I accept patches :-)
|
||||
|
||||
Miscellaneous:
|
||||
|
||||
- vivid: emulates a CEC receiver and CEC transmitter.
|
||||
Can be used to test CEC applications without actual CEC hardware.
|
||||
|
||||
- cec-gpio. If the CEC pin is hooked up to a GPIO pin then
|
||||
you can control the CEC line through this driver. This supports error
|
||||
injection as well.
|
||||
|
||||
|
||||
Utilities
|
||||
=========
|
||||
|
||||
Utilities are available here: https://git.linuxtv.org/v4l-utils.git
|
||||
|
||||
``utils/cec-ctl``: control a CEC device
|
||||
|
||||
``utils/cec-compliance``: test compliance of a remote CEC device
|
||||
|
||||
``utils/cec-follower``: emulate a CEC follower device
|
||||
|
||||
Note that ``cec-ctl`` has support for the CEC Hospitality Profile as is
|
||||
used in some hotel displays. See http://www.htng.org.
|
||||
|
||||
Note that the libcec library (https://github.com/Pulse-Eight/libcec) supports
|
||||
the linux CEC framework.
|
||||
|
||||
If you want to get the CEC specification, then look at the References of
|
||||
the HDMI wikipedia page: https://en.wikipedia.org/wiki/HDMI. CEC is part
|
||||
of the HDMI specification. HDMI 1.3 is freely available (very similar to
|
||||
HDMI 1.4 w.r.t. CEC) and should be good enough for most things.
|
||||
|
||||
|
||||
DisplayPort to HDMI Adapters with working CEC
|
||||
=============================================
|
||||
|
||||
Background: most adapters do not support the CEC Tunneling feature,
|
||||
and of those that do many did not actually connect the CEC pin.
|
||||
Unfortunately, this means that while a CEC device is created, it
|
||||
is actually all alone in the world and will never be able to see other
|
||||
CEC devices.
|
||||
|
||||
This is a list of known working adapters that have CEC Tunneling AND
|
||||
that properly connected the CEC pin. If you find adapters that work
|
||||
but are not in this list, then drop me a note.
|
||||
|
||||
To test: hook up your DP-to-HDMI adapter to a CEC capable device
|
||||
(typically a TV), then run::
|
||||
|
||||
cec-ctl --playback # Configure the PC as a CEC Playback device
|
||||
cec-ctl -S # Show the CEC topology
|
||||
|
||||
The ``cec-ctl -S`` command should show at least two CEC devices,
|
||||
ourselves and the CEC device you are connected to (i.e. typically the TV).
|
||||
|
||||
General note: I have only seen this work with the Parade PS175, PS176 and
|
||||
PS186 chipsets and the MegaChips 2900. While MegaChips 28x0 claims CEC support,
|
||||
I have never seen it work.
|
||||
|
||||
USB-C to HDMI
|
||||
-------------
|
||||
|
||||
Samsung Multiport Adapter EE-PW700: https://www.samsung.com/ie/support/model/EE-PW700BBEGWW/
|
||||
|
||||
Kramer ADC-U31C/HF: https://www.kramerav.com/product/ADC-U31C/HF
|
||||
|
||||
Club3D CAC-2504: https://www.club-3d.com/en/detail/2449/usb_3.1_type_c_to_hdmi_2.0_uhd_4k_60hz_active_adapter/
|
||||
|
||||
DisplayPort to HDMI
|
||||
-------------------
|
||||
|
||||
Club3D CAC-1080: https://www.club-3d.com/en/detail/2442/displayport_1.4_to_hdmi_2.0b_hdr/
|
||||
|
||||
CableCreation (SKU: CD0712): https://www.cablecreation.com/products/active-displayport-to-hdmi-adapter-4k-hdr
|
||||
|
||||
HP DisplayPort to HDMI True 4k Adapter (P/N 2JA63AA): https://www.hp.com/us-en/shop/pdp/hp-displayport-to-hdmi-true-4k-adapter
|
||||
|
||||
Mini-DisplayPort to HDMI
|
||||
------------------------
|
||||
|
||||
Club3D CAC-1180: https://www.club-3d.com/en/detail/2443/mini_displayport_1.4_to_hdmi_2.0b_hdr/
|
||||
|
||||
Note that passive adapters will never work, you need an active adapter.
|
||||
|
||||
The Club3D adapters in this list are all MegaChips 2900 based. Other Club3D adapters
|
||||
are PS176 based and do NOT have the CEC pin hooked up, so only the three Club3D
|
||||
adapters above are known to work.
|
||||
|
||||
I suspect that MegaChips 2900 based designs in general are likely to work
|
||||
whereas with the PS176 it is more hit-and-miss (mostly miss). The PS186 is
|
||||
likely to have the CEC pin hooked up, it looks like they changed the reference
|
||||
design for that chipset.
|
||||
|
||||
|
||||
USB CEC Dongles
|
||||
===============
|
||||
|
||||
These dongles appear as ``/dev/ttyACMX`` devices and need the ``inputattach``
|
||||
utility to create the ``/dev/cecX`` devices. Support for the Pulse-Eight
|
||||
has been added to ``inputattach`` 1.6.0. Support for the Rainshadow Tech has
|
||||
been added to ``inputattach`` 1.6.1.
|
||||
|
||||
You also need udev rules to automatically start systemd services::
|
||||
|
||||
SUBSYSTEM=="tty", KERNEL=="ttyACM[0-9]*", ATTRS{idVendor}=="2548", ATTRS{idProduct}=="1002", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}+="pulse8-cec-inputattach@%k.service"
|
||||
SUBSYSTEM=="tty", KERNEL=="ttyACM[0-9]*", ATTRS{idVendor}=="2548", ATTRS{idProduct}=="1001", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}+="pulse8-cec-inputattach@%k.service"
|
||||
SUBSYSTEM=="tty", KERNEL=="ttyACM[0-9]*", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="ff59", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}+="rainshadow-cec-inputattach@%k.service"
|
||||
|
||||
and these systemd services:
|
||||
|
||||
For Pulse-Eight make /lib/systemd/system/pulse8-cec-inputattach@.service::
|
||||
|
||||
[Unit]
|
||||
Description=inputattach for pulse8-cec device on %I
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/usr/bin/inputattach --pulse8-cec /dev/%I
|
||||
|
||||
For the RainShadow Tech make /lib/systemd/system/rainshadow-cec-inputattach@.service::
|
||||
|
||||
[Unit]
|
||||
Description=inputattach for rainshadow-cec device on %I
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/usr/bin/inputattach --rainshadow-cec /dev/%I
|
||||
|
||||
|
||||
For proper suspend/resume support create: /lib/systemd/system/restart-cec-inputattach.service::
|
||||
|
||||
[Unit]
|
||||
Description=restart inputattach for cec devices
|
||||
After=suspend.target
|
||||
|
||||
[Service]
|
||||
Type=forking
|
||||
ExecStart=/bin/bash -c 'for d in /dev/serial/by-id/usb-Pulse-Eight*; do /usr/bin/inputattach --daemon --pulse8-cec $d; done; for d in /dev/serial/by-id/usb-RainShadow_Tech*; do /usr/bin/inputattach --daemon --rainshadow-cec $d; done'
|
||||
|
||||
[Install]
|
||||
WantedBy=suspend.target
|
||||
|
||||
And run ``systemctl enable restart-cec-inputattach``.
|
||||
|
||||
To automatically set the physical address of the CEC device whenever the
|
||||
EDID changes, you can use ``cec-ctl`` with the ``-E`` option::
|
||||
|
||||
cec-ctl -E /sys/class/drm/card0-DP-1/edid
|
||||
|
||||
This assumes the dongle is connected to the card0-DP-1 output (``xrandr`` will tell
|
||||
you which output is used) and it will poll for changes to the EDID and update
|
||||
the Physical Address whenever they occur.
|
||||
|
||||
To automatically run this command you can use cron. Edit crontab with
|
||||
``crontab -e`` and add this line::
|
||||
|
||||
@reboot /usr/local/bin/cec-ctl -E /sys/class/drm/card0-DP-1/edid
|
||||
|
||||
This only works for display drivers that expose the EDID in ``/sys/class/drm``,
|
||||
such as the i915 driver.
|
||||
|
||||
|
||||
CEC Without HPD
|
||||
===============
|
||||
|
||||
Some displays when in standby mode have no HDMI Hotplug Detect signal, but
|
||||
CEC is still enabled so connected devices can send an <Image View On> CEC
|
||||
message in order to wake up such displays. Unfortunately, not all CEC
|
||||
adapters can support this. An example is the Odroid-U3 SBC that has a
|
||||
level-shifter that is powered off when the HPD signal is low, thus
|
||||
blocking the CEC pin. Even though the SoC can use CEC without a HPD,
|
||||
the level-shifter will prevent this from functioning.
|
||||
|
||||
There is a CEC capability flag to signal this: ``CEC_CAP_NEEDS_HPD``.
|
||||
If set, then the hardware cannot wake up displays with this behavior.
|
||||
|
||||
Note for CEC application implementers: the <Image View On> message must
|
||||
be the first message you send, don't send any other messages before.
|
||||
Certain very bad but unfortunately not uncommon CEC implementations
|
||||
get very confused if they receive anything else but this message and
|
||||
they won't wake up.
|
||||
|
||||
When writing a driver it can be tricky to test this. There are two
|
||||
ways to do this:
|
||||
|
||||
1) Get a Pulse-Eight USB CEC dongle, connect an HDMI cable from your
|
||||
device to the Pulse-Eight, but do not connect the Pulse-Eight to
|
||||
the display.
|
||||
|
||||
Now configure the Pulse-Eight dongle::
|
||||
|
||||
cec-ctl -p0.0.0.0 --tv
|
||||
|
||||
and start monitoring::
|
||||
|
||||
sudo cec-ctl -M
|
||||
|
||||
On the device you are testing run::
|
||||
|
||||
cec-ctl --playback
|
||||
|
||||
It should report a physical address of f.f.f.f. Now run this
|
||||
command::
|
||||
|
||||
cec-ctl -t0 --image-view-on
|
||||
|
||||
The Pulse-Eight should see the <Image View On> message. If not,
|
||||
then something (hardware and/or software) is preventing the CEC
|
||||
message from going out.
|
||||
|
||||
To make sure you have the wiring correct just connect the
|
||||
Pulse-Eight to a CEC-enabled display and run the same command
|
||||
on your device: now there is a HPD, so you should see the command
|
||||
arriving at the Pulse-Eight.
|
||||
|
||||
2) If you have another linux device supporting CEC without HPD, then
|
||||
you can just connect your device to that device. Yes, you can connect
|
||||
two HDMI outputs together. You won't have a HPD (which is what we
|
||||
want for this test), but the second device can monitor the CEC pin.
|
||||
|
||||
Otherwise use the same commands as in 1.
|
||||
|
||||
If CEC messages do not come through when there is no HPD, then you
|
||||
need to figure out why. Typically it is either a hardware restriction
|
||||
or the software powers off the CEC core when the HPD goes low. The
|
||||
first cannot be corrected of course, the second will likely required
|
||||
driver changes.
|
||||
|
||||
|
||||
Microcontrollers & CEC
|
||||
======================
|
||||
|
||||
We have seen some CEC implementations in displays that use a microcontroller
|
||||
to sample the bus. This does not have to be a problem, but some implementations
|
||||
have timing issues. This is hard to discover unless you can hook up a low-level
|
||||
CEC debugger (see the next section).
|
||||
|
||||
You will see cases where the CEC transmitter holds the CEC line high or low for
|
||||
a longer time than is allowed. For directed messages this is not a problem since
|
||||
if that happens the message will not be Acked and it will be retransmitted.
|
||||
For broadcast messages no such mechanism exists.
|
||||
|
||||
It's not clear what to do about this. It is probably wise to transmit some
|
||||
broadcast messages twice to reduce the chance of them being lost. Specifically
|
||||
<Standby> and <Active Source> are candidates for that.
|
||||
|
||||
|
||||
Making a CEC debugger
|
||||
=====================
|
||||
|
||||
By using a Raspberry Pi 2B/3/4 and some cheap components you can make
|
||||
your own low-level CEC debugger.
|
||||
|
||||
Here is a picture of my setup:
|
||||
|
||||
https://hverkuil.home.xs4all.nl/rpi3-cec.jpg
|
||||
|
||||
It's a Raspberry Pi 3 together with a breadboard and some breadboard wires:
|
||||
|
||||
http://www.dx.com/p/diy-40p-male-to-female-male-to-male-female-to-female-dupont-line-wire-3pcs-356089#.WYLOOXWGN7I
|
||||
|
||||
Finally on of these HDMI female-female passthrough connectors (full soldering type 1):
|
||||
|
||||
https://elabbay.myshopify.com/collections/camera/products/hdmi-af-af-v1a-hdmi-type-a-female-to-hdmi-type-a-female-pass-through-adapter-breakout-board?variant=45533926147
|
||||
|
||||
We've tested this and it works up to 4kp30 (297 MHz). The quality is not high
|
||||
enough to pass-through 4kp60 (594 MHz).
|
||||
|
||||
I also added an RTC and a breakout shield:
|
||||
|
||||
https://www.amazon.com/Makerfire%C2%AE-Raspberry-Module-DS1307-Battery/dp/B00ZOXWHK4
|
||||
|
||||
https://www.dx.com/p/raspberry-pi-gpio-expansion-board-breadboard-easy-multiplexing-board-one-to-three-with-screw-for-raspberry-pi-2-3-b-b-2729992.html#.YGRCG0MzZ7I
|
||||
|
||||
These two are not needed but they make life a bit easier.
|
||||
|
||||
If you want to monitor the HPD line as well, then you need one of these
|
||||
level shifters:
|
||||
|
||||
https://www.adafruit.com/product/757
|
||||
|
||||
(This is just where I got these components, there are many other places you
|
||||
can get similar things).
|
||||
|
||||
The CEC pin of the HDMI connector needs to be connected to these pins:
|
||||
CE0/IO8 and CE1/IO7 (pull-up GPIOs). The (optional) HPD pin of the HDMI
|
||||
connector should be connected (via a level shifter to convert the 5V
|
||||
to 3.3V) to these pins: IO17 and IO27. The (optional) 5V pin of the HDMI
|
||||
connector should be connected (via a level shifter) to these pins: IO22
|
||||
and IO24. Monitoring the HPD an 5V lines is not necessary, but it is helpful.
|
||||
|
||||
This kernel patch will hook up the cec-gpio driver correctly to
|
||||
e.g. ``arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts``::
|
||||
|
||||
cec-gpio@7 {
|
||||
compatible = "cec-gpio";
|
||||
cec-gpios = <&gpio 7 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
|
||||
hpd-gpios = <&gpio 17 GPIO_ACTIVE_HIGH>;
|
||||
v5-gpios = <&gpio 22 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
cec-gpio@8 {
|
||||
compatible = "cec-gpio";
|
||||
cec-gpios = <&gpio 8 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
|
||||
hpd-gpios = <&gpio 27 GPIO_ACTIVE_HIGH>;
|
||||
v5-gpios = <&gpio 24 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
This dts change will enable two cec GPIO devices: I typically use one to
|
||||
send/receive CEC commands and the other to monitor. If you monitor using
|
||||
an unconfigured CEC adapter then it will use GPIO interrupts which makes
|
||||
monitoring very accurate.
|
||||
|
||||
The documentation on how to use the error injection is here: :ref:`cec_pin_error_inj`.
|
||||
|
||||
``cec-ctl --monitor-pin`` will do low-level CEC bus sniffing and analysis.
|
||||
You can also store the CEC traffic to file using ``--store-pin`` and analyze
|
||||
it later using ``--analyze-pin``.
|
||||
|
||||
You can also use this as a full-fledged CEC device by configuring it
|
||||
using ``cec-ctl --tv -p0.0.0.0`` or ``cec-ctl --playback -p1.0.0.0``.
|
@ -38,13 +38,14 @@ The media subsystem
|
||||
|
||||
remote-controller
|
||||
|
||||
cec
|
||||
|
||||
dvb
|
||||
|
||||
cardlist
|
||||
|
||||
v4l-drivers
|
||||
dvb-drivers
|
||||
cec-drivers
|
||||
|
||||
**Copyright** |copy| 1999-2020 : LinuxTV Developers
|
||||
|
||||
|
@ -1,13 +0,0 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
Pulse-Eight CEC Adapter driver
|
||||
==============================
|
||||
|
||||
The pulse8-cec driver implements the following module option:
|
||||
|
||||
``persistent_config``
|
||||
---------------------
|
||||
|
||||
By default this is off, but when set to 1 the driver will store the current
|
||||
settings to the device's internal eeprom and restore it the next time the
|
||||
device is connected to the USB port.
|
@ -31,4 +31,5 @@ Video4Linux (V4L) driver-specific documentation
|
||||
si4713
|
||||
si476x
|
||||
vimc
|
||||
visl
|
||||
vivid
|
||||
|
@ -35,11 +35,11 @@ of commands fits for the default topology:
|
||||
|
||||
media-ctl -d platform:vimc -V '"Sensor A":0[fmt:SBGGR8_1X8/640x480]'
|
||||
media-ctl -d platform:vimc -V '"Debayer A":0[fmt:SBGGR8_1X8/640x480]'
|
||||
media-ctl -d platform:vimc -V '"Sensor B":0[fmt:SBGGR8_1X8/640x480]'
|
||||
media-ctl -d platform:vimc -V '"Debayer B":0[fmt:SBGGR8_1X8/640x480]'
|
||||
v4l2-ctl -z platform:vimc -d "RGB/YUV Capture" -v width=1920,height=1440
|
||||
media-ctl -d platform:vimc -V '"Scaler":0[fmt:RGB888_1X24/640x480]'
|
||||
media-ctl -d platform:vimc -V '"Scaler":0[crop:(100,50)/400x150]'
|
||||
media-ctl -d platform:vimc -V '"Scaler":1[fmt:RGB888_1X24/300x700]'
|
||||
v4l2-ctl -z platform:vimc -d "RGB/YUV Capture" -v width=300,height=700
|
||||
v4l2-ctl -z platform:vimc -d "Raw Capture 0" -v pixelformat=BA81
|
||||
v4l2-ctl -z platform:vimc -d "Raw Capture 1" -v pixelformat=BA81
|
||||
|
||||
Subdevices
|
||||
----------
|
||||
|
175
Documentation/admin-guide/media/visl.rst
Normal file
175
Documentation/admin-guide/media/visl.rst
Normal file
@ -0,0 +1,175 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
The Virtual Stateless Decoder Driver (visl)
|
||||
===========================================
|
||||
|
||||
A virtual stateless decoder device for stateless uAPI development
|
||||
purposes.
|
||||
|
||||
This tool's objective is to help the development and testing of
|
||||
userspace applications that use the V4L2 stateless API to decode media.
|
||||
|
||||
A userspace implementation can use visl to run a decoding loop even when
|
||||
no hardware is available or when the kernel uAPI for the codec has not
|
||||
been upstreamed yet. This can reveal bugs at an early stage.
|
||||
|
||||
This driver can also trace the contents of the V4L2 controls submitted
|
||||
to it. It can also dump the contents of the vb2 buffers through a
|
||||
debugfs interface. This is in many ways similar to the tracing
|
||||
infrastructure available for other popular encode/decode APIs out there
|
||||
and can help develop a userspace application by using another (working)
|
||||
one as a reference.
|
||||
|
||||
.. note::
|
||||
|
||||
No actual decoding of video frames is performed by visl. The
|
||||
V4L2 test pattern generator is used to write various debug information
|
||||
to the capture buffers instead.
|
||||
|
||||
Module parameters
|
||||
-----------------
|
||||
|
||||
- visl_debug: Activates debug info, printing various debug messages through
|
||||
dprintk. Also controls whether per-frame debug info is shown. Defaults to off.
|
||||
Note that enabling this feature can result in slow performance through serial.
|
||||
|
||||
- visl_transtime_ms: Simulated process time in milliseconds. Slowing down the
|
||||
decoding speed can be useful for debugging.
|
||||
|
||||
- visl_dprintk_frame_start, visl_dprintk_frame_nframes: Dictates a range of
|
||||
frames where dprintk is activated. This only controls the dprintk tracing on a
|
||||
per-frame basis. Note that printing a lot of data can be slow through serial.
|
||||
|
||||
- keep_bitstream_buffers: Controls whether bitstream (i.e. OUTPUT) buffers are
|
||||
kept after a decoding session. Defaults to false so as to reduce the amount of
|
||||
clutter. keep_bitstream_buffers == false works well when live debugging the
|
||||
client program with GDB.
|
||||
|
||||
- bitstream_trace_frame_start, bitstream_trace_nframes: Similar to
|
||||
visl_dprintk_frame_start, visl_dprintk_nframes, but controls the dumping of
|
||||
buffer data through debugfs instead.
|
||||
|
||||
What is the default use case for this driver?
|
||||
---------------------------------------------
|
||||
|
||||
This driver can be used as a way to compare different userspace implementations.
|
||||
This assumes that a working client is run against visl and that the ftrace and
|
||||
OUTPUT buffer data is subsequently used to debug a work-in-progress
|
||||
implementation.
|
||||
|
||||
Information on reference frames, their timestamps, the status of the OUTPUT and
|
||||
CAPTURE queues and more can be read directly from the CAPTURE buffers.
|
||||
|
||||
Supported codecs
|
||||
----------------
|
||||
|
||||
The following codecs are supported:
|
||||
|
||||
- FWHT
|
||||
- MPEG2
|
||||
- VP8
|
||||
- VP9
|
||||
- H.264
|
||||
- HEVC
|
||||
|
||||
visl trace events
|
||||
-----------------
|
||||
The trace events are defined on a per-codec basis, e.g.:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ ls /sys/kernel/debug/tracing/events/ | grep visl
|
||||
visl_fwht_controls
|
||||
visl_h264_controls
|
||||
visl_hevc_controls
|
||||
visl_mpeg2_controls
|
||||
visl_vp8_controls
|
||||
visl_vp9_controls
|
||||
|
||||
For example, in order to dump HEVC SPS data:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ echo 1 > /sys/kernel/debug/tracing/events/visl_hevc_controls/v4l2_ctrl_hevc_sps/enable
|
||||
|
||||
The SPS data will be dumped to the trace buffer, i.e.:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ cat /sys/kernel/debug/tracing/trace
|
||||
video_parameter_set_id 0
|
||||
seq_parameter_set_id 0
|
||||
pic_width_in_luma_samples 1920
|
||||
pic_height_in_luma_samples 1080
|
||||
bit_depth_luma_minus8 0
|
||||
bit_depth_chroma_minus8 0
|
||||
log2_max_pic_order_cnt_lsb_minus4 4
|
||||
sps_max_dec_pic_buffering_minus1 6
|
||||
sps_max_num_reorder_pics 2
|
||||
sps_max_latency_increase_plus1 0
|
||||
log2_min_luma_coding_block_size_minus3 0
|
||||
log2_diff_max_min_luma_coding_block_size 3
|
||||
log2_min_luma_transform_block_size_minus2 0
|
||||
log2_diff_max_min_luma_transform_block_size 3
|
||||
max_transform_hierarchy_depth_inter 2
|
||||
max_transform_hierarchy_depth_intra 2
|
||||
pcm_sample_bit_depth_luma_minus1 0
|
||||
pcm_sample_bit_depth_chroma_minus1 0
|
||||
log2_min_pcm_luma_coding_block_size_minus3 0
|
||||
log2_diff_max_min_pcm_luma_coding_block_size 0
|
||||
num_short_term_ref_pic_sets 0
|
||||
num_long_term_ref_pics_sps 0
|
||||
chroma_format_idc 1
|
||||
sps_max_sub_layers_minus1 0
|
||||
flags AMP_ENABLED|SAMPLE_ADAPTIVE_OFFSET|TEMPORAL_MVP_ENABLED|STRONG_INTRA_SMOOTHING_ENABLED
|
||||
|
||||
|
||||
Dumping OUTPUT buffer data through debugfs
|
||||
------------------------------------------
|
||||
|
||||
If the **VISL_DEBUGFS** Kconfig is enabled, visl will populate
|
||||
**/sys/kernel/debug/visl/bitstream** with OUTPUT buffer data according to the
|
||||
values of bitstream_trace_frame_start and bitstream_trace_nframes. This can
|
||||
highlight errors as broken clients may fail to fill the buffers properly.
|
||||
|
||||
A single file is created for each processed OUTPUT buffer. Its name contains an
|
||||
integer that denotes the buffer sequence, i.e.:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
snprintf(name, 32, "bitstream%d", run->src->sequence);
|
||||
|
||||
Dumping the values is simply a matter of reading from the file, i.e.:
|
||||
|
||||
For the buffer with sequence == 0:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ xxd /sys/kernel/debug/visl/bitstream/bitstream0
|
||||
00000000: 2601 af04 d088 bc25 a173 0e41 a4f2 3274 &......%.s.A..2t
|
||||
00000010: c668 cb28 e775 b4ac f53a ba60 f8fd 3aa1 .h.(.u...:.`..:.
|
||||
00000020: 46b4 bcfc 506c e227 2372 e5f5 d7ea 579f F...Pl.'#r....W.
|
||||
00000030: 6371 5eb5 0eb8 23b5 ca6a 5de5 983a 19e4 cq^...#..j]..:..
|
||||
00000040: e8c3 4320 b4ba a226 cbc1 4138 3a12 32d6 ..C ...&..A8:.2.
|
||||
00000050: fef3 247b 3523 4e90 9682 ac8e eb0c a389 ..${5#N.........
|
||||
00000060: ddd0 6cfc 0187 0e20 7aae b15b 1812 3d33 ..l.... z..[..=3
|
||||
00000070: e1c5 f425 a83a 00b7 4f18 8127 3c4c aefb ...%.:..O..'<L..
|
||||
|
||||
For the buffer with sequence == 1:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ xxd /sys/kernel/debug/visl/bitstream/bitstream1
|
||||
00000000: 0201 d021 49e1 0c40 aa11 1449 14a6 01dc ...!I..@...I....
|
||||
00000010: 7023 889a c8cd 2cd0 13b4 dab0 e8ca 21fe p#....,.......!.
|
||||
00000020: c4c8 ab4c 486e 4e2f b0df 96cc c74e 8dde ...LHnN/.....N..
|
||||
00000030: 8ce7 ee36 d880 4095 4d64 30a0 ff4f 0c5e ...6..@.Md0..O.^
|
||||
00000040: f16b a6a1 d806 ca2a 0ece a673 7bea 1f37 .k.....*...s{..7
|
||||
00000050: 370f 5bb9 1dc4 ba21 6434 bc53 0173 cba0 7.[....!d4.S.s..
|
||||
00000060: dfe6 bc99 01ea b6e0 346b 92b5 c8de 9f5d ........4k.....]
|
||||
00000070: e7cc 3484 1769 fef2 a693 a945 2c8b 31da ..4..i.....E,.1.
|
||||
|
||||
And so on.
|
||||
|
||||
By default, the files are removed during STREAMOFF. This is to reduce the amount
|
||||
of clutter.
|
@ -392,7 +392,7 @@ Which one is returned depends on the chosen channel, each next valid channel
|
||||
will cycle through the possible audio subchannel combinations. This allows
|
||||
you to test the various combinations by just switching channels..
|
||||
|
||||
Finally, for these inputs the v4l2_timecode struct is filled in in the
|
||||
Finally, for these inputs the v4l2_timecode struct is filled in the
|
||||
dequeued v4l2_buffer struct.
|
||||
|
||||
|
||||
|
@ -73,6 +73,10 @@ properties:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description: MIPI CSI-2 bridge input port
|
||||
|
||||
port@2:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description: Internal output port to the ISP
|
||||
|
||||
anyOf:
|
||||
- required:
|
||||
- port@0
|
||||
|
@ -0,0 +1,101 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/media/allwinner,sun6i-a31-isp.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Allwinner A31 Image Signal Processor Driver (ISP) Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Paul Kocialkowski <paul.kocialkowski@bootlin.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- allwinner,sun6i-a31-isp
|
||||
- allwinner,sun8i-v3s-isp
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Bus Clock
|
||||
- description: Module Clock
|
||||
- description: DRAM Clock
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: bus
|
||||
- const: mod
|
||||
- const: ram
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
ports:
|
||||
$ref: /schemas/graph.yaml#/properties/ports
|
||||
|
||||
properties:
|
||||
port@0:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description: CSI0 input port
|
||||
|
||||
port@1:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description: CSI1 input port
|
||||
|
||||
if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- allwinner,sun8i-v3s-isp
|
||||
then:
|
||||
required:
|
||||
- port@0
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- clocks
|
||||
- clock-names
|
||||
- resets
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/clock/sun8i-v3s-ccu.h>
|
||||
#include <dt-bindings/reset/sun8i-v3s-ccu.h>
|
||||
|
||||
isp: isp@1cb8000 {
|
||||
compatible = "allwinner,sun8i-v3s-isp";
|
||||
reg = <0x01cb8000 0x1000>;
|
||||
interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&ccu CLK_BUS_CSI>,
|
||||
<&ccu CLK_CSI1_SCLK>,
|
||||
<&ccu CLK_DRAM_CSI>;
|
||||
clock-names = "bus", "mod", "ram";
|
||||
resets = <&ccu RST_BUS_CSI>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
|
||||
isp_in_csi0: endpoint {
|
||||
remote-endpoint = <&csi0_out_isp>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
...
|
@ -1,57 +0,0 @@
|
||||
* Sony IMX290 1/2.8-Inch CMOS Image Sensor
|
||||
|
||||
The Sony IMX290 is a 1/2.8-Inch CMOS Solid-state image sensor with
|
||||
Square Pixel for Color Cameras. It is programmable through I2C and 4-wire
|
||||
interfaces. The sensor output is available via CMOS logic parallel SDR output,
|
||||
Low voltage LVDS DDR output and CSI-2 serial data output. The CSI-2 bus is the
|
||||
default. No bindings have been defined for the other busses.
|
||||
|
||||
Required Properties:
|
||||
- compatible: Should be "sony,imx290"
|
||||
- reg: I2C bus address of the device
|
||||
- clocks: Reference to the xclk clock.
|
||||
- clock-names: Should be "xclk".
|
||||
- clock-frequency: Frequency of the xclk clock in Hz.
|
||||
- vdddo-supply: Sensor digital IO regulator.
|
||||
- vdda-supply: Sensor analog regulator.
|
||||
- vddd-supply: Sensor digital core regulator.
|
||||
|
||||
Optional Properties:
|
||||
- reset-gpios: Sensor reset GPIO
|
||||
|
||||
The imx290 device node should contain one 'port' child node with
|
||||
an 'endpoint' subnode. For further reading on port node refer to
|
||||
Documentation/devicetree/bindings/media/video-interfaces.txt.
|
||||
|
||||
Required Properties on endpoint:
|
||||
- data-lanes: check ../video-interfaces.txt
|
||||
- link-frequencies: check ../video-interfaces.txt
|
||||
- remote-endpoint: check ../video-interfaces.txt
|
||||
|
||||
Example:
|
||||
&i2c1 {
|
||||
...
|
||||
imx290: camera-sensor@1a {
|
||||
compatible = "sony,imx290";
|
||||
reg = <0x1a>;
|
||||
|
||||
reset-gpios = <&msmgpio 35 GPIO_ACTIVE_LOW>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&camera_rear_default>;
|
||||
|
||||
clocks = <&gcc GCC_CAMSS_MCLK0_CLK>;
|
||||
clock-names = "xclk";
|
||||
clock-frequency = <37125000>;
|
||||
|
||||
vdddo-supply = <&camera_vdddo_1v8>;
|
||||
vdda-supply = <&camera_vdda_2v8>;
|
||||
vddd-supply = <&camera_vddd_1v5>;
|
||||
|
||||
port {
|
||||
imx290_ep: endpoint {
|
||||
data-lanes = <1 2 3 4>;
|
||||
link-frequencies = /bits/ 64 <445500000>;
|
||||
remote-endpoint = <&csiphy0_ep>;
|
||||
};
|
||||
};
|
||||
};
|
@ -104,6 +104,7 @@ additionalProperties: false
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/media/video-interfaces.h>
|
||||
|
||||
i2c2 {
|
||||
#address-cells = <1>;
|
||||
@ -124,7 +125,7 @@ examples:
|
||||
remote-endpoint = <&csi2a_ep>;
|
||||
link-frequencies = /bits/ 64 <199200000 210000000
|
||||
499200000>;
|
||||
bus-type = <4>;
|
||||
bus-type = <MEDIA_BUS_TYPE_CSI2_DPHY>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -1,54 +0,0 @@
|
||||
* Omnivision 1/4-Inch 5Mp CMOS Digital Image Sensor
|
||||
|
||||
The Omnivision OV5645 is a 1/4-Inch CMOS active pixel digital image sensor with
|
||||
an active array size of 2592H x 1944V. It is programmable through a serial I2C
|
||||
interface.
|
||||
|
||||
Required Properties:
|
||||
- compatible: Value should be "ovti,ov5645".
|
||||
- clocks: Reference to the xclk clock.
|
||||
- clock-names: Should be "xclk".
|
||||
- clock-frequency: Frequency of the xclk clock.
|
||||
- enable-gpios: Chip enable GPIO. Polarity is GPIO_ACTIVE_HIGH. This corresponds
|
||||
to the hardware pin PWDNB which is physically active low.
|
||||
- reset-gpios: Chip reset GPIO. Polarity is GPIO_ACTIVE_LOW. This corresponds to
|
||||
the hardware pin RESETB.
|
||||
- vdddo-supply: Chip digital IO regulator.
|
||||
- vdda-supply: Chip analog regulator.
|
||||
- vddd-supply: Chip digital core regulator.
|
||||
|
||||
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.
|
||||
|
||||
Example:
|
||||
|
||||
&i2c1 {
|
||||
...
|
||||
|
||||
ov5645: ov5645@3c {
|
||||
compatible = "ovti,ov5645";
|
||||
reg = <0x3c>;
|
||||
|
||||
enable-gpios = <&gpio1 6 GPIO_ACTIVE_HIGH>;
|
||||
reset-gpios = <&gpio5 20 GPIO_ACTIVE_LOW>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&camera_rear_default>;
|
||||
|
||||
clocks = <&clks 200>;
|
||||
clock-names = "xclk";
|
||||
clock-frequency = <24000000>;
|
||||
|
||||
vdddo-supply = <&camera_dovdd_1v8>;
|
||||
vdda-supply = <&camera_avdd_2v8>;
|
||||
vddd-supply = <&camera_dvdd_1v2>;
|
||||
|
||||
port {
|
||||
ov5645_ep: endpoint {
|
||||
clock-lanes = <1>;
|
||||
data-lanes = <0 2>;
|
||||
remote-endpoint = <&csi0_ep>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
134
Documentation/devicetree/bindings/media/i2c/ovti,ov4689.yaml
Normal file
134
Documentation/devicetree/bindings/media/i2c/ovti,ov4689.yaml
Normal file
@ -0,0 +1,134 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/media/i2c/ovti,ov4689.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Omnivision OV4689 CMOS
|
||||
|
||||
maintainers:
|
||||
- Mikhail Rudenko <mike.rudenko@gmail.com>
|
||||
|
||||
description: |
|
||||
The Omnivision OV4689 is a high performance, 1/3-inch, 4 megapixel
|
||||
image sensor. Ihis chip supports high frame rate speeds up to 90 fps
|
||||
at 2688x1520 resolution. It is programmable through an I2C
|
||||
interface, and sensor output is sent via 1/2/4 lane MIPI CSI-2
|
||||
connection.
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/media/video-interface-devices.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: ovti,ov4689
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
description:
|
||||
External clock (XVCLK) for the sensor, 6-64 MHz
|
||||
maxItems: 1
|
||||
|
||||
dovdd-supply:
|
||||
description:
|
||||
Digital I/O voltage supply, 1.7-3.0 V
|
||||
|
||||
avdd-supply:
|
||||
description:
|
||||
Analog voltage supply, 2.6-3.0 V
|
||||
|
||||
dvdd-supply:
|
||||
description:
|
||||
Digital core voltage supply, 1.1-1.3 V
|
||||
|
||||
powerdown-gpios:
|
||||
description:
|
||||
GPIO connected to the powerdown pin (active low)
|
||||
|
||||
reset-gpios:
|
||||
maxItems: 1
|
||||
description:
|
||||
GPIO connected to the reset pin (active low)
|
||||
|
||||
orientation: true
|
||||
|
||||
rotation: true
|
||||
|
||||
port:
|
||||
$ref: /schemas/graph.yaml#/$defs/port-base
|
||||
additionalProperties: false
|
||||
description:
|
||||
Output port node, single endpoint describing the CSI-2 transmitter
|
||||
|
||||
properties:
|
||||
endpoint:
|
||||
$ref: /schemas/media/video-interfaces.yaml#
|
||||
unevaluatedProperties: false
|
||||
|
||||
properties:
|
||||
data-lanes:
|
||||
oneOf:
|
||||
- items:
|
||||
- const: 1
|
||||
- const: 2
|
||||
- const: 3
|
||||
- const: 4
|
||||
- items:
|
||||
- const: 1
|
||||
- const: 2
|
||||
- items:
|
||||
- const: 1
|
||||
link-frequencies: true
|
||||
|
||||
required:
|
||||
- data-lanes
|
||||
- link-frequencies
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- dovdd-supply
|
||||
- avdd-supply
|
||||
- dvdd-supply
|
||||
- port
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
ov4689: camera@36 {
|
||||
compatible = "ovti,ov4689";
|
||||
reg = <0x36>;
|
||||
|
||||
clocks = <&ov4689_clk>;
|
||||
|
||||
avdd-supply = <&ov4689_avdd>;
|
||||
dovdd-supply = <&ov4689_dovdd>;
|
||||
dvdd-supply = <&ov4689_dvdd>;
|
||||
|
||||
powerdown-gpios = <&pio 107 GPIO_ACTIVE_LOW>;
|
||||
reset-gpios = <&pio 109 GPIO_ACTIVE_LOW>;
|
||||
|
||||
orientation = <2>;
|
||||
rotation = <0>;
|
||||
|
||||
port {
|
||||
wcam_out: endpoint {
|
||||
remote-endpoint = <&mipi_in_wcam>;
|
||||
data-lanes = <1 2 3 4>;
|
||||
link-frequencies = /bits/ 64 <504000000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
...
|
104
Documentation/devicetree/bindings/media/i2c/ovti,ov5645.yaml
Normal file
104
Documentation/devicetree/bindings/media/i2c/ovti,ov5645.yaml
Normal file
@ -0,0 +1,104 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/media/i2c/ovti,ov5645.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: OmniVision OV5645 Image Sensor Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: ovti,ov5645
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
description: XCLK Input Clock
|
||||
|
||||
clock-frequency:
|
||||
description: Frequency of the xclk clock in Hz.
|
||||
|
||||
vdda-supply:
|
||||
description: Analog voltage supply, 2.8 volts
|
||||
|
||||
vddd-supply:
|
||||
description: Digital core voltage supply, 1.5 volts
|
||||
|
||||
vdddo-supply:
|
||||
description: Digital I/O voltage supply, 1.8 volts
|
||||
|
||||
enable-gpios:
|
||||
maxItems: 1
|
||||
description:
|
||||
Reference to the GPIO connected to the PWDNB pin, if any.
|
||||
|
||||
reset-gpios:
|
||||
maxItems: 1
|
||||
description:
|
||||
Reference to the GPIO connected to the RESETB pin, if any.
|
||||
|
||||
port:
|
||||
description: Digital Output Port
|
||||
$ref: /schemas/graph.yaml#/$defs/port-base
|
||||
additionalProperties: false
|
||||
|
||||
properties:
|
||||
endpoint:
|
||||
$ref: /schemas/media/video-interfaces.yaml#
|
||||
unevaluatedProperties: false
|
||||
|
||||
properties:
|
||||
data-lanes:
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
items:
|
||||
enum: [1, 2]
|
||||
|
||||
required:
|
||||
- data-lanes
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- vdddo-supply
|
||||
- vdda-supply
|
||||
- vddd-supply
|
||||
- port
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
camera@3c {
|
||||
compatible = "ovti,ov5645";
|
||||
reg = <0x3c>;
|
||||
clocks = <&clks 1>;
|
||||
clock-frequency = <24000000>;
|
||||
vdddo-supply = <&ov5645_vdddo_1v8>;
|
||||
vdda-supply = <&ov5645_vdda_2v8>;
|
||||
vddd-supply = <&ov5645_vddd_1v5>;
|
||||
enable-gpios = <&gpio1 19 GPIO_ACTIVE_HIGH>;
|
||||
reset-gpios = <&gpio1 20 GPIO_ACTIVE_LOW>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_ov5645>;
|
||||
|
||||
port {
|
||||
ov5645_ep: endpoint {
|
||||
remote-endpoint = <&csi0_ep>;
|
||||
data-lanes = <1 2>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
...
|
@ -105,6 +105,7 @@ additionalProperties: false
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/media/video-interfaces.h>
|
||||
|
||||
i2c0 {
|
||||
#address-cells = <1>;
|
||||
@ -118,7 +119,7 @@ examples:
|
||||
|
||||
port {
|
||||
ov772x_0: endpoint {
|
||||
bus-type = <5>;
|
||||
bus-type = <MEDIA_BUS_TYPE_PARALLEL>;
|
||||
vsync-active = <0>;
|
||||
hsync-active = <0>;
|
||||
pclk-sample = <0>;
|
||||
|
@ -16,10 +16,13 @@ description:
|
||||
sensor with an active array size of 1296H x 816V. It is programmable through
|
||||
I2C interface. The I2C client address is fixed to 0x60/0x70 as per sensor data
|
||||
sheet. Image data is sent through MIPI CSI-2.
|
||||
OV9281 has a different lens chief ray angle.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: ovti,ov9282
|
||||
enum:
|
||||
- ovti,ov9281
|
||||
- ovti,ov9282
|
||||
reg:
|
||||
description: I2C address
|
||||
maxItems: 1
|
||||
@ -36,6 +39,15 @@ properties:
|
||||
description: Reference to the GPIO connected to the XCLR pin, if any.
|
||||
maxItems: 1
|
||||
|
||||
avdd-supply:
|
||||
description: Analog voltage supply, 2.8 volts
|
||||
|
||||
dvdd-supply:
|
||||
description: Digital core voltage supply, 1.2 volts
|
||||
|
||||
dovdd-supply:
|
||||
description: Digital I/O voltage supply, 1.8 volts
|
||||
|
||||
port:
|
||||
additionalProperties: false
|
||||
$ref: /schemas/graph.yaml#/$defs/port-base
|
||||
|
129
Documentation/devicetree/bindings/media/i2c/sony,imx290.yaml
Normal file
129
Documentation/devicetree/bindings/media/i2c/sony,imx290.yaml
Normal file
@ -0,0 +1,129 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/media/i2c/sony,imx290.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Sony IMX290 1/2.8-Inch CMOS Image Sensor
|
||||
|
||||
maintainers:
|
||||
- Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
|
||||
- Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
|
||||
description: |-
|
||||
The Sony IMX290 is a 1/2.8-Inch CMOS Solid-state image sensor with Square
|
||||
Pixel for Color Cameras. It is programmable through I2C and 4-wire
|
||||
interfaces. The sensor output is available via CMOS logic parallel SDR
|
||||
output, Low voltage LVDS DDR output and CSI-2 serial data output. The CSI-2
|
||||
bus is the default. No bindings have been defined for the other busses.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- sony,imx290
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
description: Input clock (37.125 MHz or 74.25 MHz)
|
||||
items:
|
||||
- const: xclk
|
||||
|
||||
clock-frequency:
|
||||
description: Frequency of the xclk clock in Hz
|
||||
|
||||
vdda-supply:
|
||||
description: Analog power supply (2.9V)
|
||||
|
||||
vddd-supply:
|
||||
description: Digital core power supply (1.2V)
|
||||
|
||||
vdddo-supply:
|
||||
description: Digital I/O power supply (1.8V)
|
||||
|
||||
reset-gpios:
|
||||
description: Sensor reset (XCLR) GPIO
|
||||
maxItems: 1
|
||||
|
||||
port:
|
||||
$ref: /schemas/graph.yaml#/$defs/port-base
|
||||
description: |
|
||||
Video output port
|
||||
|
||||
properties:
|
||||
endpoint:
|
||||
$ref: /schemas/media/video-interfaces.yaml#
|
||||
unevaluatedProperties: false
|
||||
|
||||
properties:
|
||||
data-lanes:
|
||||
anyOf:
|
||||
- items:
|
||||
- const: 1
|
||||
- const: 2
|
||||
- items:
|
||||
- const: 1
|
||||
- const: 2
|
||||
- const: 3
|
||||
- const: 4
|
||||
|
||||
link-frequencies: true
|
||||
|
||||
required:
|
||||
- data-lanes
|
||||
- link-frequencies
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- clock-names
|
||||
- clock-frequency
|
||||
- vdda-supply
|
||||
- vddd-supply
|
||||
- vdddo-supply
|
||||
- port
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
imx290: camera-sensor@1a {
|
||||
compatible = "sony,imx290";
|
||||
reg = <0x1a>;
|
||||
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&camera_rear_default>;
|
||||
|
||||
clocks = <&gcc 90>;
|
||||
clock-names = "xclk";
|
||||
clock-frequency = <37125000>;
|
||||
|
||||
vdddo-supply = <&camera_vdddo_1v8>;
|
||||
vdda-supply = <&camera_vdda_2v8>;
|
||||
vddd-supply = <&camera_vddd_1v5>;
|
||||
|
||||
reset-gpios = <&msmgpio 35 GPIO_ACTIVE_LOW>;
|
||||
|
||||
port {
|
||||
imx290_ep: endpoint {
|
||||
data-lanes = <1 2 3 4>;
|
||||
link-frequencies = /bits/ 64 <445500000>;
|
||||
remote-endpoint = <&csiphy0_ep>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
...
|
@ -19,7 +19,9 @@ description:
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: sony,imx412
|
||||
enum:
|
||||
- sony,imx412
|
||||
- sony,imx577
|
||||
reg:
|
||||
description: I2C address
|
||||
maxItems: 1
|
||||
|
113
Documentation/devicetree/bindings/media/i2c/st,st-vgxy61.yaml
Normal file
113
Documentation/devicetree/bindings/media/i2c/st,st-vgxy61.yaml
Normal file
@ -0,0 +1,113 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
# Copyright (c) 2022 STMicroelectronics SA.
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/media/i2c/st,st-vgxy61.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: STMicroelectronics VGxy61 HDR Global Shutter Sensor Family Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Benjamin Mugnier <benjamin.mugnier@foss.st.com>
|
||||
- Sylvain Petinot <sylvain.petinot@foss.st.com>
|
||||
|
||||
description: |-
|
||||
STMicroelectronics VGxy61 family has a CSI-2 output port. CSI-2 output is a
|
||||
quad lanes 800Mbps per lane.
|
||||
Supported formats are RAW8, RAW10, RAW12, RAW14 and RAW16.
|
||||
Following part number are supported
|
||||
- VG5661 and VG6661 are 1.6 Mpx (1464 x 1104) monochrome and color sensors.
|
||||
Maximum frame rate is 75 fps.
|
||||
- VG5761 and VG6761 are 2.3 Mpx (1944 x 1204) monochrome and color sensors.
|
||||
Maximum frame rate is 60 fps.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: st,st-vgxy61
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
VCORE-supply:
|
||||
description:
|
||||
Sensor digital core supply. Must be 1.2 volts.
|
||||
|
||||
VDDIO-supply:
|
||||
description:
|
||||
Sensor digital IO supply. Must be 1.8 volts.
|
||||
|
||||
VANA-supply:
|
||||
description:
|
||||
Sensor analog supply. Must be 2.8 volts.
|
||||
|
||||
reset-gpios:
|
||||
description:
|
||||
Reference to the GPIO connected to the reset pin, if any.
|
||||
This is an active low signal to the vgxy61.
|
||||
|
||||
st,strobe-gpios-polarity:
|
||||
description:
|
||||
Invert polarity of illuminator's lights strobe GPIOs.
|
||||
These GPIOs directly drive the illuminator LEDs.
|
||||
type: boolean
|
||||
|
||||
port:
|
||||
$ref: /schemas/graph.yaml#/$defs/port-base
|
||||
additionalProperties: false
|
||||
|
||||
properties:
|
||||
endpoint:
|
||||
$ref: /schemas/media/video-interfaces.yaml#
|
||||
unevaluatedProperties: false
|
||||
|
||||
properties:
|
||||
data-lanes:
|
||||
description:
|
||||
CSI lanes to use
|
||||
items:
|
||||
- const: 1
|
||||
- const: 2
|
||||
- const: 3
|
||||
- const: 4
|
||||
|
||||
remote-endpoint: true
|
||||
|
||||
required:
|
||||
- data-lanes
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- clocks
|
||||
- VCORE-supply
|
||||
- VDDIO-supply
|
||||
- VANA-supply
|
||||
- port
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
vgxy61: csi2tx@10 {
|
||||
compatible = "st,st-vgxy61";
|
||||
reg = <0x10>;
|
||||
clocks = <&clk_ext_camera>;
|
||||
VCORE-supply = <&v1v2>;
|
||||
VDDIO-supply = <&v1v8>;
|
||||
VANA-supply = <&v2v8>;
|
||||
reset-gpios = <&mfxgpio 18 GPIO_ACTIVE_LOW>;
|
||||
port {
|
||||
ep0: endpoint {
|
||||
data-lanes = <1 2 3 4>;
|
||||
remote-endpoint = <&mipi_csi2_out>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
...
|
@ -0,0 +1,178 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/media/i2c/toshiba,tc358746.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Toshiba TC358746 Parallel to MIPI CSI2 Bridge
|
||||
|
||||
maintainers:
|
||||
- Marco Felsch <kernel@pengutronix.de>
|
||||
|
||||
description: |-
|
||||
The Toshiba TC358746 converts a parallel video stream into a MIPI CSI-2
|
||||
stream. The direction can be either parallel-in -> csi-out or csi-in ->
|
||||
parallel-out The chip is programmable trough I2C and SPI but the SPI
|
||||
interface is only supported in parallel-in -> csi-out mode.
|
||||
|
||||
Note that the current device tree bindings only support the
|
||||
parallel-in -> csi-out path.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: toshiba,tc358746
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
description:
|
||||
The phandle to the reference clock source. This corresponds to the
|
||||
hardware pin REFCLK.
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
const: refclk
|
||||
|
||||
"#clock-cells":
|
||||
description: |
|
||||
The bridge can act as clock provider for the sensor. To enable this
|
||||
support #clock-cells must be specified. Attention if this feature is used
|
||||
then the mclk rate must be at least: (2 * link-frequency) / 8
|
||||
`------------------´ ^
|
||||
internal PLL rate smallest possible
|
||||
mclk-div
|
||||
const: 0
|
||||
|
||||
clock-output-names:
|
||||
description:
|
||||
The clock name of the MCLK output, the default name is tc358746-mclk.
|
||||
maxItems: 1
|
||||
|
||||
vddc-supply:
|
||||
description: Digital core voltage supply, 1.2 volts
|
||||
|
||||
vddio-supply:
|
||||
description: Digital I/O voltage supply, 1.8 volts
|
||||
|
||||
vddmipi-supply:
|
||||
description: MIPI CSI phy voltage supply, 1.2 volts
|
||||
|
||||
reset-gpios:
|
||||
description:
|
||||
The phandle and specifier for the GPIO that controls the chip reset.
|
||||
This corresponds to the hardware pin RESX which is physically active low.
|
||||
maxItems: 1
|
||||
|
||||
ports:
|
||||
$ref: /schemas/graph.yaml#/properties/ports
|
||||
properties:
|
||||
port@0:
|
||||
$ref: /schemas/graph.yaml#/$defs/port-base
|
||||
description: Input port
|
||||
|
||||
properties:
|
||||
endpoint:
|
||||
$ref: /schemas/media/video-interfaces.yaml#
|
||||
unevaluatedProperties: false
|
||||
|
||||
properties:
|
||||
hsync-active: true
|
||||
vsync-active: true
|
||||
bus-type:
|
||||
enum: [ 5, 6 ]
|
||||
|
||||
required:
|
||||
- hsync-active
|
||||
- vsync-active
|
||||
- bus-type
|
||||
|
||||
port@1:
|
||||
$ref: /schemas/graph.yaml#/$defs/port-base
|
||||
description: Output port
|
||||
|
||||
properties:
|
||||
endpoint:
|
||||
$ref: /schemas/media/video-interfaces.yaml#
|
||||
unevaluatedProperties: false
|
||||
|
||||
properties:
|
||||
data-lanes:
|
||||
minItems: 1
|
||||
maxItems: 4
|
||||
|
||||
clock-noncontinuous: true
|
||||
link-frequencies: true
|
||||
|
||||
required:
|
||||
- data-lanes
|
||||
- link-frequencies
|
||||
|
||||
required:
|
||||
- port@0
|
||||
- port@1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- clock-names
|
||||
- vddc-supply
|
||||
- vddio-supply
|
||||
- vddmipi-supply
|
||||
- ports
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
csi-bridge@e {
|
||||
compatible = "toshiba,tc358746";
|
||||
reg = <0xe>;
|
||||
|
||||
clocks = <&refclk>;
|
||||
clock-names = "refclk";
|
||||
|
||||
reset-gpios = <&gpio 2 GPIO_ACTIVE_LOW>;
|
||||
|
||||
vddc-supply = <&v1_2d>;
|
||||
vddio-supply = <&v1_8d>;
|
||||
vddmipi-supply = <&v1_2d>;
|
||||
|
||||
/* sensor mclk provider */
|
||||
#clock-cells = <0>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
/* Input */
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
tc358746_in: endpoint {
|
||||
remote-endpoint = <&sensor_out>;
|
||||
hsync-active = <0>;
|
||||
vsync-active = <0>;
|
||||
bus-type = <5>;
|
||||
};
|
||||
};
|
||||
|
||||
/* Output */
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
tc358746_out: endpoint {
|
||||
remote-endpoint = <&mipi_csi2_in>;
|
||||
data-lanes = <1 2>;
|
||||
clock-noncontinuous;
|
||||
link-frequencies = /bits/ 64 <216000000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
@ -68,6 +68,7 @@ additionalProperties: false
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/marvell,mmp2.h>
|
||||
#include <dt-bindings/media/video-interfaces.h>
|
||||
#include <dt-bindings/power/marvell,mmp2.h>
|
||||
|
||||
camera@d420a000 {
|
||||
@ -83,7 +84,7 @@ examples:
|
||||
port {
|
||||
camera0_0: endpoint {
|
||||
remote-endpoint = <&ov7670_0>;
|
||||
bus-type = <5>; /* Parallel */
|
||||
bus-type = <MEDIA_BUS_TYPE_PARALLEL>;
|
||||
hsync-active = <1>; /* Active high */
|
||||
vsync-active = <1>; /* Active high */
|
||||
pclk-sample = <0>; /* Falling */
|
||||
|
@ -0,0 +1,168 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/media/mediatek,mt8195-jpegdec.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: MediaTek JPEG Decoder
|
||||
|
||||
maintainers:
|
||||
- kyrie wu <kyrie.wu@mediatek.corp-partner.google.com>
|
||||
|
||||
description:
|
||||
MediaTek JPEG Decoder is the JPEG decode hardware present in MediaTek SoCs
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: mediatek,mt8195-jpgdec
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
iommus:
|
||||
maxItems: 6
|
||||
description:
|
||||
Points to the respective IOMMU block with master port as argument, see
|
||||
Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml for details.
|
||||
Ports are according to the HW.
|
||||
|
||||
dma-ranges:
|
||||
maxItems: 1
|
||||
description: |
|
||||
Describes the physical address space of IOMMU maps to memory.
|
||||
|
||||
"#address-cells":
|
||||
const: 2
|
||||
|
||||
"#size-cells":
|
||||
const: 2
|
||||
|
||||
ranges: true
|
||||
|
||||
# Required child node:
|
||||
patternProperties:
|
||||
"^jpgdec@[0-9a-f]+$":
|
||||
type: object
|
||||
description:
|
||||
The jpeg decoder hardware device node which should be added as subnodes to
|
||||
the main jpeg node.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: mediatek,mt8195-jpgdec-hw
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
iommus:
|
||||
minItems: 1
|
||||
maxItems: 32
|
||||
description:
|
||||
List of the hardware port in respective IOMMU block for current Socs.
|
||||
Refer to bindings/iommu/mediatek,iommu.yaml.
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: jpgdec
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- iommus
|
||||
- interrupts
|
||||
- clocks
|
||||
- clock-names
|
||||
- power-domains
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- power-domains
|
||||
- iommus
|
||||
- dma-ranges
|
||||
- ranges
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/memory/mt8195-memory-port.h>
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/clock/mt8195-clk.h>
|
||||
#include <dt-bindings/power/mt8195-power.h>
|
||||
|
||||
soc {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
|
||||
jpgdec-master {
|
||||
compatible = "mediatek,mt8195-jpgdec";
|
||||
power-domains = <&spm MT8195_POWER_DOMAIN_VDEC1>;
|
||||
iommus = <&iommu_vpp M4U_PORT_L19_JPGDEC_WDMA0>,
|
||||
<&iommu_vpp M4U_PORT_L19_JPGDEC_BSDMA0>,
|
||||
<&iommu_vpp M4U_PORT_L19_JPGDEC_WDMA1>,
|
||||
<&iommu_vpp M4U_PORT_L19_JPGDEC_BSDMA1>,
|
||||
<&iommu_vpp M4U_PORT_L19_JPGDEC_BUFF_OFFSET1>,
|
||||
<&iommu_vpp M4U_PORT_L19_JPGDEC_BUFF_OFFSET0>;
|
||||
dma-ranges = <0x1 0x0 0x0 0x40000000 0x0 0xfff00000>;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
|
||||
jpgdec@1a040000 {
|
||||
compatible = "mediatek,mt8195-jpgdec-hw";
|
||||
reg = <0 0x1a040000 0 0x10000>;/* JPGDEC_C0 */
|
||||
iommus = <&iommu_vdo M4U_PORT_L19_JPGDEC_WDMA0>,
|
||||
<&iommu_vdo M4U_PORT_L19_JPGDEC_BSDMA0>,
|
||||
<&iommu_vdo M4U_PORT_L19_JPGDEC_WDMA1>,
|
||||
<&iommu_vdo M4U_PORT_L19_JPGDEC_BSDMA1>,
|
||||
<&iommu_vdo M4U_PORT_L19_JPGDEC_BUFF_OFFSET1>,
|
||||
<&iommu_vdo M4U_PORT_L19_JPGDEC_BUFF_OFFSET0>;
|
||||
interrupts = <GIC_SPI 343 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
clocks = <&vencsys CLK_VENC_JPGDEC>;
|
||||
clock-names = "jpgdec";
|
||||
power-domains = <&spm MT8195_POWER_DOMAIN_VDEC0>;
|
||||
};
|
||||
|
||||
jpgdec@1a050000 {
|
||||
compatible = "mediatek,mt8195-jpgdec-hw";
|
||||
reg = <0 0x1a050000 0 0x10000>;/* JPGDEC_C1 */
|
||||
iommus = <&iommu_vdo M4U_PORT_L19_JPGDEC_WDMA0>,
|
||||
<&iommu_vdo M4U_PORT_L19_JPGDEC_BSDMA0>,
|
||||
<&iommu_vdo M4U_PORT_L19_JPGDEC_WDMA1>,
|
||||
<&iommu_vdo M4U_PORT_L19_JPGDEC_BSDMA1>,
|
||||
<&iommu_vdo M4U_PORT_L19_JPGDEC_BUFF_OFFSET1>,
|
||||
<&iommu_vdo M4U_PORT_L19_JPGDEC_BUFF_OFFSET0>;
|
||||
interrupts = <GIC_SPI 344 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
clocks = <&vencsys CLK_VENC_JPGDEC_C1>;
|
||||
clock-names = "jpgdec";
|
||||
power-domains = <&spm MT8195_POWER_DOMAIN_VDEC1>;
|
||||
};
|
||||
|
||||
jpgdec@1b040000 {
|
||||
compatible = "mediatek,mt8195-jpgdec-hw";
|
||||
reg = <0 0x1b040000 0 0x10000>;/* JPGDEC_C2 */
|
||||
iommus = <&iommu_vpp M4U_PORT_L20_JPGDEC_WDMA0>,
|
||||
<&iommu_vpp M4U_PORT_L20_JPGDEC_BSDMA0>,
|
||||
<&iommu_vpp M4U_PORT_L20_JPGDEC_WDMA1>,
|
||||
<&iommu_vpp M4U_PORT_L20_JPGDEC_BSDMA1>,
|
||||
<&iommu_vpp M4U_PORT_L20_JPGDEC_BUFF_OFFSET1>,
|
||||
<&iommu_vpp M4U_PORT_L20_JPGDEC_BUFF_OFFSET0>;
|
||||
interrupts = <GIC_SPI 348 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
clocks = <&vencsys_core1 CLK_VENC_CORE1_JPGDEC>;
|
||||
clock-names = "jpgdec";
|
||||
power-domains = <&spm MT8195_POWER_DOMAIN_VDEC2>;
|
||||
};
|
||||
};
|
||||
};
|
@ -0,0 +1,147 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/media/mediatek,mt8195-jpegenc.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: MediaTek JPEG Encoder
|
||||
|
||||
maintainers:
|
||||
- kyrie wu <kyrie.wu@mediatek.corp-partner.google.com>
|
||||
|
||||
description:
|
||||
MediaTek JPEG Encoder is the JPEG encode hardware present in MediaTek SoCs
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: mediatek,mt8195-jpgenc
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
iommus:
|
||||
maxItems: 4
|
||||
description:
|
||||
Points to the respective IOMMU block with master port as argument, see
|
||||
Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml for details.
|
||||
Ports are according to the HW.
|
||||
|
||||
dma-ranges:
|
||||
maxItems: 1
|
||||
description: |
|
||||
Describes the physical address space of IOMMU maps to memory.
|
||||
|
||||
"#address-cells":
|
||||
const: 2
|
||||
|
||||
"#size-cells":
|
||||
const: 2
|
||||
|
||||
ranges: true
|
||||
|
||||
# Required child node:
|
||||
patternProperties:
|
||||
"^jpgenc@[0-9a-f]+$":
|
||||
type: object
|
||||
description:
|
||||
The jpeg encoder hardware device node which should be added as subnodes to
|
||||
the main jpeg node.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: mediatek,mt8195-jpgenc-hw
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
iommus:
|
||||
minItems: 1
|
||||
maxItems: 32
|
||||
description:
|
||||
List of the hardware port in respective IOMMU block for current Socs.
|
||||
Refer to bindings/iommu/mediatek,iommu.yaml.
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: jpgenc
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- iommus
|
||||
- interrupts
|
||||
- clocks
|
||||
- clock-names
|
||||
- power-domains
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- power-domains
|
||||
- iommus
|
||||
- dma-ranges
|
||||
- ranges
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/memory/mt8195-memory-port.h>
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/clock/mt8195-clk.h>
|
||||
#include <dt-bindings/power/mt8195-power.h>
|
||||
|
||||
soc {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
|
||||
jpgenc-master {
|
||||
compatible = "mediatek,mt8195-jpgenc";
|
||||
power-domains = <&spm MT8195_POWER_DOMAIN_VENC_CORE1>;
|
||||
iommus = <&iommu_vpp M4U_PORT_L20_JPGENC_Y_RDMA>,
|
||||
<&iommu_vpp M4U_PORT_L20_JPGENC_C_RDMA>,
|
||||
<&iommu_vpp M4U_PORT_L20_JPGENC_Q_TABLE>,
|
||||
<&iommu_vpp M4U_PORT_L20_JPGENC_BSDMA>;
|
||||
dma-ranges = <0x1 0x0 0x0 0x40000000 0x0 0xfff00000>;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
|
||||
jpgenc@1a030000 {
|
||||
compatible = "mediatek,mt8195-jpgenc-hw";
|
||||
reg = <0 0x1a030000 0 0x10000>;
|
||||
iommus = <&iommu_vdo M4U_PORT_L19_JPGENC_Y_RDMA>,
|
||||
<&iommu_vdo M4U_PORT_L19_JPGENC_C_RDMA>,
|
||||
<&iommu_vdo M4U_PORT_L19_JPGENC_Q_TABLE>,
|
||||
<&iommu_vdo M4U_PORT_L19_JPGENC_BSDMA>;
|
||||
interrupts = <GIC_SPI 342 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
clocks = <&vencsys CLK_VENC_JPGENC>;
|
||||
clock-names = "jpgenc";
|
||||
power-domains = <&spm MT8195_POWER_DOMAIN_VENC>;
|
||||
};
|
||||
|
||||
jpgenc@1b030000 {
|
||||
compatible = "mediatek,mt8195-jpgenc-hw";
|
||||
reg = <0 0x1b030000 0 0x10000>;
|
||||
iommus = <&iommu_vpp M4U_PORT_L20_JPGENC_Y_RDMA>,
|
||||
<&iommu_vpp M4U_PORT_L20_JPGENC_C_RDMA>,
|
||||
<&iommu_vpp M4U_PORT_L20_JPGENC_Q_TABLE>,
|
||||
<&iommu_vpp M4U_PORT_L20_JPGENC_BSDMA>;
|
||||
interrupts = <GIC_SPI 347 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
clocks = <&vencsys_core1 CLK_VENC_CORE1_JPGENC>;
|
||||
clock-names = "jpgenc";
|
||||
power-domains = <&spm MT8195_POWER_DOMAIN_VENC_CORE1>;
|
||||
};
|
||||
};
|
||||
};
|
@ -67,6 +67,12 @@ properties:
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
"#address-cells":
|
||||
const: 2
|
||||
|
||||
"#size-cells":
|
||||
const: 2
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
@ -84,7 +90,9 @@ allOf:
|
||||
contains:
|
||||
enum:
|
||||
- mediatek,mt8183-vcodec-enc
|
||||
- mediatek,mt8188-vcodec-enc
|
||||
- mediatek,mt8192-vcodec-enc
|
||||
- mediatek,mt8195-vcodec-enc
|
||||
|
||||
then:
|
||||
required:
|
||||
@ -107,7 +115,9 @@ allOf:
|
||||
compatible:
|
||||
enum:
|
||||
- mediatek,mt8173-vcodec-enc
|
||||
- mediatek,mt8188-vcodec-enc
|
||||
- mediatek,mt8192-vcodec-enc
|
||||
- mediatek,mt8195-vcodec-enc
|
||||
|
||||
then:
|
||||
properties:
|
||||
@ -118,7 +128,7 @@ allOf:
|
||||
clock-names:
|
||||
items:
|
||||
- const: venc_sel
|
||||
else: # for vp8 hw decoder
|
||||
else: # for vp8 hw encoder
|
||||
properties:
|
||||
clock:
|
||||
items:
|
||||
|
@ -22,6 +22,7 @@ properties:
|
||||
- items:
|
||||
- enum:
|
||||
- mediatek,mt7623-jpgdec
|
||||
- mediatek,mt8188-jpgdec
|
||||
- const: mediatek,mt2701-jpgdec
|
||||
|
||||
reg:
|
||||
|
@ -19,6 +19,7 @@ properties:
|
||||
- mediatek,mt2701-jpgenc
|
||||
- mediatek,mt8183-jpgenc
|
||||
- mediatek,mt8186-jpgenc
|
||||
- mediatek,mt8188-jpgenc
|
||||
- const: mediatek,mtk-jpgenc
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
@ -106,6 +106,7 @@ examples:
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/clock/at91.h>
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/media/video-interfaces.h>
|
||||
|
||||
xisc: xisc@e1408000 {
|
||||
compatible = "microchip,sama7g5-isc";
|
||||
@ -118,7 +119,7 @@ examples:
|
||||
|
||||
port {
|
||||
xisc_in: endpoint {
|
||||
bus-type = <5>; /* Parallel */
|
||||
bus-type = <MEDIA_BUS_TYPE_PARALLEL>;
|
||||
remote-endpoint = <&csi2dc_out>;
|
||||
hsync-active = <1>;
|
||||
vsync-active = <1>;
|
||||
|
157
Documentation/devicetree/bindings/media/renesas,rzg2l-cru.yaml
Normal file
157
Documentation/devicetree/bindings/media/renesas,rzg2l-cru.yaml
Normal file
@ -0,0 +1,157 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
# Copyright (C) 2022 Renesas Electronics Corp.
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/media/renesas,rzg2l-cru.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Renesas RZ/G2L (and alike SoC's) Camera Data Receiving Unit (CRU) Image processing
|
||||
|
||||
maintainers:
|
||||
- Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
|
||||
|
||||
description:
|
||||
The CRU image processing module is a data conversion module equipped with pixel
|
||||
color space conversion, LUT, pixel format conversion, etc. An MIPI CSI-2 input and
|
||||
parallel (including ITU-R BT.656) input are provided as the image sensor interface.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- renesas,r9a07g044-cru # RZ/G2{L,LC}
|
||||
- renesas,r9a07g054-cru # RZ/V2L
|
||||
- const: renesas,rzg2l-cru
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 3
|
||||
|
||||
interrupt-names:
|
||||
items:
|
||||
- const: image_conv
|
||||
- const: image_conv_err
|
||||
- const: axi_mst_err
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: CRU Main clock
|
||||
- description: CRU Register access clock
|
||||
- description: CRU image transfer clock
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: video
|
||||
- const: apb
|
||||
- const: axi
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
resets:
|
||||
items:
|
||||
- description: CRU_PRESETN reset terminal
|
||||
- description: CRU_ARESETN reset terminal
|
||||
|
||||
reset-names:
|
||||
items:
|
||||
- const: presetn
|
||||
- const: aresetn
|
||||
|
||||
ports:
|
||||
$ref: /schemas/graph.yaml#/properties/ports
|
||||
|
||||
properties:
|
||||
port@0:
|
||||
$ref: /schemas/graph.yaml#/$defs/port-base
|
||||
unevaluatedProperties: false
|
||||
description:
|
||||
Input port node, single endpoint describing a parallel input source.
|
||||
|
||||
properties:
|
||||
endpoint:
|
||||
$ref: video-interfaces.yaml#
|
||||
unevaluatedProperties: false
|
||||
|
||||
properties:
|
||||
hsync-active: true
|
||||
vsync-active: true
|
||||
bus-width: true
|
||||
data-shift: true
|
||||
|
||||
port@1:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description:
|
||||
Input port node, describing the Image Processing module connected to the
|
||||
CSI-2 receiver.
|
||||
|
||||
required:
|
||||
- port@0
|
||||
- port@1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- interrupt-names
|
||||
- clocks
|
||||
- clock-names
|
||||
- resets
|
||||
- reset-names
|
||||
- power-domains
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
# Device node example with CSI-2
|
||||
- |
|
||||
#include <dt-bindings/clock/r9a07g044-cpg.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
cru: video@10830000 {
|
||||
compatible = "renesas,r9a07g044-cru", "renesas,rzg2l-cru";
|
||||
reg = <0x10830000 0x400>;
|
||||
interrupts = <GIC_SPI 167 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "image_conv", "image_conv_err", "axi_mst_err";
|
||||
clocks = <&cpg CPG_MOD R9A07G044_CRU_VCLK>,
|
||||
<&cpg CPG_MOD R9A07G044_CRU_PCLK>,
|
||||
<&cpg CPG_MOD R9A07G044_CRU_ACLK>;
|
||||
clock-names = "video", "apb", "axi";
|
||||
power-domains = <&cpg>;
|
||||
resets = <&cpg R9A07G044_CRU_PRESETN>,
|
||||
<&cpg R9A07G044_CRU_ARESETN>;
|
||||
reset-names = "presetn", "aresetn";
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0>;
|
||||
|
||||
cru_parallel_in: endpoint@0 {
|
||||
reg = <0>;
|
||||
remote-endpoint= <&ov5642>;
|
||||
hsync-active = <1>;
|
||||
vsync-active = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
port@1 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <1>;
|
||||
|
||||
cru_csi_in: endpoint@0 {
|
||||
reg = <0>;
|
||||
remote-endpoint= <&csi_cru_in>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
149
Documentation/devicetree/bindings/media/renesas,rzg2l-csi2.yaml
Normal file
149
Documentation/devicetree/bindings/media/renesas,rzg2l-csi2.yaml
Normal file
@ -0,0 +1,149 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
# Copyright (C) 2022 Renesas Electronics Corp.
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/media/renesas,rzg2l-csi2.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Renesas RZ/G2L (and alike SoC's) MIPI CSI-2 receiver
|
||||
|
||||
maintainers:
|
||||
- Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
|
||||
|
||||
description:
|
||||
The CSI-2 receiver device provides MIPI CSI-2 capabilities for the Renesas RZ/G2L
|
||||
(and alike SoCs). MIPI CSI-2 is part of the CRU block which is used in conjunction
|
||||
with the Image Processing module, which provides the video capture capabilities.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- renesas,r9a07g044-csi2 # RZ/G2{L,LC}
|
||||
- renesas,r9a07g054-csi2 # RZ/V2L
|
||||
- const: renesas,rzg2l-csi2
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Internal clock for connecting CRU and MIPI
|
||||
- description: CRU Main clock
|
||||
- description: CRU Register access clock
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: system
|
||||
- const: video
|
||||
- const: apb
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
resets:
|
||||
items:
|
||||
- description: CRU_PRESETN reset terminal
|
||||
- description: CRU_CMN_RSTB reset terminal
|
||||
|
||||
reset-names:
|
||||
items:
|
||||
- const: presetn
|
||||
- const: cmn-rstb
|
||||
|
||||
ports:
|
||||
$ref: /schemas/graph.yaml#/properties/ports
|
||||
|
||||
properties:
|
||||
port@0:
|
||||
$ref: /schemas/graph.yaml#/$defs/port-base
|
||||
unevaluatedProperties: false
|
||||
description:
|
||||
Input port node, single endpoint describing the CSI-2 transmitter.
|
||||
|
||||
properties:
|
||||
endpoint:
|
||||
$ref: video-interfaces.yaml#
|
||||
unevaluatedProperties: false
|
||||
|
||||
properties:
|
||||
data-lanes:
|
||||
minItems: 1
|
||||
maxItems: 4
|
||||
items:
|
||||
maximum: 4
|
||||
|
||||
required:
|
||||
- clock-lanes
|
||||
- data-lanes
|
||||
|
||||
port@1:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description:
|
||||
Output port node, Image Processing block connected to the CSI-2 receiver.
|
||||
|
||||
required:
|
||||
- port@0
|
||||
- port@1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- clocks
|
||||
- clock-names
|
||||
- power-domains
|
||||
- resets
|
||||
- reset-names
|
||||
- ports
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/r9a07g044-cpg.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
csi: csi@10830400 {
|
||||
compatible = "renesas,r9a07g044-csi2", "renesas,rzg2l-csi2";
|
||||
reg = <0x10830400 0xfc00>;
|
||||
interrupts = <GIC_SPI 166 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&cpg CPG_MOD R9A07G044_CRU_SYSCLK>,
|
||||
<&cpg CPG_MOD R9A07G044_CRU_VCLK>,
|
||||
<&cpg CPG_MOD R9A07G044_CRU_PCLK>;
|
||||
clock-names = "system", "video", "apb";
|
||||
power-domains = <&cpg>;
|
||||
resets = <&cpg R9A07G044_CRU_PRESETN>,
|
||||
<&cpg R9A07G044_CRU_CMN_RSTB>;
|
||||
reset-names = "presetn", "cmn-rstb";
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
|
||||
csi2_in: endpoint {
|
||||
clock-lanes = <0>;
|
||||
data-lanes = <1 2>;
|
||||
remote-endpoint = <&ov5645_ep>;
|
||||
};
|
||||
};
|
||||
|
||||
port@1 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
reg = <1>;
|
||||
|
||||
csi2cru: endpoint@0 {
|
||||
reg = <0>;
|
||||
remote-endpoint = <&crucsi2>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
@ -10,10 +10,12 @@ Required properties:
|
||||
- compatible : value should be either one among the following
|
||||
(a) "samsung,mfc-v5" for MFC v5 present in Exynos4 SoCs
|
||||
(b) "samsung,mfc-v6" for MFC v6 present in Exynos5 SoCs
|
||||
(c) "samsung,mfc-v7" for MFC v7 present in Exynos5420 SoC
|
||||
(d) "samsung,mfc-v8" for MFC v8 present in Exynos5800 SoC
|
||||
(e) "samsung,exynos5433-mfc" for MFC v8 present in Exynos5433 SoC
|
||||
(f) "samsung,mfc-v10" for MFC v10 present in Exynos7880 SoC
|
||||
(c) "samsung,exynos3250-mfc", "samsung,mfc-v7" for MFC v7
|
||||
present in Exynos3250 SoC
|
||||
(d) "samsung,mfc-v7" for MFC v7 present in Exynos5420 SoC
|
||||
(e) "samsung,mfc-v8" for MFC v8 present in Exynos5800 SoC
|
||||
(f) "samsung,exynos5433-mfc" for MFC v8 present in Exynos5433 SoC
|
||||
(g) "samsung,mfc-v10" for MFC v10 present in Exynos7880 SoC
|
||||
|
||||
- reg : Physical base address of the IP registers and length of memory
|
||||
mapped region.
|
||||
|
@ -76,7 +76,7 @@ i2c@138a000000 {
|
||||
clock-frequency = <24000000>;
|
||||
clocks = <&clk 0>;
|
||||
clock-names = "cis_extclk";
|
||||
reset-gpios = <&gpf1 3 1>;
|
||||
xshutdown-gpios = <&gpf1 3 1>;
|
||||
standby-gpios = <&gpm0 1 1>;
|
||||
port {
|
||||
s5c73m3_ep: endpoint {
|
||||
|
@ -90,7 +90,9 @@ examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/clock/stm32mp1-clks.h>
|
||||
#include <dt-bindings/media/video-interfaces.h>
|
||||
#include <dt-bindings/reset/stm32mp1-resets.h>
|
||||
|
||||
dcmi: dcmi@4c006000 {
|
||||
compatible = "st,stm32-dcmi";
|
||||
reg = <0x4c006000 0x400>;
|
||||
@ -104,7 +106,7 @@ examples:
|
||||
port {
|
||||
dcmi_0: endpoint {
|
||||
remote-endpoint = <&ov5640_0>;
|
||||
bus-type = <5>;
|
||||
bus-type = <MEDIA_BUS_TYPE_PARALLEL>;
|
||||
bus-width = <8>;
|
||||
hsync-active = <0>;
|
||||
vsync-active = <0>;
|
||||
|
@ -145,9 +145,10 @@ properties:
|
||||
|
||||
pclk-sample:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
enum: [ 0, 1 ]
|
||||
enum: [ 0, 1, 2 ]
|
||||
description:
|
||||
Sample data on rising (1) or falling (0) edge of the pixel clock signal.
|
||||
Sample data on falling (0), rising (1) or both (2) edges of the pixel
|
||||
clock signal.
|
||||
|
||||
sync-on-green-active:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
@ -1,5 +1,7 @@
|
||||
.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later
|
||||
|
||||
.. _cec_pin_error_inj:
|
||||
|
||||
CEC Pin Framework Error Injection
|
||||
=================================
|
||||
|
||||
|
65
Documentation/userspace-api/media/drivers/aspeed-video.rst
Normal file
65
Documentation/userspace-api/media/drivers/aspeed-video.rst
Normal file
@ -0,0 +1,65 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
.. include:: <isonum.txt>
|
||||
|
||||
ASPEED video driver
|
||||
===================
|
||||
|
||||
ASPEED Video Engine found on AST2400/2500/2600 SoC supports high performance
|
||||
video compressions with a wide range of video quality and compression ratio
|
||||
options. The adopted compressing algorithm is a modified JPEG algorithm.
|
||||
|
||||
There are 2 types of compressions in this IP.
|
||||
|
||||
* JPEG JFIF standard mode: for single frame and management compression
|
||||
* ASPEED proprietary mode: for multi-frame and differential compression.
|
||||
Support 2-pass (high quality) video compression scheme (Patent pending by
|
||||
ASPEED). Provide visually lossless video compression quality or to reduce
|
||||
the network average loading under intranet KVM applications.
|
||||
|
||||
VIDIOC_S_FMT can be used to choose which format you want. V4L2_PIX_FMT_JPEG
|
||||
stands for JPEG JFIF standard mode; V4L2_PIX_FMT_AJPG stands for ASPEED
|
||||
proprietary mode.
|
||||
|
||||
More details on the ASPEED video hardware operations can be found in
|
||||
*chapter 6.2.16 KVM Video Driver* of SDK_User_Guide which available on
|
||||
AspeedTech-BMC/openbmc/releases.
|
||||
|
||||
The ASPEED video driver implements the following driver-specific control:
|
||||
|
||||
``V4L2_CID_ASPEED_HQ_MODE``
|
||||
---------------------------
|
||||
Enable/Disable ASPEED's High quality mode. This is a private control
|
||||
that can be used to enable high quality for aspeed proprietary mode.
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 4
|
||||
|
||||
* - ``(0)``
|
||||
- ASPEED HQ mode is disabled.
|
||||
* - ``(1)``
|
||||
- ASPEED HQ mode is enabled.
|
||||
|
||||
``V4L2_CID_ASPEED_HQ_JPEG_QUALITY``
|
||||
-----------------------------------
|
||||
Define the quality of ASPEED's High quality mode. This is a private control
|
||||
that can be used to decide compression quality if High quality mode enabled
|
||||
. Higher the value, better the quality and bigger the size.
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 4
|
||||
|
||||
* - ``(1)``
|
||||
- minimum
|
||||
* - ``(12)``
|
||||
- maximum
|
||||
* - ``(1)``
|
||||
- step
|
||||
* - ``(1)``
|
||||
- default
|
||||
|
||||
**Copyright** |copy| 2022 ASPEED Technology Inc.
|
@ -31,6 +31,7 @@ For more details see the file COPYING in the source distribution of Linux.
|
||||
:maxdepth: 5
|
||||
:numbered:
|
||||
|
||||
aspeed-video
|
||||
ccs
|
||||
cx2341x-uapi
|
||||
dw100
|
||||
@ -38,4 +39,5 @@ For more details see the file COPYING in the source distribution of Linux.
|
||||
max2175
|
||||
meye-uapi
|
||||
omap3isp-uapi
|
||||
st-vgxy61
|
||||
uvcvideo
|
||||
|
25
Documentation/userspace-api/media/drivers/st-vgxy61.rst
Normal file
25
Documentation/userspace-api/media/drivers/st-vgxy61.rst
Normal file
@ -0,0 +1,25 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
ST VGXY61 camera sensor driver
|
||||
==============================
|
||||
|
||||
The ST VGXY61 driver implements the following controls:
|
||||
|
||||
``V4L2_CID_HDR_SENSOR_MODE``
|
||||
-------------------------------
|
||||
Change the sensor HDR mode. A HDR picture is obtained by merging two
|
||||
captures of the same scene using two different exposure periods.
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 4
|
||||
|
||||
* - HDR linearize
|
||||
- The merger outputs a long exposure capture as long as it is not
|
||||
saturated.
|
||||
* - HDR substraction
|
||||
- This involves subtracting the short exposure frame from the long
|
||||
exposure frame.
|
||||
* - No HDR
|
||||
- This mode is used for standard dynamic range (SDR) exposures.
|
@ -89,16 +89,21 @@ ATSC (version 1) 8-VSB and 16-VSB.
|
||||
DMTB 4-QAM, 16-QAM, 32-QAM, 64-QAM and 4-QAM-NR.
|
||||
DVB-C Annex A/C 16-QAM, 32-QAM, 64-QAM and 256-QAM.
|
||||
DVB-C Annex B 64-QAM.
|
||||
DVB-C2 QPSK, 16-QAM, 64-QAM, 256-QAM, 1024-QAM and 4096-QAM.
|
||||
DVB-T QPSK, 16-QAM and 64-QAM.
|
||||
DVB-T2 QPSK, 16-QAM, 64-QAM and 256-QAM.
|
||||
DVB-S No need to set. It supports only QPSK.
|
||||
DVB-S2 QPSK, 8-PSK, 16-APSK and 32-APSK.
|
||||
DVB-S2X 8-APSK-L, 16-APSK-L, 32-APSK-L, 64-APSK and 64-APSK-L.
|
||||
ISDB-T QPSK, DQPSK, 16-QAM and 64-QAM.
|
||||
ISDB-S 8-PSK, QPSK and BPSK.
|
||||
======================= =======================================================
|
||||
|
||||
.. note::
|
||||
|
||||
As DVB-S2X specifies extensions to the DVB-S2 standard, the same
|
||||
delivery system enum value is used (SYS_DVBS2).
|
||||
|
||||
Please notice that some of the above modulation types may not be
|
||||
defined currently at the Kernel. The reason is simple: no driver
|
||||
needed such definition yet.
|
||||
@ -854,9 +859,10 @@ The acceptable values are defined by :c:type:`fe_guard_interval`.
|
||||
#. If ``DTV_GUARD_INTERVAL`` is set the ``GUARD_INTERVAL_AUTO`` the
|
||||
hardware will try to find the correct guard interval (if capable) and
|
||||
will use TMCC to fill in the missing parameters.
|
||||
#. Intervals ``GUARD_INTERVAL_1_128``, ``GUARD_INTERVAL_19_128``
|
||||
and ``GUARD_INTERVAL_19_256`` are used only for DVB-T2 at
|
||||
present.
|
||||
#. Interval ``GUARD_INTERVAL_1_64`` is used only for DVB-C2.
|
||||
#. Interval ``GUARD_INTERVAL_1_128`` is used for both DVB-C2 and DVB_T2.
|
||||
#. Intervals ``GUARD_INTERVAL_19_128`` and ``GUARD_INTERVAL_19_256`` are
|
||||
used only for DVB-T2.
|
||||
#. Intervals ``GUARD_INTERVAL_PN420``, ``GUARD_INTERVAL_PN595`` and
|
||||
``GUARD_INTERVAL_PN945`` are used only for DMTB at the present.
|
||||
On such standard, only those intervals and ``GUARD_INTERVAL_AUTO``
|
||||
@ -916,14 +922,15 @@ The acceptable values are defined by :c:type:`fe_hierarchy`.
|
||||
DTV_STREAM_ID
|
||||
=============
|
||||
|
||||
Used on DVB-S2, DVB-T2 and ISDB-S.
|
||||
Used on DVB-C2, DVB-S2, DVB-T2 and ISDB-S.
|
||||
|
||||
DVB-S2, DVB-T2 and ISDB-S support the transmission of several streams on
|
||||
a single transport stream. This property enables the digital TV driver to
|
||||
handle substream filtering, when supported by the hardware. By default,
|
||||
substream filtering is disabled.
|
||||
DVB-C2, DVB-S2, DVB-T2 and ISDB-S support the transmission of several
|
||||
streams on a single transport stream. This property enables the digital
|
||||
TV driver to handle substream filtering, when supported by the hardware.
|
||||
By default, substream filtering is disabled.
|
||||
|
||||
For DVB-S2 and DVB-T2, the valid substream id range is from 0 to 255.
|
||||
For DVB-C2, DVB-S2 and DVB-T2, the valid substream id range is from 0 to
|
||||
255.
|
||||
|
||||
For ISDB, the valid substream id range is from 1 to 65535.
|
||||
|
||||
|
@ -86,6 +86,13 @@ ignore symbol APSK_16
|
||||
ignore symbol APSK_32
|
||||
ignore symbol DQPSK
|
||||
ignore symbol QAM_4_NR
|
||||
ignore symbol QAM_1024
|
||||
ignore symbol QAM_4096
|
||||
ignore symbol APSK_8_L
|
||||
ignore symbol APSK_16_L
|
||||
ignore symbol APSK_32_L
|
||||
ignore symbol APSK_64
|
||||
ignore symbol APSK_64_L
|
||||
|
||||
ignore symbol SEC_VOLTAGE_13
|
||||
ignore symbol SEC_VOLTAGE_18
|
||||
@ -119,6 +126,22 @@ ignore symbol FEC_AUTO
|
||||
ignore symbol FEC_3_5
|
||||
ignore symbol FEC_9_10
|
||||
ignore symbol FEC_2_5
|
||||
ignore symbol FEC_1_3
|
||||
ignore symbol FEC_1_4
|
||||
ignore symbol FEC_5_9
|
||||
ignore symbol FEC_7_9
|
||||
ignore symbol FEC_8_15
|
||||
ignore symbol FEC_11_15
|
||||
ignore symbol FEC_13_18
|
||||
ignore symbol FEC_9_20
|
||||
ignore symbol FEC_11_20
|
||||
ignore symbol FEC_23_36
|
||||
ignore symbol FEC_25_36
|
||||
ignore symbol FEC_13_45
|
||||
ignore symbol FEC_26_45
|
||||
ignore symbol FEC_28_45
|
||||
ignore symbol FEC_32_45
|
||||
ignore symbol FEC_77_90
|
||||
|
||||
ignore symbol TRANSMISSION_MODE_AUTO
|
||||
ignore symbol TRANSMISSION_MODE_1K
|
||||
@ -143,6 +166,7 @@ ignore symbol GUARD_INTERVAL_19_256
|
||||
ignore symbol GUARD_INTERVAL_PN420
|
||||
ignore symbol GUARD_INTERVAL_PN595
|
||||
ignore symbol GUARD_INTERVAL_PN945
|
||||
ignore symbol GUARD_INTERVAL_1_64
|
||||
|
||||
ignore symbol HIERARCHY_NONE
|
||||
ignore symbol HIERARCHY_AUTO
|
||||
@ -163,6 +187,9 @@ ignore symbol ROLLOFF_35
|
||||
ignore symbol ROLLOFF_20
|
||||
ignore symbol ROLLOFF_25
|
||||
ignore symbol ROLLOFF_AUTO
|
||||
ignore symbol ROLLOFF_15
|
||||
ignore symbol ROLLOFF_10
|
||||
ignore symbol ROLLOFF_5
|
||||
|
||||
ignore symbol INVERSION_ON
|
||||
ignore symbol INVERSION_OFF
|
||||
@ -187,6 +214,7 @@ ignore symbol SYS_DAB
|
||||
ignore symbol SYS_DSS
|
||||
ignore symbol SYS_CMMB
|
||||
ignore symbol SYS_DVBH
|
||||
ignore symbol SYS_DVBC2
|
||||
|
||||
ignore symbol ATSCMH_SCCC_BLK_SEP
|
||||
ignore symbol ATSCMH_SCCC_BLK_COMB
|
||||
|
@ -187,10 +187,8 @@ struct v4l2_buffer
|
||||
on the negotiated data format and may change with each buffer for
|
||||
compressed variable size data like JPEG images. Drivers must set
|
||||
this field when ``type`` refers to a capture stream, applications
|
||||
when it refers to an output stream. If the application sets this
|
||||
to 0 for an output stream, then ``bytesused`` will be set to the
|
||||
size of the buffer (see the ``length`` field of this struct) by
|
||||
the driver. For multiplanar formats this field is ignored and the
|
||||
when it refers to an output stream. For multiplanar formats this field
|
||||
is ignored and the
|
||||
``planes`` pointer is used instead.
|
||||
* - __u32
|
||||
- ``flags``
|
||||
@ -327,10 +325,7 @@ struct v4l2_plane
|
||||
- ``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
|
||||
application sets this to 0 for an output stream, then
|
||||
``bytesused`` will be set to the size of the plane (see the
|
||||
``length`` field of this struct) by the driver.
|
||||
stream, applications when it refers to an output stream.
|
||||
|
||||
.. note::
|
||||
|
||||
|
@ -661,3 +661,11 @@ enum v4l2_scene_mode -
|
||||
.. [#f1]
|
||||
This control may be changed to a menu control in the future, if more
|
||||
options are required.
|
||||
|
||||
``V4L2_CID_HDR_SENSOR_MODE (menu)``
|
||||
Change the sensor HDR mode. A HDR picture is obtained by merging two
|
||||
captures of the same scene using two different exposure periods. HDR mode
|
||||
describes the way these two captures are merged in the sensor.
|
||||
|
||||
As modes differ for each sensor, menu items are not standardized by this
|
||||
control and are left to the programmer.
|
||||
|
@ -258,6 +258,23 @@ please make a proposal on the linux-media mailing list.
|
||||
and it is used by various multimedia hardware blocks like GPU, display
|
||||
controllers, ISP and video accelerators.
|
||||
It contains four planes for progressive video.
|
||||
* .. _V4L2-PIX-FMT-AJPG:
|
||||
|
||||
- ``V4L2_PIX_FMT_AJPG``
|
||||
- 'AJPG'
|
||||
- ASPEED JPEG format used by the aspeed-video driver on Aspeed platforms,
|
||||
which is generally adapted for remote KVM.
|
||||
On each frame compression, I will compare the new frame with previous
|
||||
one to decide which macroblock's data is changed, and only the changed
|
||||
macroblocks will be compressed.
|
||||
|
||||
The implementation is based on AST2600 A3 datasheet, revision 0.9, which
|
||||
is not publicly available. Or you can reference Video stream data format
|
||||
– ASPEED mode compression of SDK_User_Guide which available on
|
||||
AspeedTech-BMC/openbmc/releases.
|
||||
|
||||
Decoder's implementation can be found here,
|
||||
`aspeed_codec <https://github.com/AspeedTech-BMC/aspeed_codec/>`__
|
||||
.. raw:: latex
|
||||
|
||||
\normalsize
|
||||
|
@ -273,7 +273,9 @@ of the luma plane.
|
||||
.. _V4L2-PIX-FMT-NV12-16L16:
|
||||
.. _V4L2-PIX-FMT-NV12-32L32:
|
||||
.. _V4L2-PIX-FMT-NV12M-8L128:
|
||||
.. _V4L2-PIX-FMT-NV12-8L128:
|
||||
.. _V4L2-PIX-FMT-NV12M-10BE-8L128:
|
||||
.. _V4L2-PIX-FMT-NV12-10BE-8L128:
|
||||
.. _V4L2-PIX-FMT-MM21:
|
||||
|
||||
Tiled NV12
|
||||
@ -319,6 +321,9 @@ pixels in 2D 8x128 tiles, and stores tiles linearly in memory.
|
||||
The image height must be aligned to a multiple of 128.
|
||||
The layouts of the luma and chroma planes are identical.
|
||||
|
||||
``V4L2_PIX_FMT_NV12_8L128`` is similar to ``V4L2_PIX_FMT_NV12M_8L128`` but stores
|
||||
two planes in one memory.
|
||||
|
||||
``V4L2_PIX_FMT_NV12M_10BE_8L128`` is similar to ``V4L2_PIX_FMT_NV12M`` but stores
|
||||
10 bits pixels in 2D 8x128 tiles, and stores tiles linearly in memory.
|
||||
the data is arranged in big endian order.
|
||||
@ -334,6 +339,9 @@ byte 2: Y1(bits 3-0) Y2(bits 9-6)
|
||||
byte 3: Y2(bits 5-0) Y3(bits 9-8)
|
||||
byte 4: Y3(bits 7-0)
|
||||
|
||||
``V4L2_PIX_FMT_NV12_10BE_8L128`` is similar to ``V4L2_PIX_FMT_NV12M_10BE_8L128`` but stores
|
||||
two planes in one memory.
|
||||
|
||||
``V4L2_PIX_FMT_MM21`` store luma pixel in 16x32 tiles, and chroma pixels
|
||||
in 16x16 tiles. The line stride must be aligned to a multiple of 16 and the
|
||||
image height must be aligned to a multiple of 32. The number of luma and chroma
|
||||
|
@ -6057,6 +6057,43 @@ the following codes.
|
||||
- y\ :sub:`2`
|
||||
- y\ :sub:`1`
|
||||
- y\ :sub:`0`
|
||||
* .. _MEDIA-BUS-FMT-Y16-1X16:
|
||||
|
||||
- MEDIA_BUS_FMT_Y16_1X16
|
||||
- 0x202e
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
- y\ :sub:`15`
|
||||
- y\ :sub:`14`
|
||||
- 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
|
||||
|
74
MAINTAINERS
74
MAINTAINERS
@ -775,6 +775,24 @@ T: git git://linuxtv.org/media_tree.git
|
||||
F: Documentation/devicetree/bindings/media/allwinner,sun4i-a10-csi.yaml
|
||||
F: drivers/media/platform/sunxi/sun4i-csi/
|
||||
|
||||
ALLWINNER A31 CSI DRIVER
|
||||
M: Yong Deng <yong.deng@magewell.com>
|
||||
M: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
F: Documentation/devicetree/bindings/media/allwinner,sun6i-a31-csi.yaml
|
||||
F: drivers/media/platform/sunxi/sun6i-csi/
|
||||
|
||||
ALLWINNER A31 ISP DRIVER
|
||||
M: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
F: Documentation/devicetree/bindings/media/allwinner,sun6i-a31-isp.yaml
|
||||
F: drivers/staging/media/sunxi/sun6i-isp/
|
||||
F: drivers/staging/media/sunxi/sun6i-isp/uapi/sun6i-isp-config.h
|
||||
|
||||
ALLWINNER A31 MIPI CSI-2 BRIDGE DRIVER
|
||||
M: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
@ -5521,14 +5539,6 @@ M: Jaya Kumar <jayakumar.alsa@gmail.com>
|
||||
S: Maintained
|
||||
F: sound/pci/cs5535audio/
|
||||
|
||||
CSI DRIVERS FOR ALLWINNER V3s
|
||||
M: Yong Deng <yong.deng@magewell.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
F: Documentation/devicetree/bindings/media/allwinner,sun6i-a31-csi.yaml
|
||||
F: drivers/media/platform/sunxi/sun6i-csi/
|
||||
|
||||
CTU CAN FD DRIVER
|
||||
M: Pavel Pisa <pisa@cmp.felk.cvut.cz>
|
||||
M: Ondrej Ille <ondrej.ille@gmail.com>
|
||||
@ -12776,7 +12786,7 @@ F: Documentation/admin-guide/media/imx7.rst
|
||||
F: Documentation/devicetree/bindings/media/nxp,imx-mipi-csi2.yaml
|
||||
F: Documentation/devicetree/bindings/media/nxp,imx7-csi.yaml
|
||||
F: drivers/media/platform/nxp/imx-mipi-csis.c
|
||||
F: drivers/staging/media/imx/imx7-media-csi.c
|
||||
F: drivers/media/platform/nxp/imx7-media-csi.c
|
||||
|
||||
MEDIA DRIVERS FOR HELENE
|
||||
M: Abylay Ospan <aospan@netup.ru>
|
||||
@ -13516,7 +13526,7 @@ M: Eugen Hristev <eugen.hristev@microchip.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/devicetree/bindings/media/microchip,csi2dc.yaml
|
||||
F: drivers/media/platform/atmel/microchip-csi2dc.c
|
||||
F: drivers/media/platform/microchip/microchip-csi2dc.c
|
||||
|
||||
MICROCHIP ECC DRIVER
|
||||
M: Tudor Ambarus <tudor.ambarus@microchip.com>
|
||||
@ -13543,8 +13553,10 @@ L: linux-media@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/devicetree/bindings/media/atmel,isc.yaml
|
||||
F: Documentation/devicetree/bindings/media/microchip,xisc.yaml
|
||||
F: drivers/media/platform/atmel/atmel-isc*
|
||||
F: drivers/media/platform/atmel/atmel-sama*-isc*
|
||||
F: drivers/staging/media/deprecated/atmel/atmel-isc*
|
||||
F: drivers/staging/media/deprecated/atmel/atmel-sama*-isc*
|
||||
F: drivers/media/platform/microchip/microchip-isc*
|
||||
F: drivers/media/platform/microchip/microchip-sama*-isc*
|
||||
F: include/linux/atmel-isc-media.h
|
||||
|
||||
MICROCHIP ISI DRIVER
|
||||
@ -15236,6 +15248,13 @@ S: Maintained
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
F: drivers/media/i2c/ov08d10.c
|
||||
|
||||
OMNIVISION OV08X40 SENSOR DRIVER
|
||||
M: Jason Chen <jason.z.chen@intel.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
F: drivers/media/i2c/ov08x40.c
|
||||
|
||||
OMNIVISION OV13858 SENSOR DRIVER
|
||||
M: Sakari Ailus <sakari.ailus@linux.intel.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
@ -15274,6 +15293,14 @@ S: Maintained
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
F: drivers/media/i2c/ov2740.c
|
||||
|
||||
OMNIVISION OV4689 SENSOR DRIVER
|
||||
M: Mikhail Rudenko <mike.rudenko@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
F: Documentation/devicetree/bindings/media/i2c/ovti,ov4689.yaml
|
||||
F: drivers/media/i2c/ov5647.c
|
||||
|
||||
OMNIVISION OV5640 SENSOR DRIVER
|
||||
M: Steve Longerbeam <slongerbeam@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
@ -16757,7 +16784,6 @@ M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
F: Documentation/admin-guide/media/pulse8-cec.rst
|
||||
F: drivers/media/cec/usb/pulse8/
|
||||
|
||||
PURELIFI PLFXLC DRIVER
|
||||
@ -17210,7 +17236,8 @@ F: Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
|
||||
F: drivers/thermal/qcom/
|
||||
|
||||
QUALCOMM VENUS VIDEO ACCELERATOR DRIVER
|
||||
M: Stanimir Varbanov <stanimir.varbanov@linaro.org>
|
||||
M: Stanimir Varbanov <stanimir.k.varbanov@gmail.com>
|
||||
M: Vikash Garodia <quic_vgarodia@quicinc.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
L: linux-arm-msm@vger.kernel.org
|
||||
S: Maintained
|
||||
@ -19260,7 +19287,7 @@ M: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
F: Documentation/devicetree/bindings/media/i2c/imx290.txt
|
||||
F: Documentation/devicetree/bindings/media/i2c/sony,imx290.yaml
|
||||
F: drivers/media/i2c/imx290.c
|
||||
|
||||
SONY IMX319 SENSOR DRIVER
|
||||
@ -19580,6 +19607,16 @@ S: Maintained
|
||||
F: Documentation/hwmon/stpddc60.rst
|
||||
F: drivers/hwmon/pmbus/stpddc60.c
|
||||
|
||||
ST VGXY61 DRIVER
|
||||
M: Benjamin Mugnier <benjamin.mugnier@foss.st.com>
|
||||
M: Sylvain Petinot <sylvain.petinot@foss.st.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
F: Documentation/devicetree/bindings/media/i2c/st,st-vgxy61.yaml
|
||||
F: Documentation/userspace-api/media/drivers/st-vgxy61.rst
|
||||
F: drivers/media/i2c/st-vgxy61.c
|
||||
|
||||
ST VL53L0X ToF RANGER(I2C) IIO DRIVER
|
||||
M: Song Qiang <songqiang1304521@gmail.com>
|
||||
L: linux-iio@vger.kernel.org
|
||||
@ -19595,6 +19632,7 @@ S: Supported
|
||||
F: Documentation/process/stable-kernel-rules.rst
|
||||
|
||||
STAGING - ATOMISP DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||
R: Sakari Ailus <sakari.ailus@linux.intel.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
@ -21804,6 +21842,12 @@ F: include/linux/virtio*.h
|
||||
F: include/uapi/linux/virtio_*.h
|
||||
F: tools/virtio/
|
||||
|
||||
VISL VIRTUAL STATELESS DECODER DRIVER
|
||||
M: Daniel Almeida <daniel.almeida@collabora.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/media/test-drivers/visl
|
||||
|
||||
IFCVF VIRTIO DATA PATH ACCELERATOR
|
||||
R: Zhu Lingshan <lingshan.zhu@intel.com>
|
||||
F: drivers/vdpa/ifcvf/
|
||||
|
@ -233,7 +233,6 @@
|
||||
pinctrl-0 = <&pinctrl_ov5645>;
|
||||
reg = <0x3c>;
|
||||
clocks = <&clks IMX6QDL_CLK_CKO2>;
|
||||
clock-names = "xclk";
|
||||
clock-frequency = <24000000>;
|
||||
vdddo-supply = <®_1p8v>;
|
||||
vdda-supply = <®_2p8v>;
|
||||
|
@ -131,7 +131,6 @@
|
||||
pinctrl-0 = <&pinctrl_ov5645>;
|
||||
reg = <0x3c>;
|
||||
clocks = <&clks IMX6QDL_CLK_CKO2>;
|
||||
clock-names = "xclk";
|
||||
clock-frequency = <24000000>;
|
||||
vdddo-supply = <®_1p8v>;
|
||||
vdda-supply = <®_2p8v>;
|
||||
|
@ -65,7 +65,6 @@
|
||||
ov5645: ov5645@3c {
|
||||
compatible = "ovti,ov5645";
|
||||
reg = <0x3c>;
|
||||
clock-names = "xclk";
|
||||
clocks = <&osc25250_clk>;
|
||||
clock-frequency = <24000000>;
|
||||
vdddo-supply = <&ov5645_vdddo_1v8>;
|
||||
|
@ -182,7 +182,7 @@ config MEDIA_CONTROLLER
|
||||
#
|
||||
|
||||
config DVB_CORE
|
||||
tristate
|
||||
tristate "DVB Core"
|
||||
depends on MEDIA_DIGITAL_TV_SUPPORT
|
||||
depends on (I2C || I2C=n)
|
||||
default MEDIA_DIGITAL_TV_SUPPORT
|
||||
|
@ -288,12 +288,9 @@ static int stm32_cec_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
|
||||
cec->clk_cec = devm_clk_get(&pdev->dev, "cec");
|
||||
if (IS_ERR(cec->clk_cec)) {
|
||||
if (PTR_ERR(cec->clk_cec) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Cannot get cec clock\n");
|
||||
|
||||
return PTR_ERR(cec->clk_cec);
|
||||
}
|
||||
if (IS_ERR(cec->clk_cec))
|
||||
return dev_err_probe(&pdev->dev, PTR_ERR(cec->clk_cec),
|
||||
"Cannot get cec clock\n");
|
||||
|
||||
ret = clk_prepare(cec->clk_cec);
|
||||
if (ret) {
|
||||
|
@ -14,6 +14,7 @@
|
||||
* get_vaddr_frames() - map virtual addresses to pfns
|
||||
* @start: starting user address
|
||||
* @nr_frames: number of pages / pfns from start to map
|
||||
* @write: the mapped address has write permission
|
||||
* @vec: structure which receives pages / pfns of the addresses mapped.
|
||||
* It should have space for at least nr_frames entries.
|
||||
*
|
||||
@ -32,10 +33,11 @@
|
||||
*
|
||||
* This function takes care of grabbing mmap_lock as necessary.
|
||||
*/
|
||||
int get_vaddr_frames(unsigned long start, unsigned int nr_frames,
|
||||
int get_vaddr_frames(unsigned long start, unsigned int nr_frames, bool write,
|
||||
struct frame_vector *vec)
|
||||
{
|
||||
int ret;
|
||||
unsigned int gup_flags = FOLL_FORCE | FOLL_LONGTERM;
|
||||
|
||||
if (nr_frames == 0)
|
||||
return 0;
|
||||
@ -45,8 +47,10 @@ int get_vaddr_frames(unsigned long start, unsigned int nr_frames,
|
||||
|
||||
start = untagged_addr(start);
|
||||
|
||||
ret = pin_user_pages_fast(start, nr_frames,
|
||||
FOLL_FORCE | FOLL_WRITE | FOLL_LONGTERM,
|
||||
if (write)
|
||||
gup_flags |= FOLL_WRITE;
|
||||
|
||||
ret = pin_user_pages_fast(start, nr_frames, gup_flags,
|
||||
(struct page **)(vec->ptrs));
|
||||
vec->got_ref = true;
|
||||
vec->is_pfns = false;
|
||||
|
@ -544,6 +544,7 @@ static int __vb2_queue_free(struct vb2_queue *q, unsigned int buffers)
|
||||
*/
|
||||
if (q->num_buffers) {
|
||||
bool unbalanced = q->cnt_start_streaming != q->cnt_stop_streaming ||
|
||||
q->cnt_prepare_streaming != q->cnt_unprepare_streaming ||
|
||||
q->cnt_wait_prepare != q->cnt_wait_finish;
|
||||
|
||||
if (unbalanced || debug) {
|
||||
@ -552,14 +553,18 @@ static int __vb2_queue_free(struct vb2_queue *q, unsigned int buffers)
|
||||
pr_info(" setup: %u start_streaming: %u stop_streaming: %u\n",
|
||||
q->cnt_queue_setup, q->cnt_start_streaming,
|
||||
q->cnt_stop_streaming);
|
||||
pr_info(" prepare_streaming: %u unprepare_streaming: %u\n",
|
||||
q->cnt_prepare_streaming, q->cnt_unprepare_streaming);
|
||||
pr_info(" wait_prepare: %u wait_finish: %u\n",
|
||||
q->cnt_wait_prepare, q->cnt_wait_finish);
|
||||
}
|
||||
q->cnt_queue_setup = 0;
|
||||
q->cnt_wait_prepare = 0;
|
||||
q->cnt_wait_finish = 0;
|
||||
q->cnt_prepare_streaming = 0;
|
||||
q->cnt_start_streaming = 0;
|
||||
q->cnt_stop_streaming = 0;
|
||||
q->cnt_unprepare_streaming = 0;
|
||||
}
|
||||
for (buffer = 0; buffer < q->num_buffers; ++buffer) {
|
||||
struct vb2_buffer *vb = q->bufs[buffer];
|
||||
@ -2026,6 +2031,9 @@ static void __vb2_queue_cancel(struct vb2_queue *q)
|
||||
if (q->start_streaming_called)
|
||||
call_void_qop(q, stop_streaming, q);
|
||||
|
||||
if (q->streaming)
|
||||
call_void_qop(q, unprepare_streaming, q);
|
||||
|
||||
/*
|
||||
* If you see this warning, then the driver isn't cleaning up properly
|
||||
* in stop_streaming(). See the stop_streaming() documentation in
|
||||
@ -2137,23 +2145,29 @@ int vb2_core_streamon(struct vb2_queue *q, unsigned int type)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = call_qop(q, prepare_streaming, q);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
q->streaming = 1;
|
||||
|
||||
/*
|
||||
* Tell driver to start streaming provided sufficient buffers
|
||||
* are available.
|
||||
*/
|
||||
if (q->queued_count >= q->min_buffers_needed) {
|
||||
ret = v4l_vb2q_enable_media_source(q);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = vb2_start_streaming(q);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto unprepare;
|
||||
}
|
||||
|
||||
q->streaming = 1;
|
||||
|
||||
dprintk(q, 3, "successful\n");
|
||||
return 0;
|
||||
|
||||
unprepare:
|
||||
call_void_qop(q, unprepare_streaming, q);
|
||||
q->streaming = 0;
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vb2_core_streamon);
|
||||
|
||||
|
@ -603,7 +603,8 @@ static void *vb2_dc_get_userptr(struct vb2_buffer *vb, struct device *dev,
|
||||
buf->vb = vb;
|
||||
|
||||
offset = lower_32_bits(offset_in_page(vaddr));
|
||||
vec = vb2_create_framevec(vaddr, size);
|
||||
vec = vb2_create_framevec(vaddr, size, buf->dma_dir == DMA_FROM_DEVICE ||
|
||||
buf->dma_dir == DMA_BIDIRECTIONAL);
|
||||
if (IS_ERR(vec)) {
|
||||
ret = PTR_ERR(vec);
|
||||
goto fail_buf;
|
||||
|
@ -241,7 +241,9 @@ static void *vb2_dma_sg_get_userptr(struct vb2_buffer *vb, struct device *dev,
|
||||
buf->size = size;
|
||||
buf->dma_sgt = &buf->sg_table;
|
||||
buf->vb = vb;
|
||||
vec = vb2_create_framevec(vaddr, size);
|
||||
vec = vb2_create_framevec(vaddr, size,
|
||||
buf->dma_dir == DMA_FROM_DEVICE ||
|
||||
buf->dma_dir == DMA_BIDIRECTIONAL);
|
||||
if (IS_ERR(vec))
|
||||
goto userptr_fail_pfnvec;
|
||||
buf->vec = vec;
|
||||
|
@ -26,6 +26,7 @@
|
||||
* vb2_create_framevec() - map virtual addresses to pfns
|
||||
* @start: Virtual user address where we start mapping
|
||||
* @length: Length of a range to map
|
||||
* @write: Should we map for writing into the area
|
||||
*
|
||||
* This function allocates and fills in a vector with pfns corresponding to
|
||||
* virtual address range passed in arguments. If pfns have corresponding pages,
|
||||
@ -34,7 +35,8 @@
|
||||
* failure. Returned vector needs to be freed via vb2_destroy_pfnvec().
|
||||
*/
|
||||
struct frame_vector *vb2_create_framevec(unsigned long start,
|
||||
unsigned long length)
|
||||
unsigned long length,
|
||||
bool write)
|
||||
{
|
||||
int ret;
|
||||
unsigned long first, last;
|
||||
@ -47,7 +49,7 @@ struct frame_vector *vb2_create_framevec(unsigned long start,
|
||||
vec = frame_vector_create(nr);
|
||||
if (!vec)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
ret = get_vaddr_frames(start & PAGE_MASK, nr, vec);
|
||||
ret = get_vaddr_frames(start & PAGE_MASK, nr, write, vec);
|
||||
if (ret < 0)
|
||||
goto out_destroy;
|
||||
/* We accept only complete set of PFNs */
|
||||
|
@ -85,7 +85,9 @@ static void *vb2_vmalloc_get_userptr(struct vb2_buffer *vb, struct device *dev,
|
||||
buf->dma_dir = vb->vb2_queue->dma_dir;
|
||||
offset = vaddr & ~PAGE_MASK;
|
||||
buf->size = size;
|
||||
vec = vb2_create_framevec(vaddr, size);
|
||||
vec = vb2_create_framevec(vaddr, size,
|
||||
buf->dma_dir == DMA_FROM_DEVICE ||
|
||||
buf->dma_dir == DMA_BIDIRECTIONAL);
|
||||
if (IS_ERR(vec)) {
|
||||
ret = PTR_ERR(vec);
|
||||
goto fail_pfnvec_create;
|
||||
|
@ -790,6 +790,11 @@ static int dvb_demux_open(struct inode *inode, struct file *file)
|
||||
if (mutex_lock_interruptible(&dmxdev->mutex))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
if (dmxdev->exit) {
|
||||
mutex_unlock(&dmxdev->mutex);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
for (i = 0; i < dmxdev->filternum; i++)
|
||||
if (dmxdev->filter[i].state == DMXDEV_STATE_FREE)
|
||||
break;
|
||||
@ -1448,7 +1453,10 @@ EXPORT_SYMBOL(dvb_dmxdev_init);
|
||||
|
||||
void dvb_dmxdev_release(struct dmxdev *dmxdev)
|
||||
{
|
||||
mutex_lock(&dmxdev->mutex);
|
||||
dmxdev->exit = 1;
|
||||
mutex_unlock(&dmxdev->mutex);
|
||||
|
||||
if (dmxdev->dvbdev->users > 1) {
|
||||
wait_event(dmxdev->dvbdev->wait_queue,
|
||||
dmxdev->dvbdev->users == 1);
|
||||
|
@ -157,7 +157,7 @@ static void dvb_ca_private_free(struct dvb_ca_private *ca)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
dvb_free_device(ca->dvbdev);
|
||||
dvb_device_put(ca->dvbdev);
|
||||
for (i = 0; i < ca->slot_count; i++)
|
||||
vfree(ca->slot_info[i].rx_buffer.data);
|
||||
|
||||
|
@ -233,7 +233,7 @@ static int dvb_dmx_swfilter_section_copy_dump(struct dvb_demux_feed *feed,
|
||||
{
|
||||
struct dvb_demux *demux = feed->demux;
|
||||
struct dmx_section_feed *sec = &feed->feed.sec;
|
||||
u16 limit, seclen, n;
|
||||
u16 limit, seclen;
|
||||
|
||||
if (sec->tsfeedp >= DMX_MAX_SECFEED_SIZE)
|
||||
return 0;
|
||||
@ -262,7 +262,7 @@ static int dvb_dmx_swfilter_section_copy_dump(struct dvb_demux_feed *feed,
|
||||
/* to be sure always set secbuf */
|
||||
sec->secbuf = sec->secbuf_base + sec->secbufp;
|
||||
|
||||
for (n = 0; sec->secbufp + 2 < limit; n++) {
|
||||
while (sec->secbufp + 2 < limit) {
|
||||
seclen = section_length(sec->secbuf);
|
||||
if (seclen <= 0 || seclen > DMX_MAX_SECTION_SIZE
|
||||
|| seclen + sec->secbufp > limit)
|
||||
|
@ -136,7 +136,7 @@ static void __dvb_frontend_free(struct dvb_frontend *fe)
|
||||
struct dvb_frontend_private *fepriv = fe->frontend_priv;
|
||||
|
||||
if (fepriv)
|
||||
dvb_free_device(fepriv->dvbdev);
|
||||
dvb_device_put(fepriv->dvbdev);
|
||||
|
||||
dvb_frontend_invoke_release(fe, fe->ops.release);
|
||||
|
||||
@ -918,6 +918,7 @@ static void dvb_frontend_get_frequency_limits(struct dvb_frontend *fe,
|
||||
|
||||
/* If the standard is for satellite, convert frequencies to kHz */
|
||||
switch (c->delivery_system) {
|
||||
case SYS_DSS:
|
||||
case SYS_DVBS:
|
||||
case SYS_DVBS2:
|
||||
case SYS_TURBO:
|
||||
@ -943,6 +944,7 @@ static u32 dvb_frontend_get_stepsize(struct dvb_frontend *fe)
|
||||
u32 step = max(fe_step, tuner_step);
|
||||
|
||||
switch (c->delivery_system) {
|
||||
case SYS_DSS:
|
||||
case SYS_DVBS:
|
||||
case SYS_DVBS2:
|
||||
case SYS_TURBO:
|
||||
@ -974,6 +976,7 @@ static int dvb_frontend_check_parameters(struct dvb_frontend *fe)
|
||||
|
||||
/* range check: symbol rate */
|
||||
switch (c->delivery_system) {
|
||||
case SYS_DSS:
|
||||
case SYS_DVBS:
|
||||
case SYS_DVBS2:
|
||||
case SYS_TURBO:
|
||||
@ -1040,6 +1043,10 @@ static int dvb_frontend_clear_cache(struct dvb_frontend *fe)
|
||||
c->scrambling_sequence_index = 0;/* default sequence */
|
||||
|
||||
switch (c->delivery_system) {
|
||||
case SYS_DSS:
|
||||
c->modulation = QPSK;
|
||||
c->rolloff = ROLLOFF_20;
|
||||
break;
|
||||
case SYS_DVBS:
|
||||
case SYS_DVBS2:
|
||||
case SYS_TURBO:
|
||||
@ -1821,6 +1828,7 @@ static void prepare_tuning_algo_parameters(struct dvb_frontend *fe)
|
||||
} else {
|
||||
/* default values */
|
||||
switch (c->delivery_system) {
|
||||
case SYS_DSS:
|
||||
case SYS_DVBS:
|
||||
case SYS_DVBS2:
|
||||
case SYS_ISDBS:
|
||||
@ -2288,6 +2296,9 @@ static int dtv_set_frontend(struct dvb_frontend *fe)
|
||||
case SYS_DVBC_ANNEX_C:
|
||||
rolloff = 113;
|
||||
break;
|
||||
case SYS_DSS:
|
||||
rolloff = 120;
|
||||
break;
|
||||
case SYS_DVBS:
|
||||
case SYS_TURBO:
|
||||
case SYS_ISDBS:
|
||||
@ -2754,7 +2765,17 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
|
||||
if (fe->exit == DVB_FE_DEVICE_REMOVED)
|
||||
return -ENODEV;
|
||||
|
||||
if (adapter->mfe_shared) {
|
||||
if (adapter->mfe_shared == 2) {
|
||||
mutex_lock(&adapter->mfe_lock);
|
||||
if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
|
||||
if (adapter->mfe_dvbdev &&
|
||||
!adapter->mfe_dvbdev->writers) {
|
||||
mutex_unlock(&adapter->mfe_lock);
|
||||
return -EBUSY;
|
||||
}
|
||||
adapter->mfe_dvbdev = dvbdev;
|
||||
}
|
||||
} else if (adapter->mfe_shared) {
|
||||
mutex_lock(&adapter->mfe_lock);
|
||||
|
||||
if (!adapter->mfe_dvbdev)
|
||||
@ -2986,6 +3007,7 @@ int dvb_register_frontend(struct dvb_adapter *dvb,
|
||||
.name = fe->ops.info.name,
|
||||
#endif
|
||||
};
|
||||
int ret;
|
||||
|
||||
dev_dbg(dvb->device, "%s:\n", __func__);
|
||||
|
||||
@ -3019,8 +3041,13 @@ int dvb_register_frontend(struct dvb_adapter *dvb,
|
||||
"DVB: registering adapter %i frontend %i (%s)...\n",
|
||||
fe->dvb->num, fe->id, fe->ops.info.name);
|
||||
|
||||
dvb_register_device(fe->dvb, &fepriv->dvbdev, &dvbdev_template,
|
||||
ret = dvb_register_device(fe->dvb, &fepriv->dvbdev, &dvbdev_template,
|
||||
fe, DVB_DEVICE_FRONTEND, 0);
|
||||
if (ret) {
|
||||
dvb_frontend_put(fe);
|
||||
mutex_unlock(&frontend_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the cache to the proper values according with the
|
||||
|
@ -335,7 +335,9 @@ ssize_t dvb_ringbuffer_pkt_next(struct dvb_ringbuffer *rbuf, size_t idx, size_t*
|
||||
idx = (idx + curpktlen + DVB_RINGBUFFER_PKTHDRSIZE) % rbuf->size;
|
||||
}
|
||||
|
||||
consumed = (idx - rbuf->pread) % rbuf->size;
|
||||
consumed = (idx - rbuf->pread);
|
||||
if (consumed < 0)
|
||||
consumed += rbuf->size;
|
||||
|
||||
while((dvb_ringbuffer_avail(rbuf) - consumed) > DVB_RINGBUFFER_PKTHDRSIZE) {
|
||||
|
||||
|
@ -97,7 +97,7 @@ static int dvb_device_open(struct inode *inode, struct file *file)
|
||||
new_fops = fops_get(dvbdev->fops);
|
||||
if (!new_fops)
|
||||
goto fail;
|
||||
file->private_data = dvbdev;
|
||||
file->private_data = dvb_device_get(dvbdev);
|
||||
replace_fops(file, new_fops);
|
||||
if (file->f_op->open)
|
||||
err = file->f_op->open(inode, file);
|
||||
@ -161,6 +161,9 @@ int dvb_generic_release(struct inode *inode, struct file *file)
|
||||
}
|
||||
|
||||
dvbdev->users++;
|
||||
|
||||
dvb_device_put(dvbdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_generic_release);
|
||||
@ -243,7 +246,7 @@ static void dvb_media_device_free(struct dvb_device *dvbdev)
|
||||
static int dvb_create_tsout_entity(struct dvb_device *dvbdev,
|
||||
const char *name, int npads)
|
||||
{
|
||||
int i, ret = 0;
|
||||
int i;
|
||||
|
||||
dvbdev->tsout_pads = kcalloc(npads, sizeof(*dvbdev->tsout_pads),
|
||||
GFP_KERNEL);
|
||||
@ -260,6 +263,7 @@ static int dvb_create_tsout_entity(struct dvb_device *dvbdev,
|
||||
for (i = 0; i < npads; i++) {
|
||||
struct media_pad *pads = &dvbdev->tsout_pads[i];
|
||||
struct media_entity *entity = &dvbdev->tsout_entity[i];
|
||||
int ret;
|
||||
|
||||
entity->name = kasprintf(GFP_KERNEL, "%s #%d", name, i);
|
||||
if (!entity->name)
|
||||
@ -332,6 +336,7 @@ static int dvb_create_media_entity(struct dvb_device *dvbdev,
|
||||
GFP_KERNEL);
|
||||
if (!dvbdev->pads) {
|
||||
kfree(dvbdev->entity);
|
||||
dvbdev->entity = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
@ -478,6 +483,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
}
|
||||
|
||||
memcpy(dvbdev, template, sizeof(struct dvb_device));
|
||||
kref_init(&dvbdev->ref);
|
||||
dvbdev->type = type;
|
||||
dvbdev->id = id;
|
||||
dvbdev->adapter = adap;
|
||||
@ -508,7 +514,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
#endif
|
||||
|
||||
dvbdev->minor = minor;
|
||||
dvb_minors[minor] = dvbdev;
|
||||
dvb_minors[minor] = dvb_device_get(dvbdev);
|
||||
up_write(&minor_rwsem);
|
||||
|
||||
ret = dvb_register_media_device(dvbdev, type, minor, demux_sink_pads);
|
||||
@ -553,6 +559,7 @@ void dvb_remove_device(struct dvb_device *dvbdev)
|
||||
|
||||
down_write(&minor_rwsem);
|
||||
dvb_minors[dvbdev->minor] = NULL;
|
||||
dvb_device_put(dvbdev);
|
||||
up_write(&minor_rwsem);
|
||||
|
||||
dvb_media_device_free(dvbdev);
|
||||
@ -564,21 +571,34 @@ void dvb_remove_device(struct dvb_device *dvbdev)
|
||||
EXPORT_SYMBOL(dvb_remove_device);
|
||||
|
||||
|
||||
void dvb_free_device(struct dvb_device *dvbdev)
|
||||
static void dvb_free_device(struct kref *ref)
|
||||
{
|
||||
if (!dvbdev)
|
||||
return;
|
||||
struct dvb_device *dvbdev = container_of(ref, struct dvb_device, ref);
|
||||
|
||||
kfree (dvbdev->fops);
|
||||
kfree (dvbdev);
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_free_device);
|
||||
|
||||
|
||||
struct dvb_device *dvb_device_get(struct dvb_device *dvbdev)
|
||||
{
|
||||
kref_get(&dvbdev->ref);
|
||||
return 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);
|
||||
dvb_free_device(dvbdev);
|
||||
dvb_device_put(dvbdev);
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_unregister_device);
|
||||
|
||||
|
@ -7,20 +7,148 @@
|
||||
|
||||
#include "a8293.h"
|
||||
|
||||
#define A8293_FLAG_ODT 0x10
|
||||
|
||||
struct a8293_dev {
|
||||
struct i2c_client *client;
|
||||
u8 reg[2];
|
||||
int volt_slew_nanos_per_mv;
|
||||
};
|
||||
|
||||
static int a8293_set_voltage(struct dvb_frontend *fe,
|
||||
enum fe_sec_voltage fe_sec_voltage)
|
||||
/*
|
||||
* When increasing voltage, do so in minimal steps over time, minimizing
|
||||
* risk of vIN undervoltage.
|
||||
*/
|
||||
|
||||
static int a8293_set_voltage_slew(struct a8293_dev *dev,
|
||||
struct i2c_client *client,
|
||||
enum fe_sec_voltage fe_sec_voltage,
|
||||
int min_nanos_per_mv)
|
||||
{
|
||||
int ret;
|
||||
u8 reg0, reg1;
|
||||
int new_volt_idx;
|
||||
const int idx_to_mv[] = {
|
||||
0, 12709, 13042, 13375, 14042, 15042, 18042, 18709, 19042
|
||||
};
|
||||
const u8 idx_to_reg[] = {
|
||||
0x00, 0x20, 0x21, 0x22, 0x24, 0x27, 0x28, 0x2A, 0x2B
|
||||
};
|
||||
int this_volt_idx;
|
||||
u8 status;
|
||||
int prev_volt_idx;
|
||||
|
||||
dev_dbg(&client->dev, "set_voltage_slew fe_sec_voltage=%d\n",
|
||||
fe_sec_voltage);
|
||||
|
||||
/* Read status register to clear any stale faults. */
|
||||
ret = i2c_master_recv(client, &status, 1);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
/* Determine previous voltage */
|
||||
switch (dev->reg[0] & 0x2F) {
|
||||
case 0x00:
|
||||
prev_volt_idx = 0;
|
||||
break;
|
||||
case 0x20:
|
||||
prev_volt_idx = 1;
|
||||
break;
|
||||
case 0x21:
|
||||
prev_volt_idx = 2;
|
||||
break;
|
||||
case 0x22:
|
||||
prev_volt_idx = 3;
|
||||
break;
|
||||
case 0x24:
|
||||
prev_volt_idx = 4;
|
||||
break;
|
||||
case 0x27:
|
||||
prev_volt_idx = 5;
|
||||
break;
|
||||
case 0x28:
|
||||
prev_volt_idx = 6;
|
||||
break;
|
||||
case 0x2A:
|
||||
prev_volt_idx = 7;
|
||||
break;
|
||||
case 0x2B:
|
||||
prev_volt_idx = 8;
|
||||
break;
|
||||
default:
|
||||
prev_volt_idx = 0;
|
||||
}
|
||||
|
||||
/* Determine new voltage */
|
||||
switch (fe_sec_voltage) {
|
||||
case SEC_VOLTAGE_OFF:
|
||||
new_volt_idx = 0;
|
||||
break;
|
||||
case SEC_VOLTAGE_13:
|
||||
new_volt_idx = 2;
|
||||
break;
|
||||
case SEC_VOLTAGE_18:
|
||||
new_volt_idx = 6;
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* Slew to new voltage if new voltage is greater than current voltage */
|
||||
this_volt_idx = prev_volt_idx;
|
||||
if (this_volt_idx < new_volt_idx) {
|
||||
while (this_volt_idx < new_volt_idx) {
|
||||
int delta_mv = idx_to_mv[this_volt_idx+1] - idx_to_mv[this_volt_idx];
|
||||
int min_wait_time = delta_mv * min_nanos_per_mv;
|
||||
|
||||
reg0 = idx_to_reg[this_volt_idx+1];
|
||||
reg0 |= A8293_FLAG_ODT;
|
||||
|
||||
ret = i2c_master_send(client, ®0, 1);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
dev->reg[0] = reg0;
|
||||
this_volt_idx++;
|
||||
usleep_range(min_wait_time, min_wait_time * 2);
|
||||
}
|
||||
} else { /* Else just set the voltage */
|
||||
reg0 = idx_to_reg[new_volt_idx];
|
||||
reg0 |= A8293_FLAG_ODT;
|
||||
ret = i2c_master_send(client, ®0, 1);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
dev->reg[0] = reg0;
|
||||
}
|
||||
|
||||
/* TMODE=0, TGATE=1 */
|
||||
reg1 = 0x82;
|
||||
if (reg1 != dev->reg[1]) {
|
||||
ret = i2c_master_send(client, ®1, 1);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
dev->reg[1] = reg1;
|
||||
}
|
||||
|
||||
usleep_range(1500, 5000);
|
||||
|
||||
return 0;
|
||||
err:
|
||||
dev_dbg(&client->dev, "failed=%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int a8293_set_voltage_noslew(struct dvb_frontend *fe,
|
||||
enum fe_sec_voltage fe_sec_voltage)
|
||||
{
|
||||
struct a8293_dev *dev = fe->sec_priv;
|
||||
struct i2c_client *client = dev->client;
|
||||
int ret;
|
||||
u8 reg0, reg1;
|
||||
|
||||
dev_dbg(&client->dev, "fe_sec_voltage=%d\n", fe_sec_voltage);
|
||||
dev_dbg(&client->dev, "set_voltage_noslew fe_sec_voltage=%d\n",
|
||||
fe_sec_voltage);
|
||||
|
||||
switch (fe_sec_voltage) {
|
||||
case SEC_VOLTAGE_OFF:
|
||||
@ -62,8 +190,27 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int a8293_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int a8293_set_voltage(struct dvb_frontend *fe,
|
||||
enum fe_sec_voltage fe_sec_voltage)
|
||||
{
|
||||
struct a8293_dev *dev = fe->sec_priv;
|
||||
struct i2c_client *client = dev->client;
|
||||
int volt_slew_nanos_per_mv = dev->volt_slew_nanos_per_mv;
|
||||
|
||||
dev_dbg(&client->dev, "set_voltage volt_slew_nanos_per_mv=%d\n",
|
||||
volt_slew_nanos_per_mv);
|
||||
|
||||
/* Use slew version if slew rate is set to a sane value */
|
||||
if (volt_slew_nanos_per_mv > 0 && volt_slew_nanos_per_mv < 1600)
|
||||
a8293_set_voltage_slew(dev, client, fe_sec_voltage,
|
||||
volt_slew_nanos_per_mv);
|
||||
else
|
||||
a8293_set_voltage_noslew(fe, fe_sec_voltage);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int a8293_probe(struct i2c_client *client)
|
||||
{
|
||||
struct a8293_dev *dev;
|
||||
struct a8293_platform_data *pdata = client->dev.platform_data;
|
||||
@ -78,6 +225,7 @@ static int a8293_probe(struct i2c_client *client,
|
||||
}
|
||||
|
||||
dev->client = client;
|
||||
dev->volt_slew_nanos_per_mv = pdata->volt_slew_nanos_per_mv;
|
||||
|
||||
/* check if the SEC is there */
|
||||
ret = i2c_master_recv(client, buf, 2);
|
||||
@ -118,7 +266,7 @@ static struct i2c_driver a8293_driver = {
|
||||
.name = "a8293",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe = a8293_probe,
|
||||
.probe_new = a8293_probe,
|
||||
.remove = a8293_remove,
|
||||
.id_table = a8293_id_table,
|
||||
};
|
||||
|
@ -18,9 +18,12 @@
|
||||
/**
|
||||
* struct a8293_platform_data - Platform data for the a8293 driver
|
||||
* @dvb_frontend: DVB frontend.
|
||||
* @volt_slew_nanos_per_mv: Slew rate when increasing LNB voltage,
|
||||
* in nanoseconds per millivolt.
|
||||
*/
|
||||
struct a8293_platform_data {
|
||||
struct dvb_frontend *dvb_frontend;
|
||||
int volt_slew_nanos_per_mv;
|
||||
};
|
||||
|
||||
#endif /* A8293_H */
|
||||
|
@ -1430,8 +1430,7 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int af9013_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int af9013_probe(struct i2c_client *client)
|
||||
{
|
||||
struct af9013_state *state;
|
||||
struct af9013_platform_data *pdata = client->dev.platform_data;
|
||||
@ -1564,7 +1563,7 @@ static struct i2c_driver af9013_driver = {
|
||||
.name = "af9013",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe = af9013_probe,
|
||||
.probe_new = af9013_probe,
|
||||
.remove = af9013_remove,
|
||||
.id_table = af9013_id_table,
|
||||
};
|
||||
|
@ -1049,8 +1049,7 @@ static const struct dvb_frontend_ops af9033_ops = {
|
||||
.i2c_gate_ctrl = af9033_i2c_gate_ctrl,
|
||||
};
|
||||
|
||||
static int af9033_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int af9033_probe(struct i2c_client *client)
|
||||
{
|
||||
struct af9033_config *cfg = client->dev.platform_data;
|
||||
struct af9033_dev *dev;
|
||||
@ -1184,7 +1183,7 @@ static struct i2c_driver af9033_driver = {
|
||||
.name = "af9033",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe = af9033_probe,
|
||||
.probe_new = af9033_probe,
|
||||
.remove = af9033_remove,
|
||||
.id_table = af9033_id_table,
|
||||
};
|
||||
|
@ -669,8 +669,7 @@ static const struct v4l2_ctrl_ops au8522_ctrl_ops = {
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
static int au8522_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *did)
|
||||
static int au8522_probe(struct i2c_client *client)
|
||||
{
|
||||
struct au8522_state *state;
|
||||
struct v4l2_ctrl_handler *hdl;
|
||||
@ -777,7 +776,7 @@ static struct i2c_driver au8522_driver = {
|
||||
.driver = {
|
||||
.name = "au8522",
|
||||
},
|
||||
.probe = au8522_probe,
|
||||
.probe_new = au8522_probe,
|
||||
.remove = au8522_remove,
|
||||
.id_table = au8522_id,
|
||||
};
|
||||
|
@ -649,6 +649,7 @@ static int bcm3510_download_firmware(struct dvb_frontend* fe)
|
||||
deb_info("firmware chunk, addr: 0x%04x, len: 0x%04x, total length: 0x%04zx\n",addr,len,fw->size);
|
||||
if ((ret = bcm3510_write_ram(st,addr,&b[i+4],len)) < 0) {
|
||||
err("firmware download failed: %d\n",ret);
|
||||
release_firmware(fw);
|
||||
return ret;
|
||||
}
|
||||
i += 4 + len;
|
||||
|
@ -598,8 +598,7 @@ static const struct dvb_ca_en50221 en_templ = {
|
||||
.write_data = write_data,
|
||||
};
|
||||
|
||||
static int cxd2099_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int cxd2099_probe(struct i2c_client *client)
|
||||
{
|
||||
struct cxd *ci;
|
||||
struct cxd2099_cfg *cfg = client->dev.platform_data;
|
||||
@ -682,7 +681,7 @@ static struct i2c_driver cxd2099_driver = {
|
||||
.driver = {
|
||||
.name = "cxd2099",
|
||||
},
|
||||
.probe = cxd2099_probe,
|
||||
.probe_new = cxd2099_probe,
|
||||
.remove = cxd2099_remove,
|
||||
.id_table = cxd2099_id,
|
||||
};
|
||||
|
@ -547,8 +547,7 @@ static struct dvb_frontend *cxd2820r_get_dvb_frontend(struct i2c_client *client)
|
||||
return &priv->fe;
|
||||
}
|
||||
|
||||
static int cxd2820r_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int cxd2820r_probe(struct i2c_client *client)
|
||||
{
|
||||
struct cxd2820r_platform_data *pdata = client->dev.platform_data;
|
||||
struct cxd2820r_priv *priv;
|
||||
@ -629,7 +628,7 @@ static int cxd2820r_probe(struct i2c_client *client,
|
||||
|
||||
/*
|
||||
* Chip has two I2C addresses for different register banks. We register
|
||||
* one dummy I2C client in in order to get own I2C client for each
|
||||
* one dummy I2C client in order to get own I2C client for each
|
||||
* register bank.
|
||||
*/
|
||||
priv->client[1] = i2c_new_dummy_device(client->adapter, client->addr | (1 << 1));
|
||||
@ -734,7 +733,7 @@ static struct i2c_driver cxd2820r_driver = {
|
||||
.name = "cxd2820r",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe = cxd2820r_probe,
|
||||
.probe_new = cxd2820r_probe,
|
||||
.remove = cxd2820r_remove,
|
||||
.id_table = cxd2820r_id_table,
|
||||
};
|
||||
|
@ -52,8 +52,6 @@ struct cxd2820r_priv {
|
||||
|
||||
/* cxd2820r_core.c */
|
||||
|
||||
extern int cxd2820r_debug;
|
||||
|
||||
int cxd2820r_gpio(struct dvb_frontend *fe, u8 *gpio);
|
||||
|
||||
int cxd2820r_wr_reg_val_mask_tab(struct cxd2820r_priv *priv,
|
||||
|
@ -234,8 +234,6 @@
|
||||
|
||||
/*-------- Public API functions ----------------------------------------------*/
|
||||
|
||||
extern struct drx_access_func drx_dap_fasi_funct_g;
|
||||
|
||||
#define DRXDAP_FASI_RMW 0x10000000
|
||||
#define DRXDAP_FASI_BROADCAST 0x20000000
|
||||
#define DRXDAP_FASI_CLEARCRC 0x80000000
|
||||
|
@ -2347,6 +2347,7 @@ hi_command(struct i2c_device_addr *dev_addr, const struct drxj_hi_cmd *cmd, u16
|
||||
do {
|
||||
nr_retries++;
|
||||
if (nr_retries > DRXJ_MAX_RETRIES) {
|
||||
rc = -ETIMEDOUT;
|
||||
pr_err("timeout\n");
|
||||
goto rw_error;
|
||||
}
|
||||
|
@ -1063,8 +1063,7 @@ struct dvb_frontend *helene_attach(struct dvb_frontend *fe,
|
||||
}
|
||||
EXPORT_SYMBOL(helene_attach);
|
||||
|
||||
static int helene_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int helene_probe(struct i2c_client *client)
|
||||
{
|
||||
struct helene_config *config = client->dev.platform_data;
|
||||
struct dvb_frontend *fe = config->fe;
|
||||
@ -1111,7 +1110,7 @@ static struct i2c_driver helene_driver = {
|
||||
.driver = {
|
||||
.name = "helene",
|
||||
},
|
||||
.probe = helene_probe,
|
||||
.probe_new = helene_probe,
|
||||
.id_table = helene_id,
|
||||
};
|
||||
module_i2c_driver(helene_driver);
|
||||
|
@ -2169,8 +2169,7 @@ static int lgdt3306a_deselect(struct i2c_mux_core *muxc, u32 chan)
|
||||
return lgdt3306a_i2c_gate_ctrl(&state->frontend, 0);
|
||||
}
|
||||
|
||||
static int lgdt3306a_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int lgdt3306a_probe(struct i2c_client *client)
|
||||
{
|
||||
struct lgdt3306a_config *config;
|
||||
struct lgdt3306a_state *state;
|
||||
@ -2250,7 +2249,7 @@ static struct i2c_driver lgdt3306a_driver = {
|
||||
.name = "lgdt3306a",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe = lgdt3306a_probe,
|
||||
.probe_new = lgdt3306a_probe,
|
||||
.remove = lgdt3306a_remove,
|
||||
.id_table = lgdt3306a_id_table,
|
||||
};
|
||||
|
@ -857,8 +857,7 @@ static struct dvb_frontend *lgdt330x_get_dvb_frontend(struct i2c_client *client)
|
||||
static const struct dvb_frontend_ops lgdt3302_ops;
|
||||
static const struct dvb_frontend_ops lgdt3303_ops;
|
||||
|
||||
static int lgdt330x_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int lgdt330x_probe(struct i2c_client *client)
|
||||
{
|
||||
struct lgdt330x_state *state = NULL;
|
||||
u8 buf[1];
|
||||
@ -994,7 +993,7 @@ static struct i2c_driver lgdt330x_driver = {
|
||||
.name = "lgdt330x",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe = lgdt330x_probe,
|
||||
.probe_new = lgdt330x_probe,
|
||||
.remove = lgdt330x_remove,
|
||||
.id_table = lgdt330x_id_table,
|
||||
};
|
||||
|
@ -572,8 +572,7 @@ static struct dvb_frontend *mn88472_get_dvb_frontend(struct i2c_client *client)
|
||||
return &dev->fe;
|
||||
}
|
||||
|
||||
static int mn88472_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int mn88472_probe(struct i2c_client *client)
|
||||
{
|
||||
struct mn88472_config *pdata = client->dev.platform_data;
|
||||
struct mn88472_dev *dev;
|
||||
@ -719,7 +718,7 @@ static struct i2c_driver mn88472_driver = {
|
||||
.name = "mn88472",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe = mn88472_probe,
|
||||
.probe_new = mn88472_probe,
|
||||
.remove = mn88472_remove,
|
||||
.id_table = mn88472_id_table,
|
||||
};
|
||||
|
@ -606,8 +606,7 @@ static const struct dvb_frontend_ops mn88473_ops = {
|
||||
.read_status = mn88473_read_status,
|
||||
};
|
||||
|
||||
static int mn88473_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int mn88473_probe(struct i2c_client *client)
|
||||
{
|
||||
struct mn88473_config *config = client->dev.platform_data;
|
||||
struct mn88473_dev *dev;
|
||||
@ -754,7 +753,7 @@ static struct i2c_driver mn88473_driver = {
|
||||
.name = "mn88473",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe = mn88473_probe,
|
||||
.probe_new = mn88473_probe,
|
||||
.remove = mn88473_remove,
|
||||
.id_table = mn88473_id_table,
|
||||
};
|
||||
|
@ -1644,8 +1644,6 @@ static int validate_sku(struct mxl *state)
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
@ -1308,8 +1308,7 @@ static const struct dvb_frontend_ops mxl692_ops = {
|
||||
.read_snr = mxl692_read_snr,
|
||||
};
|
||||
|
||||
static int mxl692_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int mxl692_probe(struct i2c_client *client)
|
||||
{
|
||||
struct mxl692_config *config = client->dev.platform_data;
|
||||
struct mxl692_dev *dev;
|
||||
@ -1356,7 +1355,7 @@ static struct i2c_driver mxl692_driver = {
|
||||
.driver = {
|
||||
.name = "mxl692",
|
||||
},
|
||||
.probe = mxl692_probe,
|
||||
.probe_new = mxl692_probe,
|
||||
.remove = mxl692_remove,
|
||||
.id_table = mxl692_id_table,
|
||||
};
|
||||
|
@ -768,8 +768,7 @@ static int rtl2830_regmap_gather_write(void *context, const void *reg,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtl2830_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int rtl2830_probe(struct i2c_client *client)
|
||||
{
|
||||
struct rtl2830_platform_data *pdata = client->dev.platform_data;
|
||||
struct rtl2830_dev *dev;
|
||||
@ -887,7 +886,7 @@ static struct i2c_driver rtl2830_driver = {
|
||||
.name = "rtl2830",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe = rtl2830_probe,
|
||||
.probe_new = rtl2830_probe,
|
||||
.remove = rtl2830_remove,
|
||||
.id_table = rtl2830_id_table,
|
||||
};
|
||||
|
@ -1021,8 +1021,7 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rtl2832_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int rtl2832_probe(struct i2c_client *client)
|
||||
{
|
||||
struct rtl2832_platform_data *pdata = client->dev.platform_data;
|
||||
struct i2c_adapter *i2c = client->adapter;
|
||||
@ -1136,7 +1135,7 @@ static struct i2c_driver rtl2832_driver = {
|
||||
.name = "rtl2832",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe = rtl2832_probe,
|
||||
.probe_new = rtl2832_probe,
|
||||
.remove = rtl2832_remove,
|
||||
.id_table = rtl2832_id_table,
|
||||
};
|
||||
|
@ -1144,8 +1144,7 @@ static const struct dvb_frontend_ops si2165_ops = {
|
||||
.read_ber = si2165_read_ber,
|
||||
};
|
||||
|
||||
static int si2165_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int si2165_probe(struct i2c_client *client)
|
||||
{
|
||||
struct si2165_state *state = NULL;
|
||||
struct si2165_platform_data *pdata = client->dev.platform_data;
|
||||
@ -1293,7 +1292,7 @@ static struct i2c_driver si2165_driver = {
|
||||
.driver = {
|
||||
.name = "si2165",
|
||||
},
|
||||
.probe = si2165_probe,
|
||||
.probe_new = si2165_probe,
|
||||
.remove = si2165_remove,
|
||||
.id_table = si2165_id_table,
|
||||
};
|
||||
|
@ -672,8 +672,7 @@ static const struct dvb_frontend_ops si2168_ops = {
|
||||
.read_status = si2168_read_status,
|
||||
};
|
||||
|
||||
static int si2168_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int si2168_probe(struct i2c_client *client)
|
||||
{
|
||||
struct si2168_config *config = client->dev.platform_data;
|
||||
struct si2168_dev *dev;
|
||||
@ -799,7 +798,7 @@ static struct i2c_driver si2168_driver = {
|
||||
.name = "si2168",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe = si2168_probe,
|
||||
.probe_new = si2168_probe,
|
||||
.remove = si2168_remove,
|
||||
.id_table = si2168_id_table,
|
||||
};
|
||||
|
@ -363,8 +363,7 @@ static int sp2_exit(struct i2c_client *client)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sp2_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int sp2_probe(struct i2c_client *client)
|
||||
{
|
||||
struct sp2_config *cfg = client->dev.platform_data;
|
||||
struct sp2 *s;
|
||||
@ -417,7 +416,7 @@ static struct i2c_driver sp2_driver = {
|
||||
.driver = {
|
||||
.name = "sp2",
|
||||
},
|
||||
.probe = sp2_probe,
|
||||
.probe_new = sp2_probe,
|
||||
.remove = sp2_remove,
|
||||
.id_table = sp2_id,
|
||||
};
|
||||
|
@ -4990,8 +4990,7 @@ static struct dvb_frontend *stv090x_get_dvb_frontend(struct i2c_client *client)
|
||||
return &state->frontend;
|
||||
}
|
||||
|
||||
static int stv090x_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int stv090x_probe(struct i2c_client *client)
|
||||
{
|
||||
int ret = 0;
|
||||
struct stv090x_config *config = client->dev.platform_data;
|
||||
@ -5085,7 +5084,7 @@ static struct i2c_driver stv090x_driver = {
|
||||
.name = "stv090x",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe = stv090x_probe,
|
||||
.probe_new = stv090x_probe,
|
||||
.remove = stv090x_remove,
|
||||
.id_table = stv090x_id_table,
|
||||
};
|
||||
|
@ -406,8 +406,7 @@ static struct stv6110x_devctl *stv6110x_get_devctl(struct i2c_client *client)
|
||||
return stv6110x->devctl;
|
||||
}
|
||||
|
||||
static int stv6110x_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int stv6110x_probe(struct i2c_client *client)
|
||||
{
|
||||
struct stv6110x_config *config = client->dev.platform_data;
|
||||
|
||||
@ -481,7 +480,7 @@ static struct i2c_driver stv6110x_driver = {
|
||||
.name = "stv6110x",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe = stv6110x_probe,
|
||||
.probe_new = stv6110x_probe,
|
||||
.remove = stv6110x_remove,
|
||||
.id_table = stv6110x_id_table,
|
||||
};
|
||||
|
@ -1145,8 +1145,7 @@ static struct dvb_frontend *tda10071_get_dvb_frontend(struct i2c_client *client)
|
||||
return &dev->fe;
|
||||
}
|
||||
|
||||
static int tda10071_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int tda10071_probe(struct i2c_client *client)
|
||||
{
|
||||
struct tda10071_dev *dev;
|
||||
struct tda10071_platform_data *pdata = client->dev.platform_data;
|
||||
@ -1241,7 +1240,7 @@ static struct i2c_driver tda10071_driver = {
|
||||
.name = "tda10071",
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe = tda10071_probe,
|
||||
.probe_new = tda10071_probe,
|
||||
.remove = tda10071_remove,
|
||||
.id_table = tda10071_id_table,
|
||||
};
|
||||
|
@ -550,8 +550,7 @@ static void ts2020_regmap_unlock(void *__dev)
|
||||
mutex_unlock(&dev->regmap_mutex);
|
||||
}
|
||||
|
||||
static int ts2020_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int ts2020_probe(struct i2c_client *client)
|
||||
{
|
||||
struct ts2020_config *pdata = client->dev.platform_data;
|
||||
struct dvb_frontend *fe = pdata->fe;
|
||||
@ -721,7 +720,7 @@ static struct i2c_driver ts2020_driver = {
|
||||
.driver = {
|
||||
.name = "ts2020",
|
||||
},
|
||||
.probe = ts2020_probe,
|
||||
.probe_new = ts2020_probe,
|
||||
.remove = ts2020_remove,
|
||||
.id_table = ts2020_id_table,
|
||||
};
|
||||
|
@ -364,6 +364,19 @@ config VIDEO_OV08D10
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called ov08d10.
|
||||
|
||||
config VIDEO_OV08X40
|
||||
tristate "OmniVision OV08X40 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
|
||||
OV08X40 camera.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called ov08x40.
|
||||
|
||||
config VIDEO_OV13858
|
||||
tristate "OmniVision OV13858 sensor support"
|
||||
depends on I2C && VIDEO_DEV
|
||||
@ -445,6 +458,19 @@ config VIDEO_OV2740
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called ov2740.
|
||||
|
||||
config VIDEO_OV4689
|
||||
tristate "OmniVision OV4689 sensor support"
|
||||
depends on GPIOLIB && VIDEO_DEV && I2C
|
||||
select MEDIA_CONTROLLER
|
||||
select VIDEO_V4L2_SUBDEV_API
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
This is a Video4Linux2 sensor-level driver for the OmniVision
|
||||
OV4689 camera.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called ov4689.
|
||||
|
||||
config VIDEO_OV5640
|
||||
tristate "OmniVision OV5640 sensor support"
|
||||
depends on OF
|
||||
@ -725,16 +751,6 @@ config VIDEO_S5C73M3
|
||||
This is a V4L2 sensor driver for Samsung S5C73M3
|
||||
8 Mpixel camera.
|
||||
|
||||
config VIDEO_S5K4ECGX
|
||||
tristate "Samsung S5K4ECGX sensor support"
|
||||
depends on I2C && VIDEO_DEV
|
||||
select MEDIA_CONTROLLER
|
||||
select VIDEO_V4L2_SUBDEV_API
|
||||
select CRC32
|
||||
help
|
||||
This is a V4L2 sensor driver for Samsung S5K4ECGX 5M
|
||||
camera sensor with an embedded SoC image signal processor.
|
||||
|
||||
config VIDEO_S5K5BAF
|
||||
tristate "Samsung S5K5BAF sensor support"
|
||||
depends on I2C && VIDEO_DEV
|
||||
@ -769,6 +785,16 @@ config VIDEO_SR030PC30
|
||||
help
|
||||
This driver supports SR030PC30 VGA camera from Siliconfile
|
||||
|
||||
config VIDEO_ST_VGXY61
|
||||
tristate "ST VGXY61 sensor support"
|
||||
depends on OF && GPIOLIB && VIDEO_DEV && I2C
|
||||
select MEDIA_CONTROLLER
|
||||
select VIDEO_V4L2_SUBDEV_API
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the ST VGXY61
|
||||
camera sensor.
|
||||
|
||||
config VIDEO_VS6624
|
||||
tristate "ST VS6624 sensor support"
|
||||
depends on VIDEO_DEV && I2C
|
||||
@ -1272,6 +1298,22 @@ config VIDEO_TC358743_CEC
|
||||
When selected the tc358743 will support the optional
|
||||
HDMI CEC feature.
|
||||
|
||||
config VIDEO_TC358746
|
||||
tristate "Toshiba TC358746 parallel-CSI2 bridge"
|
||||
depends on VIDEO_DEV && PM && I2C
|
||||
select VIDEO_V4L2_SUBDEV_API
|
||||
select MEDIA_CONTROLLER
|
||||
select V4L2_FWNODE
|
||||
select GENERIC_PHY_MIPI_DPHY
|
||||
select REGMAP_I2C
|
||||
help
|
||||
Support for the Toshiba TC358746 parallel to MIPI CSI-2 bridge.
|
||||
The bridge can work in both directions but currently only the
|
||||
parallel-in / csi-out path is supported.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called tc358746.
|
||||
|
||||
config VIDEO_TVP514X
|
||||
tristate "Texas Instruments TVP514x video decoder"
|
||||
depends on VIDEO_DEV && I2C
|
||||
|
@ -72,6 +72,7 @@ obj-$(CONFIG_VIDEO_NOON010PC30) += noon010pc30.o
|
||||
obj-$(CONFIG_VIDEO_OG01A1B) += og01a1b.o
|
||||
obj-$(CONFIG_VIDEO_OV02A10) += ov02a10.o
|
||||
obj-$(CONFIG_VIDEO_OV08D10) += ov08d10.o
|
||||
obj-$(CONFIG_VIDEO_OV08X40) += ov08x40.o
|
||||
obj-$(CONFIG_VIDEO_OV13858) += ov13858.o
|
||||
obj-$(CONFIG_VIDEO_OV13B10) += ov13b10.o
|
||||
obj-$(CONFIG_VIDEO_OV2640) += ov2640.o
|
||||
@ -79,6 +80,7 @@ obj-$(CONFIG_VIDEO_OV2659) += ov2659.o
|
||||
obj-$(CONFIG_VIDEO_OV2680) += ov2680.o
|
||||
obj-$(CONFIG_VIDEO_OV2685) += ov2685.o
|
||||
obj-$(CONFIG_VIDEO_OV2740) += ov2740.o
|
||||
obj-$(CONFIG_VIDEO_OV4689) += ov4689.o
|
||||
obj-$(CONFIG_VIDEO_OV5640) += ov5640.o
|
||||
obj-$(CONFIG_VIDEO_OV5645) += ov5645.o
|
||||
obj-$(CONFIG_VIDEO_OV5647) += ov5647.o
|
||||
@ -103,7 +105,6 @@ obj-$(CONFIG_VIDEO_RDACM20) += rdacm20.o
|
||||
obj-$(CONFIG_VIDEO_RDACM21) += rdacm21.o
|
||||
obj-$(CONFIG_VIDEO_RJ54N1) += rj54n1cb0c.o
|
||||
obj-$(CONFIG_VIDEO_S5C73M3) += s5c73m3/
|
||||
obj-$(CONFIG_VIDEO_S5K4ECGX) += s5k4ecgx.o
|
||||
obj-$(CONFIG_VIDEO_S5K5BAF) += s5k5baf.o
|
||||
obj-$(CONFIG_VIDEO_S5K6A3) += s5k6a3.o
|
||||
obj-$(CONFIG_VIDEO_S5K6AA) += s5k6aa.o
|
||||
@ -117,7 +118,9 @@ obj-$(CONFIG_VIDEO_SAA7185) += saa7185.o
|
||||
obj-$(CONFIG_VIDEO_SONY_BTF_MPX) += sony-btf-mpx.o
|
||||
obj-$(CONFIG_VIDEO_SR030PC30) += sr030pc30.o
|
||||
obj-$(CONFIG_VIDEO_ST_MIPID02) += st-mipid02.o
|
||||
obj-$(CONFIG_VIDEO_ST_VGXY61) += st-vgxy61.o
|
||||
obj-$(CONFIG_VIDEO_TC358743) += tc358743.o
|
||||
obj-$(CONFIG_VIDEO_TC358746) += tc358746.o
|
||||
obj-$(CONFIG_VIDEO_TDA1997X) += tda1997x.o
|
||||
obj-$(CONFIG_VIDEO_TDA7432) += tda7432.o
|
||||
obj-$(CONFIG_VIDEO_TDA9840) += tda9840.o
|
||||
|
@ -290,8 +290,7 @@ static int __maybe_unused ad5820_resume(struct device *dev)
|
||||
return ad5820_power_on(coil, true);
|
||||
}
|
||||
|
||||
static int ad5820_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *devid)
|
||||
static int ad5820_probe(struct i2c_client *client)
|
||||
{
|
||||
struct ad5820_device *coil;
|
||||
int ret;
|
||||
@ -301,21 +300,15 @@ static int ad5820_probe(struct i2c_client *client,
|
||||
return -ENOMEM;
|
||||
|
||||
coil->vana = devm_regulator_get(&client->dev, "VANA");
|
||||
if (IS_ERR(coil->vana)) {
|
||||
ret = PTR_ERR(coil->vana);
|
||||
if (ret != -EPROBE_DEFER)
|
||||
dev_err(&client->dev, "could not get regulator for vana\n");
|
||||
return ret;
|
||||
}
|
||||
if (IS_ERR(coil->vana))
|
||||
return dev_err_probe(&client->dev, PTR_ERR(coil->vana),
|
||||
"could not get regulator for vana\n");
|
||||
|
||||
coil->enable_gpio = devm_gpiod_get_optional(&client->dev, "enable",
|
||||
GPIOD_OUT_LOW);
|
||||
if (IS_ERR(coil->enable_gpio)) {
|
||||
ret = PTR_ERR(coil->enable_gpio);
|
||||
if (ret != -EPROBE_DEFER)
|
||||
dev_err(&client->dev, "could not get enable gpio\n");
|
||||
return ret;
|
||||
}
|
||||
if (IS_ERR(coil->enable_gpio))
|
||||
return dev_err_probe(&client->dev, PTR_ERR(coil->enable_gpio),
|
||||
"could not get enable gpio\n");
|
||||
|
||||
mutex_init(&coil->power_lock);
|
||||
|
||||
@ -327,18 +320,18 @@ static int ad5820_probe(struct i2c_client *client,
|
||||
|
||||
ret = media_entity_pads_init(&coil->subdev.entity, 0, NULL);
|
||||
if (ret < 0)
|
||||
goto cleanup2;
|
||||
goto clean_mutex;
|
||||
|
||||
ret = v4l2_async_register_subdev(&coil->subdev);
|
||||
if (ret < 0)
|
||||
goto cleanup;
|
||||
goto clean_entity;
|
||||
|
||||
return ret;
|
||||
|
||||
cleanup2:
|
||||
mutex_destroy(&coil->power_lock);
|
||||
cleanup:
|
||||
clean_entity:
|
||||
media_entity_cleanup(&coil->subdev.entity);
|
||||
clean_mutex:
|
||||
mutex_destroy(&coil->power_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -377,7 +370,7 @@ static struct i2c_driver ad5820_i2c_driver = {
|
||||
.pm = &ad5820_pm,
|
||||
.of_match_table = ad5820_of_table,
|
||||
},
|
||||
.probe = ad5820_probe,
|
||||
.probe_new = ad5820_probe,
|
||||
.remove = ad5820_remove,
|
||||
.id_table = ad5820_id_table,
|
||||
};
|
||||
|
@ -1080,7 +1080,7 @@ static void ad9389b_init_setup(struct v4l2_subdev *sd)
|
||||
ad9389b_set_isr(sd, false);
|
||||
}
|
||||
|
||||
static int ad9389b_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
||||
static int ad9389b_probe(struct i2c_client *client)
|
||||
{
|
||||
const struct v4l2_dv_timings dv1080p60 = V4L2_DV_BT_CEA_1920X1080P60;
|
||||
struct ad9389b_state *state;
|
||||
@ -1207,7 +1207,7 @@ static struct i2c_driver ad9389b_driver = {
|
||||
.driver = {
|
||||
.name = "ad9389b",
|
||||
},
|
||||
.probe = ad9389b_probe,
|
||||
.probe_new = ad9389b_probe,
|
||||
.remove = ad9389b_remove,
|
||||
.id_table = ad9389b_id,
|
||||
};
|
||||
|
@ -463,8 +463,7 @@ err:
|
||||
}
|
||||
|
||||
|
||||
static int adp1653_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *devid)
|
||||
static int adp1653_probe(struct i2c_client *client)
|
||||
{
|
||||
struct adp1653_flash *flash;
|
||||
int ret;
|
||||
@ -536,7 +535,7 @@ static struct i2c_driver adp1653_i2c_driver = {
|
||||
.name = ADP1653_NAME,
|
||||
.pm = &adp1653_pm_ops,
|
||||
},
|
||||
.probe = adp1653_probe,
|
||||
.probe_new = adp1653_probe,
|
||||
.remove = adp1653_remove,
|
||||
.id_table = adp1653_id_table,
|
||||
};
|
||||
|
@ -334,8 +334,7 @@ static const struct v4l2_subdev_ops adv7170_ops = {
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
static int adv7170_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int adv7170_probe(struct i2c_client *client)
|
||||
{
|
||||
struct adv7170 *encoder;
|
||||
struct v4l2_subdev *sd;
|
||||
@ -388,7 +387,7 @@ static struct i2c_driver adv7170_driver = {
|
||||
.driver = {
|
||||
.name = "adv7170",
|
||||
},
|
||||
.probe = adv7170_probe,
|
||||
.probe_new = adv7170_probe,
|
||||
.remove = adv7170_remove,
|
||||
.id_table = adv7170_id,
|
||||
};
|
||||
|
@ -389,8 +389,7 @@ static const struct v4l2_subdev_ops adv7175_ops = {
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
static int adv7175_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int adv7175_probe(struct i2c_client *client)
|
||||
{
|
||||
int i;
|
||||
struct adv7175 *encoder;
|
||||
@ -443,7 +442,7 @@ static struct i2c_driver adv7175_driver = {
|
||||
.driver = {
|
||||
.name = "adv7175",
|
||||
},
|
||||
.probe = adv7175_probe,
|
||||
.probe_new = adv7175_probe,
|
||||
.remove = adv7175_remove,
|
||||
.id_table = adv7175_id,
|
||||
};
|
||||
|
@ -521,8 +521,7 @@ static const struct v4l2_subdev_ops adv7183_ops = {
|
||||
.pad = &adv7183_pad_ops,
|
||||
};
|
||||
|
||||
static int adv7183_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int adv7183_probe(struct i2c_client *client)
|
||||
{
|
||||
struct adv7183 *decoder;
|
||||
struct v4l2_subdev *sd;
|
||||
@ -632,7 +631,7 @@ static struct i2c_driver adv7183_driver = {
|
||||
.driver = {
|
||||
.name = "adv7183",
|
||||
},
|
||||
.probe = adv7183_probe,
|
||||
.probe_new = adv7183_probe,
|
||||
.remove = adv7183_remove,
|
||||
.id_table = adv7183_id,
|
||||
};
|
||||
|
@ -381,8 +381,7 @@ static int adv7393_initialize(struct v4l2_subdev *sd)
|
||||
return err;
|
||||
}
|
||||
|
||||
static int adv7393_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int adv7393_probe(struct i2c_client *client)
|
||||
{
|
||||
struct adv7393_state *state;
|
||||
int err;
|
||||
@ -456,7 +455,7 @@ static struct i2c_driver adv7393_driver = {
|
||||
.driver = {
|
||||
.name = "adv7393",
|
||||
},
|
||||
.probe = adv7393_probe,
|
||||
.probe_new = adv7393_probe,
|
||||
.remove = adv7393_remove,
|
||||
.id_table = adv7393_id,
|
||||
};
|
||||
|
@ -521,6 +521,10 @@ int adv748x_afe_init(struct adv748x_afe *afe)
|
||||
}
|
||||
}
|
||||
|
||||
adv748x_afe_s_input(afe, afe->input);
|
||||
|
||||
adv_dbg(state, "AFE Default input set to %d\n", afe->input);
|
||||
|
||||
/* Entity pads and sinks are 0-indexed to match the pads */
|
||||
for (i = ADV748X_AFE_SINK_AIN0; i <= ADV748X_AFE_SINK_AIN7; i++)
|
||||
afe->pads[i].flags = MEDIA_PAD_FL_SINK;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user