* [PATCH 1/2] dt-bindings: media: i2c: Add OmniVision OV13858
2026-10-15 21:48 [PATCH 0/2] media: ov13858: device tree support for the Surface Pro 11 (Snapdragon) George Neacsu via B4 Relay
@ 2026-10-15 21:48 ` George Neacsu via B4 Relay
2026-10-15 21:48 ` [PATCH 2/2] media: i2c: ov13858: Add device tree support George Neacsu via B4 Relay
2026-10-16 7:01 ` [PATCH 0/2] media: ov13858: device tree support for the Surface Pro 11 (Snapdragon) Sergey Lebedev
2 siblings, 0 replies; 7+ messages in thread
From: George Neacsu via B4 Relay @ 2026-10-15 21:48 UTC (permalink / raw)
To: Sakari Ailus
Cc: Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Sergey Lebedev, German Pablo Lindo,
Bryan O'Donoghue, linux-media, devicetree, linux-arm-msm,
linux-kernel, George Neacsu
From: George Neacsu <geocausa@gmail.com>
The OV13858 is a 13 megapixel sensor with a four-lane MIPI CSI-2 D-PHY
output. So far its driver has only been probed through ACPI. The
Microsoft Surface Pro 11 with a Snapdragon X Elite uses it as the rear
camera, and that machine describes it in the device tree.
The supplies are the three the driver takes, and the reset GPIO drives
the XSHUTDN pad.
Assisted-by: Claude:claude-opus-5-5
Signed-off-by: George Neacsu <geocausa@gmail.com>
---
.../bindings/media/i2c/ovti,ov13858.yaml | 113 +++++++++++++++++++++
MAINTAINERS | 1 +
2 files changed, 114 insertions(+)
diff --git a/Documentation/devicetree/bindings/media/i2c/ovti,ov13858.yaml b/Documentation/devicetree/bindings/media/i2c/ovti,ov13858.yaml
new file mode 100644
index 0000000..a1cbdb1
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/i2c/ovti,ov13858.yaml
@@ -0,0 +1,113 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/media/i2c/ovti,ov13858.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: OmniVision OV13858 CMOS Sensor
+
+maintainers:
+ - George Neacsu <geocausa@gmail.com>
+
+description:
+ The OmniVision OV13858 is a 13 megapixel CMOS image sensor with an I2C
+ control interface. It outputs 10-bit Bayer data over a four-lane MIPI
+ CSI-2 D-PHY interface and takes a 19.2 MHz input clock.
+
+allOf:
+ - $ref: /schemas/media/video-interface-devices.yaml#
+
+properties:
+ compatible:
+ const: ovti,ov13858
+
+ reg:
+ maxItems: 1
+
+ clocks:
+ description: Input clock (19.2 MHz)
+ maxItems: 1
+
+ avdd-supply:
+ description: Analogue circuit voltage supply.
+
+ dovdd-supply:
+ description: I/O circuit voltage supply.
+
+ dvdd-supply:
+ description: Digital circuit voltage supply.
+
+ reset-gpios:
+ description: Active low GPIO connected to the XSHUTDN pad of the sensor.
+ maxItems: 1
+
+ port:
+ $ref: /schemas/graph.yaml#/$defs/port-base
+ additionalProperties: false
+
+ properties:
+ endpoint:
+ $ref: /schemas/media/video-interfaces.yaml#
+ unevaluatedProperties: false
+
+ properties:
+ data-lanes:
+ items:
+ - const: 1
+ - const: 2
+ - const: 3
+ - const: 4
+
+ required:
+ - data-lanes
+ - link-frequencies
+
+ required:
+ - endpoint
+
+required:
+ - compatible
+ - reg
+ - clocks
+ - avdd-supply
+ - dovdd-supply
+ - dvdd-supply
+ - port
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/gpio/gpio.h>
+
+ i2c {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ camera@10 {
+ compatible = "ovti,ov13858";
+ reg = <0x10>;
+
+ clocks = <&cam_mclk>;
+ assigned-clocks = <&cam_mclk>;
+ assigned-clock-rates = <19200000>;
+
+ avdd-supply = <&vreg_cam_2p8>;
+ dovdd-supply = <&vreg_cam_1p8>;
+ dvdd-supply = <&vreg_cam_1p2>;
+
+ reset-gpios = <&tlmm 110 GPIO_ACTIVE_LOW>;
+
+ orientation = <1>;
+ rotation = <0>;
+
+ port {
+ endpoint {
+ remote-endpoint = <&csiphy1_ep>;
+ data-lanes = <1 2 3 4>;
+ link-frequencies = /bits/ 64 <540000000 270000000>;
+ };
+ };
+ };
+ };
+...
diff --git a/MAINTAINERS b/MAINTAINERS
index 5d39ec6..0cbb07e 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -20186,6 +20186,7 @@ M: Sakari Ailus <sakari.ailus@linux.intel.com>
L: linux-media@vger.kernel.org
S: Maintained
T: git git://linuxtv.org/media.git
+F: Documentation/devicetree/bindings/media/i2c/ovti,ov13858.yaml
F: drivers/media/i2c/ov13858.c
OMNIVISION OV13B10 SENSOR DRIVER
--
2.53.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH 2/2] media: i2c: ov13858: Add device tree support
2026-10-15 21:48 [PATCH 0/2] media: ov13858: device tree support for the Surface Pro 11 (Snapdragon) George Neacsu via B4 Relay
2026-10-15 21:48 ` [PATCH 1/2] dt-bindings: media: i2c: Add OmniVision OV13858 George Neacsu via B4 Relay
@ 2026-10-15 21:48 ` George Neacsu via B4 Relay
2026-10-16 16:06 ` Bryan O'Donoghue
2026-10-16 7:01 ` [PATCH 0/2] media: ov13858: device tree support for the Surface Pro 11 (Snapdragon) Sergey Lebedev
2 siblings, 1 reply; 7+ messages in thread
From: George Neacsu via B4 Relay @ 2026-10-15 21:48 UTC (permalink / raw)
To: Sakari Ailus
Cc: Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Sergey Lebedev, German Pablo Lindo,
Bryan O'Donoghue, linux-media, devicetree, linux-arm-msm,
linux-kernel, George Neacsu
From: George Neacsu <geocausa@gmail.com>
The rear camera of the Surface Pro 11 with a Snapdragon X Elite is an
OV13858 on a four-lane D-PHY link, described in the device tree. Add an
OF match table.
Parse the endpoint as other sensor drivers that serve both ACPI and DT
do. Wait for the endpoint if a bridge driver has not created it yet,
require four data lanes, and require both link frequencies, since the
modes switch between 540 and 270 MHz. The IPU bridge entry for OVTID858
lists both, so an ACPI machine with that entry probes as before. Without
the entry the sensor now waits for the bridge instead of probing into an
empty graph.
Tested on the Surface Pro 11 (X1E80100), with an out-of-tree CAMSS
capturing raw frames over CSIPHY1, CSID0 and an RDI interface:
4224x3136 at 29.95 fps at 540 MHz, the colour-bar test pattern intact,
and a scene captures.
Assisted-by: Claude:claude-opus-5-5
Signed-off-by: George Neacsu <geocausa@gmail.com>
---
drivers/media/i2c/ov13858.c | 62 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 62 insertions(+)
diff --git a/drivers/media/i2c/ov13858.c b/drivers/media/i2c/ov13858.c
index 83eefba..587ee38 100644
--- a/drivers/media/i2c/ov13858.c
+++ b/drivers/media/i2c/ov13858.c
@@ -1713,6 +1713,57 @@ static int ov13858_power_off(struct device *dev)
static DEFINE_RUNTIME_DEV_PM_OPS(ov13858_pm_ops, ov13858_power_off,
ov13858_power_on, NULL);
+static int ov13858_check_hwcfg(struct device *dev)
+{
+ struct v4l2_fwnode_endpoint bus_cfg = {
+ .bus_type = V4L2_MBUS_CSI2_DPHY
+ };
+ unsigned long link_freq_bitmap;
+ struct fwnode_handle *ep;
+ int ret;
+
+ /*
+ * Sometimes the fwnode graph is initialized by the bridge driver.
+ * Bridge drivers doing this also add sensor properties, wait for this.
+ */
+ ep = fwnode_graph_get_next_endpoint(dev_fwnode(dev), NULL);
+ if (!ep)
+ return dev_err_probe(dev, -EPROBE_DEFER,
+ "waiting for fwnode graph endpoint\n");
+
+ ret = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg);
+ fwnode_handle_put(ep);
+ if (ret)
+ return dev_err_probe(dev, ret, "parsing endpoint failed\n");
+
+ if (bus_cfg.bus.mipi_csi2.num_data_lanes != 4) {
+ ret = dev_err_probe(dev, -EINVAL,
+ "%u data lanes are not supported, only 4\n",
+ bus_cfg.bus.mipi_csi2.num_data_lanes);
+ goto out;
+ }
+
+ /* The modes use both link frequencies, so both have to be allowed. */
+ ret = v4l2_link_freq_to_bitmap(dev, bus_cfg.link_frequencies,
+ bus_cfg.nr_of_link_frequencies,
+ link_freq_menu_items,
+ ARRAY_SIZE(link_freq_menu_items),
+ &link_freq_bitmap);
+ if (ret)
+ goto out;
+
+ if (link_freq_bitmap != GENMASK(ARRAY_SIZE(link_freq_menu_items) - 1, 0))
+ ret = dev_err_probe(dev, -EINVAL,
+ "link frequencies %lld and %lld are both needed\n",
+ link_freq_menu_items[0],
+ link_freq_menu_items[1]);
+
+out:
+ v4l2_fwnode_endpoint_free(&bus_cfg);
+
+ return ret;
+}
+
static int ov13858_probe(struct i2c_client *client)
{
struct ov13858 *ov13858;
@@ -1725,6 +1776,10 @@ static int ov13858_probe(struct i2c_client *client)
ov13858->dev = &client->dev;
+ ret = ov13858_check_hwcfg(ov13858->dev);
+ if (ret)
+ return ret;
+
ov13858->clk = devm_v4l2_sensor_clk_get(ov13858->dev, NULL);
if (IS_ERR(ov13858->clk))
return dev_err_probe(ov13858->dev, PTR_ERR(ov13858->clk),
@@ -1845,10 +1900,17 @@ static const struct acpi_device_id ov13858_acpi_ids[] = {
MODULE_DEVICE_TABLE(acpi, ov13858_acpi_ids);
#endif
+static const struct of_device_id ov13858_of_match[] = {
+ { .compatible = "ovti,ov13858" },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, ov13858_of_match);
+
static struct i2c_driver ov13858_i2c_driver = {
.driver = {
.name = "ov13858",
.acpi_match_table = ACPI_PTR(ov13858_acpi_ids),
+ .of_match_table = ov13858_of_match,
.pm = pm_ptr(&ov13858_pm_ops),
},
.probe = ov13858_probe,
--
2.53.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH 0/2] media: ov13858: device tree support for the Surface Pro 11 (Snapdragon)
2026-10-15 21:48 [PATCH 0/2] media: ov13858: device tree support for the Surface Pro 11 (Snapdragon) George Neacsu via B4 Relay
2026-10-15 21:48 ` [PATCH 1/2] dt-bindings: media: i2c: Add OmniVision OV13858 George Neacsu via B4 Relay
2026-10-15 21:48 ` [PATCH 2/2] media: i2c: ov13858: Add device tree support George Neacsu via B4 Relay
@ 2026-10-16 7:01 ` Sergey Lebedev
2026-10-16 14:55 ` George Neacsu
2 siblings, 1 reply; 7+ messages in thread
From: Sergey Lebedev @ 2026-10-16 7:01 UTC (permalink / raw)
To: George Neacsu
Cc: Sakari Ailus, Mauro Carvalho Chehab, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, German Pablo Lindo,
Bryan O'Donoghue, linux-media, devicetree, linux-arm-msm,
linux-kernel
Hi George,
On the Intel model, with the power-on v3 and these two on media next, the
new endpoint check passes with the endpoint ipu-bridge builds (four lanes,
540 and 270 MHz). The sensor streams 4224x3136 at 29.95 fps, and
v4l2-compliance passes 46 of 46 on the subdev. Through the media device
one test fails, Active VIDIOC_SUBDEV_S_FMT, because
ov13858_update_pad_format() never sets the colorspace. That is in media
next's driver already, not in these patches.
Tested-by: Sergey Lebedev <lsa.uz@pm.me> # Surface Pro 11 (Intel)
Thank you for picking up the power patch as a base.
Sergey
^ permalink raw reply [flat|nested] 7+ messages in thread