[PATCH 0/2] arm64: dts: rockchip: enable OV9281 CAM0 and CAM1 on RK3588 Jaguar

From: Quentin Schulz

Date: Mon Nov 02 2026 - 15:31:52 EST


RK3588 Jaguar has two proprietary camera connectors, P14 and P15. This
adds support for the only camera module we currently have for this
connector.

The camera module has a 2-lane OV9281 camera sensor, an IMU, a
magnetometer and an EEPROM.

We have new camera modules based on an OV13850 that should be coming up
soon, hence why I made the support into their own separate DTSO instead
of directly integrating them in the main DTS.

Known issues:
- lis2mdl driver currently doesn't support being instantiated twice, so
only one magnetometer will show up, if the two cameras modules are
connected,
- OV9281 test patterns (no upstream support) returns broken patterns,
see discussion on IRC
https://libera.catirclogs.org/linux-rockchip/2026-11-02, the image I
get without the test pattern *looks* okay to my non-expert eyes. In
any case, it's unlikely to be an issue in the Device Tree,

Image capture test:
#!/usr/bin/env bash

set -o pipefail
set -eux

CAM=$1
COLORFMT=$2
SIZE=$3

if [ "$COLORFMT" = "GREY" ] || [ "$COLORFMT" = "Y8" ]; then
MEDIACTLFMT="fmt:Y8_1X8/$SIZE field:none colorspace:raw xfer:none"
BITDEPTH=8
else
MEDIACTLFMT="fmt:Y10_1X10/$SIZE field:none colorspace:raw xfer:none"
BITDEPTH=10
fi

if [ "$CAM" = "P14" ]; then
MEDIACTL_SENSOR="ov9281 2-0060"
MEDIACTL_RKCIF="rkcif-mipi2"
MEDIACTL_CSIRX="dw-mipi-csi2rx fdd30000.csi"
else
MEDIACTL_SENSOR="ov9281 7-0060"
MEDIACTL_RKCIF="rkcif-mipi4"
MEDIACTL_CSIRX="dw-mipi-csi2rx fdd50000.csi"
fi

for dev in /sys/class/video4linux/video*/; do
if [ "$(cat "$dev/name")" != "$MEDIACTL_RKCIF-id0" ]; then
continue
fi

VIDEODEV=$(basename "$dev")
break
done

media-ctl -d 0 --set-v4l2 "'$MEDIACTL_SENSOR':0 [$MEDIACTLFMT]"
media-ctl -d 0 --set-v4l2 "'$MEDIACTL_RKCIF':0 [$MEDIACTLFMT]"
media-ctl -d 0 --set-v4l2 "'$MEDIACTL_CSIRX':0 [$MEDIACTLFMT]"
# Name the file a format YUView can recognize automatically
/root/yavta/build/yavta -f"$COLORFMT" -s$SIZE -c1 -n1 /dev/$VIDEODEV -Fframe-#_${SIZE}_${BITDEPTH}b_yuv400.yuv

With yavta[1] and checked with YUView[2] as gstreamer doesn't seem[3] to
have support for Y10.

Ran:
- ./test-cam.sh P14 Y8 1280x800
- ./test-cam.sh P15 Y8 1280x800
- ./test-cam.sh P14 Y10 1280x800
- ./test-cam.sh P15 Y10 1280x800

Pictures look decent to me.

Wrote random data to the EEPROMs and read it back identical.

Moved the cameras, accel and gyro raw sysfs values changed.

Magnetometers tested individually, with small magnet, raw values
changed.

I've not tested IIO buffers and/or the various interrupts.

[1] https://git.ideasonboard.com/camera/yavta
[2] https://github.com/IENT/YUView
[3] https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/3738

Light dependency on
https://lore.kernel.org/linux-media/20261102-v4l-y8-y10-csi-vicap-v2-0-0a4149d96dae@xxxxxxxxx/
for it to actually work (no impact on binding or device tree).

Signed-off-by: Quentin Schulz <quentin.schulz@xxxxxxxxx>
---
Quentin Schulz (2):
arm64: dts: rockchip: enable OV9281 CAM0 P14 on RK3588 Jaguar
arm64: dts: rockchip: enable OV9281 CAM1 P15 on RK3588 Jaguar

arch/arm64/boot/dts/rockchip/Makefile | 7 ++
.../dts/rockchip/rk3588-jaguar-p14-ov9281.dtso | 113 +++++++++++++++++++++
.../dts/rockchip/rk3588-jaguar-p15-ov9281.dtso | 112 ++++++++++++++++++++
arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts | 36 ++++++-
4 files changed, 267 insertions(+), 1 deletion(-)
---
base-commit: 233ebf31c98e1d7185d12d1ff332f3354f4950f5
change-id: 20261015-jaguar-cam0-cam1-dcc02f56766a

Best regards,
--
Quentin Schulz <quentin.schulz@xxxxxxxxx>