]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
platform/x86: int3472: Rework regulator enable-time handling
authorHans de Goede <hansg@kernel.org>
Fri, 25 Jul 2025 21:52:58 +0000 (23:52 +0200)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Tue, 19 Aug 2025 08:37:44 +0000 (11:37 +0300)
Instead of hardcoding the regulator enable-time for INT3472_GPIO_TYPE-
POWER_ENABLE and -HANDSHAKE, make int3472_get_con_id_and_polarity()
set the enable-time.

This will allow overriding the enable time through quirks in
the int3472_gpio_map[].

Signed-off-by: Hans de Goede <hansg@kernel.org>
Reviewed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
Link: https://lore.kernel.org/r/20250725215259.402796-3-hansg@kernel.org
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/intel/int3472/discrete.c

index f3e7e0ab7fad3dffc0bf60aaf9f471c30d6b7a19..791ea565fdc191b216894d2f6fd2fb563a8888df 100644 (file)
@@ -129,6 +129,7 @@ skl_int3472_gpiod_get_from_temp_lookup(struct int3472_discrete_device *int3472,
  * @hid: The ACPI HID of the device without the instance number e.g. INT347E
  * @type_from: The GPIO type from ACPI ?SDT
  * @type_to: The assigned GPIO type, typically same as @type_from
+ * @enable_time_us: Enable time in usec for GPIOs mapped to regulators
  * @con_id: The name of the GPIO for the device
  * @polarity_low: GPIO_ACTIVE_LOW true if the @polarity_low is true,
  * GPIO_ACTIVE_HIGH otherwise
@@ -138,6 +139,7 @@ struct int3472_gpio_map {
        u8 type_from;
        u8 type_to;
        bool polarity_low;
+       unsigned int enable_time_us;
        const char *con_id;
 };
 
@@ -147,6 +149,7 @@ static const struct int3472_gpio_map int3472_gpio_map[] = {
                .type_from = INT3472_GPIO_TYPE_POWERDOWN,
                .type_to = INT3472_GPIO_TYPE_POWER_ENABLE,
                .con_id = "vdd",
+               .enable_time_us = GPIO_REGULATOR_ENABLE_TIME,
        },
        {       /* ov7251 driver / DT-bindings expect "enable" as con_id for reset */
                .hid = "INT347E",
@@ -157,7 +160,8 @@ static const struct int3472_gpio_map int3472_gpio_map[] = {
 };
 
 static void int3472_get_con_id_and_polarity(struct int3472_discrete_device *int3472, u8 *type,
-                                           const char **con_id, unsigned long *gpio_flags)
+                                           const char **con_id, unsigned long *gpio_flags,
+                                           unsigned int *enable_time_us)
 {
        struct acpi_device *adev = int3472->sensor;
        unsigned int i;
@@ -181,9 +185,12 @@ static void int3472_get_con_id_and_polarity(struct int3472_discrete_device *int3
                *gpio_flags = int3472_gpio_map[i].polarity_low ?
                              GPIO_ACTIVE_LOW : GPIO_ACTIVE_HIGH;
                *con_id = int3472_gpio_map[i].con_id;
+               *enable_time_us = int3472_gpio_map[i].enable_time_us;
                return;
        }
 
+       *enable_time_us = GPIO_REGULATOR_ENABLE_TIME;
+
        switch (*type) {
        case INT3472_GPIO_TYPE_RESET:
                *con_id = "reset";
@@ -208,6 +215,8 @@ static void int3472_get_con_id_and_polarity(struct int3472_discrete_device *int3
        case INT3472_GPIO_TYPE_HANDSHAKE:
                *con_id = "dvdd";
                *gpio_flags = GPIO_ACTIVE_HIGH;
+               /* Setups using a handshake pin need 25 ms enable delay */
+               *enable_time_us = 25 * USEC_PER_MSEC;
                break;
        default:
                *con_id = "unknown";
@@ -252,13 +261,15 @@ static int skl_int3472_handle_gpio_resources(struct acpi_resource *ares,
                                             void *data)
 {
        struct int3472_discrete_device *int3472 = data;
+       const char *second_sensor = NULL;
        struct acpi_resource_gpio *agpio;
+       unsigned int enable_time_us;
        u8 active_value, pin, type;
+       unsigned long gpio_flags;
        union acpi_object *obj;
        struct gpio_desc *gpio;
        const char *err_msg;
        const char *con_id;
-       unsigned long gpio_flags;
        int ret;
 
        if (!acpi_gpio_get_io_resource(ares, &agpio))
@@ -281,7 +292,7 @@ static int skl_int3472_handle_gpio_resources(struct acpi_resource *ares,
 
        type = FIELD_GET(INT3472_GPIO_DSM_TYPE, obj->integer.value);
 
-       int3472_get_con_id_and_polarity(int3472, &type, &con_id, &gpio_flags);
+       int3472_get_con_id_and_polarity(int3472, &type, &con_id, &gpio_flags, &enable_time_us);
 
        pin = FIELD_GET(INT3472_GPIO_DSM_PIN, obj->integer.value);
        /* Pin field is not really used under Windows and wraps around at 8 bits */
@@ -330,21 +341,13 @@ static int skl_int3472_handle_gpio_resources(struct acpi_resource *ares,
 
                        break;
                case INT3472_GPIO_TYPE_POWER_ENABLE:
-                       ret = skl_int3472_register_regulator(int3472, gpio,
-                                                            GPIO_REGULATOR_ENABLE_TIME,
-                                                            con_id,
-                                                            int3472->quirks.avdd_second_sensor);
-                       if (ret)
-                               err_msg = "Failed to map power-enable to sensor\n";
-
-                       break;
+                       second_sensor = int3472->quirks.avdd_second_sensor;
+                       fallthrough;
                case INT3472_GPIO_TYPE_HANDSHAKE:
-                       /* Setups using a handshake pin need 25 ms enable delay */
-                       ret = skl_int3472_register_regulator(int3472, gpio,
-                                                            25 * USEC_PER_MSEC,
-                                                            con_id, NULL);
+                       ret = skl_int3472_register_regulator(int3472, gpio, enable_time_us,
+                                                            con_id, second_sensor);
                        if (ret)
-                               err_msg = "Failed to map handshake to sensor\n";
+                               err_msg = "Failed to register regulator\n";
 
                        break;
                default: /* Never reached */