From: wyibo6109@gmail.com
To: Mauro Carvalho Chehab <mchehab@kernel.org>, linux-media@vger.kernel.org
Cc: Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Daniel Scally <dan.scally@ideasonboard.com>,
Sakari Ailus <sakari.ailus@linux.intel.com>,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
Yibo Wang <wyibo6109@gmail.com>, David Heidelberg <david@ixit.cz>
Subject: [PATCH 2/2] media: i2c: dw9719: Add DW9714VA support
Date: Fri, 16 Oct 2026 04:09:30 -0500 [thread overview]
Message-ID: <20261016090930.947830-2-wyibo6109@gmail.com> (raw)
In-Reply-To: <20261016090930.947830-1-wyibo6109@gmail.com>
From: Yibo Wang <wyibo6109@gmail.com>
The dongwoon,dw9714va compatible names the DW9714V revision found on
the OnePlus Pad 4 ("iceland") rear camera module. DW9714VA is a
coined name, not an official part number; the revision shares its
IC INFO id (0xFE) with the other DW9714V revisions.
The part answers the DW9719 register interface in its register-mapped
("advanced") mode: the chip responds to register-addressed transfers,
IC INFO returns manufacturer 0xF / model 0xE (0xFE), and the reset
value of the VCM_FREQ register (0x60) matches the DW9719/DW9800
prescaler-in-[7:6] / SACT-in-[5:0] layout. The SAC mode field in
MODE is shifted by 6, like on the DW9800K.
Both the register layout and the power-on behaviour differ from the
currently available DW9714V datasheet (Rev. 0.03G). The datasheet
documents an advanced mode with SAC_MODE in [3:0] of SAC_CFG and
separate PRESC (0x07, [1:0], reset 0x03) and SACT (0x08, [6:0],
reset 0x7F) registers, and a power-on into the normal (direct DAC)
mode that enters the advanced mode only through an explicit
0xED 0xAB command sequence. The observed part follows the DW9719
layout instead and is in the advanced mode at the first host
access; given the revision variance it gets its own coined
compatible, dongwoon,dw9714va.
Operation was verified on the device by sweeping the focus position
across the full range while observing the lens: the motion is
smooth with no ringing noise, so SAC works through the DW9800K
write path.
Detect the chip through INFO and drive it through the DW9800K write
path.
The SAC parameters are module-specific: they have to match the
mechanical resonance (tVIB) of the lens module. For the iceland rear
module they were recovered from the vendor module firmware
(com.qti.sensormodule.icelandmain.bin, which embeds the actuator init
on this CamX generation): MODE 0x80 (SAC mode field 2) and FREQ 0x79
(prescaler 1, SACT 0x39). They were verified on hardware by register
readback (CONTROL 0x02, MODE 0x80, FREQ 0x79) and a three-frame
capture at focus position 450 with no I2C errors. No such data
exists for any other module with this part, so the driver carries no
DW9714VA-specific defaults: it starts from the family defaults and
boards are expected to provide the tuning through the existing
dongwoon,sac-mode and dongwoon,vcm-prescale DT properties.
The datasheet-conformant DW9714V and DW9714A in normal (direct DAC)
mode are covered by the dw9714 driver; a series documenting them in
the dongwoon,dw9714 binding by David Heidelberg is in flight:
https://lore.kernel.org/linux-media/20260729-dw9714v-v1-0-3c479b3cf8c0@ixit.cz/
Tested on the OnePlus Pad 4 (iceland) rear camera module on a
v7.2-based downstream tree.
Tested-by: Yibo Wang <wyibo6109@gmail.com>
Cc: David Heidelberg <david@ixit.cz>
Signed-off-by: Yibo Wang <wyibo6109@gmail.com>
---
drivers/media/i2c/dw9719.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/drivers/media/i2c/dw9719.c b/drivers/media/i2c/dw9719.c
index 3b7ba88fd..2afe37361 100644
--- a/drivers/media/i2c/dw9719.c
+++ b/drivers/media/i2c/dw9719.c
@@ -45,6 +45,15 @@
#define DW9719_INFO CCI_REG8(0)
#define DW9719_ID 0xF1
#define DW9761_ID 0xF4
+/*
+ * DW9714V family id, shared by the revisions. The DW9714VA model
+ * names the revision found on the OnePlus Pad 4 (iceland) camera
+ * modules, always in its register-mapped ("advanced") mode: IC INFO
+ * reads manufacturer 0xF / model 0xE and the CONTROL/VCM/STATUS/MODE/
+ * FREQ registers follow the DW9719 layout, not the layout the DW9714V
+ * datasheet documents for its advanced mode.
+ */
+#define DW9714V_ID 0xFE
#define DW9719_CONTROL CCI_REG8(2)
#define DW9719_STANDBY 0x00
@@ -75,6 +84,7 @@
#define to_dw9719_device(x) container_of(x, struct dw9719_device, sd)
enum dw9719_model {
+ DW9714VA,
DW9718S,
DW9719,
DW9761,
@@ -153,6 +163,16 @@ static int dw9719_power_up(struct dw9719_device *dw9719, bool detect)
return ret;
switch (val) {
+ case DW9714V_ID:
+ dw9719->model = DW9714VA;
+ /*
+ * No SAC tuning data exists for DW9714VA modules in
+ * general; start from the family defaults and let DT
+ * provide the module-specific values.
+ */
+ dw9719->sac_mode = DW9719_DEFAULT_SAC;
+ dw9719->vcm_freq = DW9719_DEFAULT_VCM_FREQ;
+ break;
case DW9719_ID:
dw9719->model = DW9719;
dw9719->mode_low_bits = 0x00;
@@ -188,6 +208,7 @@ static int dw9719_power_up(struct dw9719_device *dw9719, bool detect)
}
switch (dw9719->model) {
+ case DW9714VA:
case DW9800K:
cci_write(dw9719->regmap, DW9719_CONTROL, DW9719_ENABLE_RINGING, &ret);
cci_write(dw9719->regmap, DW9719_MODE,
@@ -440,6 +461,7 @@ static void dw9719_remove(struct i2c_client *client)
}
static const struct i2c_device_id dw9719_id_table[] = {
+ { .name = "dw9714va", .driver_data = (kernel_ulong_t)DW9714VA },
{ .name = "dw9718s", .driver_data = (kernel_ulong_t)DW9718S },
{ .name = "dw9719", .driver_data = (kernel_ulong_t)DW9719 },
{ .name = "dw9761", .driver_data = (kernel_ulong_t)DW9761 },
@@ -449,6 +471,7 @@ static const struct i2c_device_id dw9719_id_table[] = {
MODULE_DEVICE_TABLE(i2c, dw9719_id_table);
static const struct of_device_id dw9719_of_table[] = {
+ { .compatible = "dongwoon,dw9714va", .data = (const void *)DW9714VA },
{ .compatible = "dongwoon,dw9718s", .data = (const void *)DW9718S },
{ .compatible = "dongwoon,dw9719", .data = (const void *)DW9719 },
{ .compatible = "dongwoon,dw9761", .data = (const void *)DW9761 },
--
2.53.0
next prev parent reply other threads:[~2026-10-16 9:09 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-16 9:09 [PATCH 1/2] dt-bindings: media: i2c: dongwoon,dw9719: Document DW9714VA wyibo6109
2026-10-16 9:09 ` wyibo6109 [this message]
2026-10-16 9:18 ` [PATCH 2/2] media: i2c: dw9719: Add DW9714VA support sashiko-bot
2026-10-16 9:18 ` [PATCH 1/2] dt-bindings: media: i2c: dongwoon,dw9719: Document DW9714VA sashiko-bot
2026-10-16 13:03 ` Rob Herring (Arm)
2026-10-16 13:11 ` David Heidelberg
2026-10-16 16:04 ` Yibo Wang
2026-10-16 21:03 ` David Heidelberg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261016090930.947830-2-wyibo6109@gmail.com \
--to=wyibo6109@gmail.com \
--cc=conor+dt@kernel.org \
--cc=dan.scally@ideasonboard.com \
--cc=david@ixit.cz \
--cc=devicetree@vger.kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=robh@kernel.org \
--cc=sakari.ailus@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).