X86 platform drivers
 help / color / mirror / Atom feed
* [PATCH v3] platform/x86: int3472: support the POWER1 GPIO type
@ 2026-08-29  8:29 Jakob Berg Jespersen
  2026-08-30 12:30 ` Hans de Goede
  2026-09-01  6:33 ` D. Manresa
  0 siblings, 2 replies; 8+ messages in thread
From: Jakob Berg Jespersen @ 2026-08-29  8:29 UTC (permalink / raw)
  To: Daniel Scally, Sakari Ailus, Hans de Goede, Ilpo Järvinen
  Cc: platform-driver-x86, linux-media, linux-kernel, Tooraj Taraz,
	Joseph V. Lavigne, D. Manresa, Jakob Berg Jespersen

INT3472 can describe a second sensor power rail as a GPIO of type
POWER1 (0x08), which the driver does not recognise, so the rail is left
unmapped and never enabled:

  int3472-discrete INT3472:01: GPIO type 0x08 unknown; the sensor may
  not work

On the Microsoft Surface Pro 7+ the rear camera's INT3472 (INT347A,
ov8865) has such a pin; without it the ov8865 "dvdd" supply resolves to
a dummy regulator and the sensor never probes.

Define the POWER0 (0x07) and POWER1 (0x08) GPIO types and map POWER1 to
a regulator with con_id "dvdd" for all devices, the supply the in-tree
ov8865 driver already requests. POWER0 is defined but left unmapped, as
no device that uses it is known.

