usleep_range(6000, 10000);              /* T4: > 5ms */
 
-       /* end select I2C slave addr */
-       error = gpiod_direction_input(ts->gpiod_rst);
-       if (error)
-               goto error;
+       /*
+        * Put the reset pin back in to input / high-impedance mode to save
+        * power. Only do this in the non ACPI case since some ACPI boards
+        * don't have a pull-up, so there the reset pin must stay active-high.
+        */
+       if (ts->irq_pin_access_method == IRQ_PIN_ACCESS_GPIO) {
+               error = gpiod_direction_input(ts->gpiod_rst);
+               if (error)
+                       goto error;
+       }
 
        return 0;
 
                return -EINVAL;
        }
 
+       /*
+        * Normally we put the reset pin in input / high-impedance mode to save
+        * power. But some x86/ACPI boards don't have a pull-up, so for the ACPI
+        * case, leave the pin as is. This results in the pin not being touched
+        * at all on x86/ACPI boards, except when needed for error-recover.
+        */
+       ts->gpiod_rst_flags = GPIOD_ASIS;
+
        return devm_acpi_dev_add_driver_gpios(dev, gpio_mapping);
 }
 #else
                return -EINVAL;
        dev = &ts->client->dev;
 
+       /*
+        * By default we request the reset pin as input, leaving it in
+        * high-impedance when not resetting the controller to save power.
+        */
+       ts->gpiod_rst_flags = GPIOD_IN;
+
        ts->avdd28 = devm_regulator_get(dev, "AVDD28");
        if (IS_ERR(ts->avdd28)) {
                error = PTR_ERR(ts->avdd28);
        ts->gpiod_int = gpiod;
 
        /* Get the reset line GPIO pin number */
-       gpiod = devm_gpiod_get_optional(dev, GOODIX_GPIO_RST_NAME, GPIOD_IN);
+       gpiod = devm_gpiod_get_optional(dev, GOODIX_GPIO_RST_NAME, ts->gpiod_rst_flags);
        if (IS_ERR(gpiod)) {
                error = PTR_ERR(gpiod);
                if (error != -EPROBE_DEFER)