Skip to content

Three patches for Lunar Lake (LNL) camera bring-up – SET_HOST_IDENTIFIER, auto-release, sensor_owner sysfs #32

@osandum

Description

@osandum

I got the IPU7 camera fully working on a Dell XPS 13 (Core Ultra 200V, Lunar Lake) running Fedora 42 / kernel 6.18.8, with three patches to the CVS driver. These address the same probe failure reported in #31.

Hardware

  • Dell XPS 13 (hw rev 0x10280cc9)
  • Camera: OV02C10 (OVTI02C1:00) on CSI-2 port 0, I2C via usbio-i2c.1
  • CVS chip: INTC10DE:00 at 0x76 on usbio-i2c.0
  • Protocol 1.0, no magic number support

Problem

The unmodified driver fails to probe because SET_HOST_IDENTIFIER returns -EIO and the driver treats this as fatal. This is the same failure in #31:

Intel CVS driver i2c-INTC10DE:00: cvs_common_probe:set_host_identifier cmd failed

Once that's fixed, the driver acquires the sensor via the GPIO handshake and the camera works. However, two usability problems remain:

  1. The camera LED stays on permanently because nothing releases the sensor after probe.
  2. There is no mechanism for userspace to re-acquire the sensor on demand after a release.

Patches

1. Make SET_HOST_IDENTIFIER non-fatal

The GPIO-based sensor acquisition handshake succeeds without this I2C command. On this hardware (and likely all LNL with protocol 1.0), the command consistently returns -EIO via the USBIO I2C bridge. Downgrading to dev_warn lets the driver continue to the GPIO handshake.

 			ret = cvs_write_i2c(SET_HOST_IDENTIFIER, NULL, 0);
-			if (ret) {
-				dev_err(cvs->dev, "%s:set_host_identifier cmd failed", __func__);
-				goto exit;
-			}
+			if (ret)
+				dev_warn(cvs->dev, "%s:set_host_identifier cmd failed (non-fatal)", __func__);

2. Delayed sensor release after probe

After acquiring the sensor at probe (so dependent sensor drivers like ov02c10 can bind), schedule a release after 10 seconds. This turns the camera LED off when no application is using the camera.

 	icvs->icvs_sensor_state = CV_SENSOR_VISION_ACQUIRED_STATE;
 	acpi_dev_clear_dependencies(ACPI_COMPANION(icvs->dev));

+	INIT_DELAYED_WORK(&icvs->delayed_release, cvs_delayed_release);
+	schedule_delayed_work(&icvs->delayed_release, msecs_to_jiffies(10000));

(With a corresponding delayed_work field in struct intel_cvs and a cancel_delayed_work_sync in the remove path.)

3. sensor_owner sysfs attribute for userspace acquire/release

Exposes a read/write sysfs file so userspace can acquire the sensor before camera use and release it afterwards:

echo ipu > /sys/bus/i2c/devices/i2c-INTC10DE:00/.../sensor_owner   # LED on, camera usable
echo cvs > /sys/bus/i2c/devices/i2c-INTC10DE:00/.../sensor_owner   # shows "ipu" or "cvs"
cat .../sensor_owner                                                 # shows "ipu" or "cvs"

This is necessary because the camera LED is hardware-tied to the CVS req GPIO – it stays on the entire time the host holds sensor ownership. Without this, users either have no camera (if released) or a permanently-lit LED (if acquired).

Result

With all three patches, the boot sequence is:

  1. CVS probes → acquires sensor → ov02c10 binds to IPU7 ISYS
  2. 10s later → sensor auto-released → LED off
  3. Userspace writes ipu to sysfs → LED on, camera active
  4. Userspace writes cvs to sysfs → LED off

The camera works at 1920x1080@30fps via libcamera 0.7.0 Simple pipeline handler + GPU-accelerated SoftISP, exposed through PipeWire.

Note on probe ordering

The upstream kernel has INTC10DE in acpi_ignore_dep_ids[] (commit 4405a214df14), so ov02c10 probes before CVS is ready and fails. A udev rule that re-binds ov02c10 after CVS probes works around this. Antti Laakso's pending patch ("media: ipu-bridge: Add DMI quirk for CVS-sensor dependency") should fix this properly.

Full writeup with ACPI topology, INT3472 details, and upstream references: available on request.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions