Skip to content

dw9719 VCM driver cannot bind on ACPI systems (missing i2c_device_id table) — blocks all cameras on Surface Book 1 (kernel 6.19.8) #2172

Open

Description

@TroubleTea

Device: Surface Book 1 (13.5", model without dGPU)
Kernel: 6.19.8-3.surface.fc43.x86_64 (linux-surface repo, f43 packages on Fedora 44)
Distro: Fedora Workstation 44
libcamera: 0.7.0 (Fedora packages, IPU3 pipeline + IPA present)

Symptom

Kernel-side IPU3 init looks completely healthy in dmesg: ipu3-cio2 reports
Connected 3 cameras, all three sensors (ov5693 front, ov8865 rear, ov7251 IR)
probe successfully, the imgu firmware loads, and the bridge logs
ov8865 i2c-INT347A:00: Instantiated dw9719 VCM.

However, cam --list shows no cameras. libcamera debug output ends with:

DEBUG DeviceEnumerator device_enumerator.cpp:118 Skip ipu3-csi2 0: no device node

media-ctl -p -d /dev/media0 shows the broken state: all three sensor entities
have 0 links, the ipu3-csi2 subdev entities have no device nodes, and
no /dev/v4l-subdev* nodes exist for the cio2 graph at all.

Root cause

The rear camera's focus motor (dw9719) is instantiated by ipu-bridge as a plain
i2c client named dw9719 (no ACPI companion, no OF node). The dw9719 driver in
this kernel only carries an OF match table — modinfo dw9719 shows only
of:N*T*Cdongwoon,... aliases and no i2c:dw9719 alias:

alias:          of:N*T*Cdongwoon,dw9719C*
alias:          of:N*T*Cdongwoon,dw9719
(... only OF aliases, no i2c: alias ...)

Consequences on x86/ACPI:

  • module autoload via uevent never triggers
  • after a manual modprobe dw9719, the driver still does not bind
  • a manual sysfs bind fails outright:
    echo i2c-INT347A:00-VCM > /sys/bus/i2c/drivers/dw9719/bind → No such device
  • /sys/bus/i2c/devices/i2c-INT347A:00-VCM permanently has no driver bound

Since the VCM subdev never registers, the ov8865's async sub-notifier
(lens-focus) never completes, which blocks the cio2 notifier's complete() —
so no media links are created and no v4l-subdev nodes are registered for any
camera, including the otherwise functional front camera.

Fix (verified working)

Adding the missing i2c_device_id table to drivers/media/i2c/dw9719.c:

static const struct i2c_device_id dw9719_id_table[] = {
	{ "dw9719" },
	{ }
};
MODULE_DEVICE_TABLE(i2c, dw9719_id_table);

plus .id_table = dw9719_id_table, in the i2c_driver struct.

After rebuilding just this module and loading it, the VCM binds immediately
(dw9719 i2c-INT347A:00-VCM: supply vdd not found, using dummy regulator —
expected, dummy regulator is fine), the async chain completes within a second,
and libcamera registers both cameras:

Available cameras:
1: Internal back camera (\_SB_.PCI0.I2C3.CAMR)
2: Internal front camera (\_SB_.PCI0.I2C2.CAMF)

qcam shows a live image from both sensors (uncalibrated/greenish as expected).

This presumably affects every IPU3 Surface device whose rear camera uses the
dw9719 VCM on this kernel series. Happy to provide full dmesg, media-ctl -p
and libcamera debug logs if useful.

Activity

  1. r-o-i commented on Jul 26, 2026

    @r-o-i

    Same issue for me on Surface Pro 5th Edition:

    Device: Surface Pro (SKU: Surface_Pro_1796)
    Kernel: 6.19.8-surface-3
    Distro: Ubuntu 26.04 LTS
    libcamera: version (built from source (/usr/local), IPU3 pipeline + IPA present (/home/qv-104/Downloads/libcamera/build/src/ipa/ipu3/ipa_ipu3.so))

    See attached file for terminal outputs for dmesg, modinfo dw9719 and media-ctl -p

    dmesg_logs.txt


    I tested the proposed change to dw9719.c - it mostly worked, in that I could see both front and rear cameras. However the rear camera was flat green (not just tinged).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions