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.
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-cio2reportsConnected 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 --listshows no cameras. libcamera debug output ends with:media-ctl -p -d /dev/media0shows the broken state: all three sensor entitieshave 0 links, the
ipu3-csi2subdev entities have no device nodes, andno
/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 inthis kernel only carries an OF match table —
modinfo dw9719shows onlyof:N*T*Cdongwoon,...aliases and noi2c:dw9719alias:Consequences on x86/ACPI:
modprobe dw9719, the driver still does not bindecho i2c-INT347A:00-VCM > /sys/bus/i2c/drivers/dw9719/bind→No such device/sys/bus/i2c/devices/i2c-INT347A:00-VCMpermanently has no driver boundSince 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:plus
.id_table = dw9719_id_table,in thei2c_driverstruct.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:
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 -pand libcamera debug logs if useful.