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

@TroubleTea

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 tablemodinfo 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/bindNo 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.

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