Unverified Commit 2a7b7652 authored by Leif Skunberg's avatar Leif Skunberg Committed by Ilpo Järvinen
Browse files

platform/x86: int3472: Handle GPIO type 0x10 (DOVDD)



The Lenovo ThinkPad X1 Fold 16 Gen 1 has an OV5675 sensor (ACPI HID
OVTI5675) behind an INT3472 discrete PMIC controller. The INT3472
_DSM returns GPIO type 0x10 for one of the pins, which controls the
DOVDD (digital I/O power) regulator enable.

Type 0x10 is not currently handled by the driver, causing the GPIO to
be ignored with a warning. Add INT3472_GPIO_TYPE_DOVDD (0x10) and
handle it as a regulator with con_id "dovdd" to match the supply name
used by sensor drivers (e.g. ov5675).

Also increase GPIO_SUPPLY_NAME_LENGTH from 5 to 6 to accommodate
the "dovdd" name (5 chars + null terminator).

Signed-off-by: default avatarLeif Skunberg <diamondback@cohunt.app>
Reviewed-by: default avatarHans de Goede <johannes.goede@oss.qualcomm.com>
Link: https://patch.msgid.link/20260210132129.17943-1-diamondback@cohunt.app


Reviewed-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
parent 37da69db
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -223,6 +223,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_DOVDD:
		*con_id = "dovdd";
		*gpio_flags = GPIO_ACTIVE_HIGH;
		break;
	case INT3472_GPIO_TYPE_HANDSHAKE:
		*con_id = "dvdd";
		*gpio_flags = GPIO_ACTIVE_HIGH;
@@ -251,6 +255,7 @@ static void int3472_get_con_id_and_polarity(struct int3472_discrete_device *int3
 * 0x0b Power enable
 * 0x0c Clock enable
 * 0x0d Privacy LED
 * 0x10 DOVDD (digital I/O voltage)
 * 0x13 Hotplug detect
 *
 * There are some known platform specific quirks where that does not quite
@@ -332,6 +337,7 @@ static int skl_int3472_handle_gpio_resources(struct acpi_resource *ares,
	case INT3472_GPIO_TYPE_CLK_ENABLE:
	case INT3472_GPIO_TYPE_PRIVACY_LED:
	case INT3472_GPIO_TYPE_POWER_ENABLE:
	case INT3472_GPIO_TYPE_DOVDD:
	case INT3472_GPIO_TYPE_HANDSHAKE:
		gpio = skl_int3472_gpiod_get_from_temp_lookup(int3472, agpio, con_id, gpio_flags);
		if (IS_ERR(gpio)) {
@@ -356,6 +362,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_DOVDD:
		case INT3472_GPIO_TYPE_HANDSHAKE:
			ret = skl_int3472_register_regulator(int3472, gpio, enable_time_us,
							     con_id, second_sensor);
+3 −2
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@
#define INT3472_GPIO_TYPE_POWER_ENABLE				0x0b
#define INT3472_GPIO_TYPE_CLK_ENABLE				0x0c
#define INT3472_GPIO_TYPE_PRIVACY_LED				0x0d
#define INT3472_GPIO_TYPE_DOVDD					0x10
#define INT3472_GPIO_TYPE_HANDSHAKE				0x12
#define INT3472_GPIO_TYPE_HOTPLUG_DETECT			0x13

@@ -33,8 +34,8 @@
#define INT3472_MAX_SENSOR_GPIOS				3
#define INT3472_MAX_REGULATORS					3

/* E.g. "avdd\0" */
#define GPIO_SUPPLY_NAME_LENGTH				5
/* E.g. "dovdd\0" */
#define GPIO_SUPPLY_NAME_LENGTH				6
/* 12 chars for acpi_dev_name() + "-", e.g. "ABCD1234:00-" */
#define GPIO_REGULATOR_NAME_LENGTH				(12 + GPIO_SUPPLY_NAME_LENGTH)
/* lower- and upper-case mapping */