Out-of-tree work approached the same rail by exposing it to the sensor
as a new "pwr1" supply (linux-surface PR #1867 for the Surface Pro 9,
PR #2201 for the Pro 7+ ov8865); mapping POWER1 to the existing "dvdd"
keeps the change contained to int3472.

With this change the Surface Pro 7+ rear camera probes and streams
reliably.

Link: https://github.com/linux-surface/linux-surface/pull/1867
Link: https://github.com/linux-surface/linux-surface/pull/2201
Suggested-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Jakob Berg Jespersen <dev@berg.pm>
---
Changes in v3:
- No functional changes; the patch is identical to v2, rebased onto
  current pdx86/for-next (which has since gained the multi-HID GPIO map
  entries and the IMX471 "vana" entries).
- Resent with linux-media@vger.kernel.org on Cc, as requested.
- Link to v2: https://patch.msgid.link/20260729-sp7plus-int3472-v2-1-cdfaf97ac3ad@berg.pm

Changes in v2:

- Reworked from a per-device INT347A quirk into a generic mapping of the
  POWER1 (0x08) GPIO type to "dvdd" for all devices, per review.
- Added INT3472_GPIO_TYPE_POWER0 (0x07) and POWER1 (0x08) definitions;
  POWER0 is defined but left unmapped for now.
- Retested on the Surface Pro 7+ (kernel 7.1.5): the rear ov8865 probes,
  instantiates its VCM, and streams.
- Link to v1: https://patch.msgid.link/20260719-sp7plus-int3472-v1-1-521a43f5c191@berg.pm
---
 drivers/platform/x86/intel/int3472/discrete.c | 8 ++++++++
 include/linux/platform_data/x86/int3472.h     | 2 ++
 2 files changed, 10 insertions(+)

diff --git a/drivers/platform/x86/intel/int3472/discrete.c b/drivers/platform/x86/intel/int3472/discrete.c
index 6c729fcfce5d..6ab8e589fcd3 100644
--- a/drivers/platform/x86/intel/int3472/discrete.c
+++ b/drivers/platform/x86/intel/int3472/discrete.c
@@ -266,6 +266,10 @@ static void int3472_get_con_id_and_polarity(struct int3472_discrete_device *int3
 		*con_id = "avdd";
 		*gpio_flags = GPIO_ACTIVE_HIGH;
 		break;
+	case INT3472_GPIO_TYPE_POWER1:
+		*con_id = "dvdd";
+		*gpio_flags = GPIO_ACTIVE_HIGH;
+		break;
 	case INT3472_GPIO_TYPE_DOVDD:
 		*con_id = "dovdd";
 		*gpio_flags = GPIO_ACTIVE_HIGH;
@@ -296,6 +300,8 @@ static void int3472_get_con_id_and_polarity(struct int3472_discrete_device *int3
  * 0x00 Reset
  * 0x01 Power down
  * 0x02 Strobe
+ * 0x07 Power 0
+ * 0x08 Power 1
  * 0x0b Power enable
  * 0x0c Clock enable
  * 0x0d Privacy LED
@@ -382,6 +388,7 @@ static int skl_int3472_handle_gpio_resources(struct acpi_resource *ares,
 	case INT3472_GPIO_TYPE_PRIVACY_LED:
 	case INT3472_GPIO_TYPE_STROBE:
 	case INT3472_GPIO_TYPE_POWER_ENABLE:
+	case INT3472_GPIO_TYPE_POWER1:
 	case INT3472_GPIO_TYPE_DOVDD:
 	case INT3472_GPIO_TYPE_HANDSHAKE:
 		gpio = skl_int3472_gpiod_get_from_temp_lookup(int3472, agpio, con_id, gpio_flags);
@@ -408,6 +415,7 @@ static int skl_int3472_handle_gpio_resources(struct acpi_resource *ares,
 		case INT3472_GPIO_TYPE_POWER_ENABLE:
 			second_sensor = int3472->quirks.avdd_second_sensor;
 			fallthrough;
+		case INT3472_GPIO_TYPE_POWER1:
 		case INT3472_GPIO_TYPE_DOVDD:
 		case INT3472_GPIO_TYPE_HANDSHAKE:
 			ret = skl_int3472_register_regulator(int3472, gpio, enable_time_us,
diff --git a/include/linux/platform_data/x86/int3472.h b/include/linux/platform_data/x86/int3472.h
index a73841dfae27..b1040e36deb8 100644
--- a/include/linux/platform_data/x86/int3472.h
+++ b/include/linux/platform_data/x86/int3472.h
@@ -25,6 +25,8 @@
 #define INT3472_GPIO_TYPE_RESET					0x00
 #define INT3472_GPIO_TYPE_POWERDOWN				0x01
 #define INT3472_GPIO_TYPE_STROBE				0x02
+#define INT3472_GPIO_TYPE_POWER0				0x07
+#define INT3472_GPIO_TYPE_POWER1				0x08
 #define INT3472_GPIO_TYPE_POWER_ENABLE				0x0b
 #define INT3472_GPIO_TYPE_CLK_ENABLE				0x0c
 #define INT3472_GPIO_TYPE_PRIVACY_LED				0x0d

---
base-commit: 5b05bb3f6c5716fab6911e12d60dd1f43ad9806a
change-id: 20260719-sp7plus-int3472-8f014b8de79c

Best regards,
--  
Jakob Berg Jespersen <dev@berg.pm>


^ permalink raw reply related	[flat|nested] 8+ messages in thread
* Re: [PATCH v3] platform/x86: int3472: support the POWER1 GPIO type
@ 2026-08-30 13:41 Sergey Lebedev
  2026-08-31  9:21 ` Jakob Berg Jespersen
  2026-08-31  9:39 ` Hans de Goede
  0 siblings, 2 replies; 8+ messages in thread
From: Sergey Lebedev @ 2026-08-30 13:41 UTC (permalink / raw)
  To: Jakob Berg Jespersen, Daniel Scally, Sakari Ailus, Hans de Goede,
	Ilpo Järvinen
  Cc: platform-driver-x86, linux-media, linux-kernel

Hans pointed me at this from a report I sent this morning about the same
GPIO type on a Surface Pro 11 - thank you, and sorry for the duplicate
question. I have now tested this patch on that machine, which is a third
model and, more usefully, a different sensor. Result below, with the part
that is still missing for this sensor family.

Tested-by: Sergey Lebedev <lsa.uz@pm.me>   # Surface Pro 11, INT3472 side

What the patch fixes here
-------------------------

Built on 7.0.0-30 (Ubuntu 26.04). The warning is gone and the rail is
mapped:

  before: int3472-discrete INT3472:00: GPIO type 0x08 unknown;
                                       the sensor may not work
  after : no int3472 messages at all

  /sys/class/regulator:
    regulator.1  INT3472:00-avdd
    regulator.2  INT3472:00-dvdd     <- new, from this patch
    regulator.3  INT3472:01-avdd
    regulator.4  INT3472:01-dovdd
    regulator.5  INT3472:02-avdd

Nothing else regressed: audio, Secure Boot and module signing unaffected,
no failed units.

What it does not fix, and why that is not this patch's fault
------------------------------------------------------------

The camera is exactly as dead as before:

  ov13858 i2c-OVTID858:00: failed to find sensor: -5
  every regulator: num_users=0, state=disabled
  /dev/media0: 0 entities

The rear sensor here is an OV13858, and the in-tree ov13858 driver requests
no regulators and touches no GPIOs at all - zero `regulator` and zero
`gpiod` references in drivers/media/i2c/ov13858.c. So INT3472:00-dvdd is
registered and then never claimed by anyone, and the sensor is still held
in reset because nothing releases it.

That is exactly the difference between your machine and this one. ov8865
asks for "dvdd", "dovdd" and "avdd" by name, so mapping POWER1 to "dvdd"
completes the picture for the Surface Pro 7+. ov13858 asks for nothing.

The same conclusion was reached independently on the Surface Pro 10, which
carries the same OV13858:

  https://github.com/linux-surface/linux-surface/issues/2153

There they had to add reset-GPIO handling to ov13858_probe() and force the
regulators on, and describe the latter as too broad for upstream.

So: this patch is correct and necessary, and for the OV13858 machines it is
not sufficient. The remaining work is in the sensor driver rather than in
int3472, which seems worth stating explicitly so nobody expects the Pro 10
or Pro 11 rear camera to start working when this lands.

If it would help, I am happy to test a patch teaching ov13858 to request
its supplies and release reset - it is the same shape as what ov8865
already does. The machine is here and I can build and boot kernels on it.

One note for anyone reproducing this out-of-tree: the module build uses
/usr/src/linux-headers-<ver>/include/, not the patched source tree, so
patching only the tree gives 'INT3472_GPIO_TYPE_POWER1' undeclared. The
installed header has to be patched too.

Thanks,
Sergey


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-09-01  6:33 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-29  8:29 [PATCH v3] platform/x86: int3472: support the POWER1 GPIO type Jakob Berg Jespersen
2026-08-30 12:30 ` Hans de Goede
2026-09-01  6:33 ` D. Manresa
  -- strict thread matches above, loose matches on Subject: below --
2026-08-30 13:41 Sergey Lebedev
2026-08-31  9:21 ` Jakob Berg Jespersen
2026-08-31  9:34   ` Hans de Goede
2026-08-31  9:40     ` Jakob Berg Jespersen
2026-08-31  9:39 ` Hans de Goede

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox