Skip to content

Cameras (IPU3): dw9719 VCM driver no longer binds on 6.19+ kernels — kills all cameras (missing i2c ID table) #2225

Open

Description

@engmondy

Environment

  • Device: Surface Pro 5 (Surface_Pro_1796), i5-7300U
  • Kernel: 6.19.8-surface-3 (from pkg.surfacelinux.com) — regression confirmed vs 6.14, whose dw9719 module still binds
  • Distro: Linux Mint 22.3 (Ubuntu 24.04 base)
  • Userspace: libcamera 0.3.0 with IPU3 pipeline (source build)

Summary

On 6.19-based surface kernels, all IPU3 cameras disappear (cam -l lists
nothing) because the dw9719 focus-motor (VCM) driver no longer binds to the
VCM i2c client that ipu-bridge instantiates. The sensor's swnode references
the VCM via lens-focus, so the cio2 async notifier never completes: no
sensor→CSI-2 media links are created, no sensor subdev nodes appear, and
libcamera registers zero cameras — including the front camera, which has no
VCM of its own.

Root cause

ipu_bridge_instantiate_vcm() creates the VCM i2c client with plain board-info
type "dw9719" (modalias i2c:dw9719). The current drivers/media/i2c/dw9719.c
only carries an OF match table (dongwoon,dw9719 etc.) and has no
i2c_device_id table
, so i2c core matching never succeeds:

$ cat /sys/bus/i2c/devices/i2c-INT347A:00-VCM/modalias
i2c:dw9719

$ modinfo dw9719 | grep '^alias'
alias:          of:N*T*Cdongwoon,dw9800k...   (of: aliases only, no i2c: alias)

$ ls -l /sys/bus/i2c/devices/i2c-INT347A:00-VCM/driver
ls: cannot access ...: No such file or directory     <- never binds

Media graph state while broken (note sensors with 0 links):

- entity 39: ov8865 3-0010 (1 pad, 0 link, 0 routes)
- entity 43: ov5693 2-0036 (1 pad, 0 link, 0 routes)
$ cam -l
Available cameras:        <- empty

For comparison, the 6.14 (Ubuntu generic) dw9719 module still has the
i2c:dw9719 alias, and binding works there.

Fix (verified on the affected device)

Restoring the ID table makes the driver bind immediately; the notifier then
completes, links appear, and both cameras register and stream (verified with
libcamera + Cheese/Zoom via v4l2loopback):

static const struct i2c_device_id dw9719_id_table[] = {
	{ "dw9718s", DW9718S },
	{ "dw9719", DW9719 },
	{ "dw9761", DW9761 },
	{ "dw9800k", DW9800K },
	{ }
};
MODULE_DEVICE_TABLE(i2c, dw9719_id_table);

static struct i2c_driver dw9719_i2c_driver = {
	...
	.id_table = dw9719_id_table,
};

(dw9719_probe() already uses i2c_get_match_data(), so the id-table
driver_data slots in cleanly.)

Impact / affected devices

Any IPU3 device whose SSDB declares a dw9719-family VCM — at minimum the
Surface Pro 5/6 rear camera (ov8865 + dw9719). Devices with other VCM types
listed in ipu_vcm_types[] may be affected by the same OF-only pattern if
their drivers lost i2c ID tables too.

Ask

  1. Could linux-surface carry this (tiny) patch in its kernel builds until it
    lands upstream?
  2. Happy to send the patch to linux-media upstream if that helps — guidance
    welcome.

Workaround for users (until patched kernels ship)

A DKMS module that rebuilds the patched driver per-kernel works well; a
write-up with scripts is here: [DISCUSSION POST]

Activity

  1. mfa-nw commented on Aug 9, 2026

    @mfa-nw

    The missing device table has been added back to the main linux kernel from version 7.1.6.

    Hopefully, the linux-surface kernels will get updated and bring back ipu3 camera support.

  2. rocky-III commented on Aug 19, 2026

    @rocky-III
  3. dap39 commented on Aug 20, 2026

    @dap39

    The missing device table has been added back to the main linux kernel from version 7.1.6.

    Hopefully, the linux-surface kernels will get updated and bring back ipu3 camera support.

    I tested Fedora 44 with its latest kernel (7.1.8) and cameras are back in my Surface Go 3, although the "green image" when using the rear camera is still there.

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