From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Linus Walleij <linus.walleij@linaro.org>,
Bartosz Golaszewski <bgolaszewski@baylibre.com>,
linux-gpio@vger.kernel.org
Cc: Vasile-Laurentiu Stanimir
<vasile-laurentiu.stanimir@windriver.com>,
Hans de Goede <hdegoede@redhat.com>,
Mika Westerberg <mika.westerberg@linux.intel.com>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Subject: [PATCH v7 13/18] gpiolib: acpi: Set initial value for output pin based on bias and polarity
Date: Thu, 12 Nov 2020 00:20:03 +0200 [thread overview]
Message-ID: <20201111222008.39993-14-andriy.shevchenko@linux.intel.com> (raw)
In-Reply-To: <20201111222008.39993-1-andriy.shevchenko@linux.intel.com>
From: Vasile-Laurentiu Stanimir <vasile-laurentiu.stanimir@windriver.com>
GpioIo() resources don't contain an initial value for the output pin.
Therefore instead of deducting its value solely based on bias field
we should deduce that value from the polarity and the bias fields.
Typical scenario is, when pin is defined in the table and its polarity,
specified in _DSD or via platform code, is defined as active low,
in the following call chain:
-> acpi_populate_gpio_lookup()
-> acpi_gpio_to_gpiod_flags()
it will return GPIOD_OUT_HIGH if bias is set no matter if polarity
is GPIO_ACTIVE_LOW, so it will return the current level instead of
the logical level.
Cc: Hans de Goede <hdegoede@redhat.com>
Cc: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Vasile-Laurentiu Stanimir <vasile-laurentiu.stanimir@windriver.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/gpio/gpiolib-acpi.c | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c
index ac1bde0720f2..b47d5e8edaeb 100644
--- a/drivers/gpio/gpiolib-acpi.c
+++ b/drivers/gpio/gpiolib-acpi.c
@@ -206,7 +206,7 @@ static void acpi_gpiochip_request_irqs(struct acpi_gpio_chip *acpi_gpio)
}
static enum gpiod_flags
-acpi_gpio_to_gpiod_flags(const struct acpi_resource_gpio *agpio)
+acpi_gpio_to_gpiod_flags(const struct acpi_resource_gpio *agpio, int polarity)
{
switch (agpio->io_restriction) {
case ACPI_IO_RESTRICT_INPUT:
@@ -215,15 +215,17 @@ acpi_gpio_to_gpiod_flags(const struct acpi_resource_gpio *agpio)
/*
* ACPI GPIO resources don't contain an initial value for the
* GPIO. Therefore we deduce that value from the pull field
- * instead. If the pin is pulled up we assume default to be
- * high, if it is pulled down we assume default to be low,
- * otherwise we leave pin untouched.
+ * and the polarity instead. If the pin is pulled up we assume
+ * default to be high, if it is pulled down we assume default
+ * to be low, otherwise we leave pin untouched. For active low
+ * polarity values will be switched. See also
+ * Documentation/firmware-guide/acpi/gpio-properties.rst.
*/
switch (agpio->pin_config) {
case ACPI_PIN_CONFIG_PULLUP:
- return GPIOD_OUT_HIGH;
+ return polarity == GPIO_ACTIVE_LOW ? GPIOD_OUT_LOW : GPIOD_OUT_HIGH;
case ACPI_PIN_CONFIG_PULLDOWN:
- return GPIOD_OUT_LOW;
+ return polarity == GPIO_ACTIVE_LOW ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW;
default:
break;
}
@@ -683,8 +685,8 @@ static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data)
lookup->info.polarity = agpio->polarity;
lookup->info.triggering = agpio->triggering;
} else {
- lookup->info.flags = acpi_gpio_to_gpiod_flags(agpio);
lookup->info.polarity = lookup->active_low;
+ lookup->info.flags = acpi_gpio_to_gpiod_flags(agpio, lookup->info.polarity);
}
}
@@ -1055,12 +1057,13 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
}
if (!found) {
- enum gpiod_flags flags = acpi_gpio_to_gpiod_flags(agpio);
+ int polarity = GPIO_ACTIVE_HIGH;
+ enum gpiod_flags flags = acpi_gpio_to_gpiod_flags(agpio, polarity);
const char *label = "ACPI:OpRegion";
int ret;
desc = gpiochip_request_own_desc(chip, pin, label,
- GPIO_ACTIVE_HIGH,
+ polarity,
flags);
if (IS_ERR(desc)) {
mutex_unlock(&achip->conn_lock);
--
2.28.0
next prev parent reply other threads:[~2020-11-11 22:20 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-11 22:19 [PATCH v7 00/18] gpiolib: acpi: pin configuration fixes Andy Shevchenko
2020-11-11 22:19 ` [PATCH v7 01/18] gpiolib: Replace unsigned by unsigned int Andy Shevchenko
2020-11-11 22:19 ` [PATCH v7 02/18] gpiolib: add missed break statement Andy Shevchenko
2020-11-11 22:19 ` [PATCH v7 03/18] gpiolib: use proper API to pack pin configuration parameters Andy Shevchenko
2020-11-11 22:19 ` [PATCH v7 04/18] gpiolib: Extract gpio_set_config_with_argument() for future use Andy Shevchenko
2020-11-11 22:19 ` [PATCH v7 05/18] gpiolib: move bias related code from gpio_set_config() to gpio_set_bias() Andy Shevchenko
2020-11-11 22:19 ` [PATCH v7 06/18] gpiolib: Extract gpio_set_config_with_argument_optional() helper Andy Shevchenko
2020-11-11 22:19 ` [PATCH v7 07/18] gpiolib: Introduce gpio_set_debounce_timeout() for internal use Andy Shevchenko
2020-11-12 8:16 ` Mika Westerberg
2020-11-12 10:19 ` Andy Shevchenko
2020-11-12 11:06 ` Mika Westerberg
2020-11-12 11:12 ` Hans de Goede
2020-11-12 12:08 ` Andy Shevchenko
2020-11-11 22:19 ` [PATCH v7 08/18] gpiolib: acpi: Respect bias settings for GpioInt() resource Andy Shevchenko
2020-11-11 22:19 ` [PATCH v7 09/18] gpiolib: acpi: Use named item for enum gpiod_flags variable Andy Shevchenko
2020-11-11 22:20 ` [PATCH v7 10/18] gpiolib: acpi: Take into account debounce settings Andy Shevchenko
2020-11-11 22:20 ` [PATCH v7 11/18] gpiolib: acpi: Move non-critical code outside of critical section Andy Shevchenko
2020-11-12 8:17 ` Mika Westerberg
2020-11-11 22:20 ` [PATCH v7 12/18] gpiolib: acpi: Move acpi_gpio_to_gpiod_flags() upper in the code Andy Shevchenko
2020-11-11 22:20 ` Andy Shevchenko [this message]
2020-11-12 9:10 ` [PATCH v7 13/18] gpiolib: acpi: Set initial value for output pin based on bias and polarity Mika Westerberg
2020-11-11 22:20 ` [PATCH v7 14/18] gpiolib: acpi: Make acpi_gpio_to_gpiod_flags() usable for GpioInt() Andy Shevchenko
2020-11-11 22:20 ` [PATCH v7 15/18] gpiolib: acpi: Extract acpi_request_own_gpiod() helper Andy Shevchenko
2020-11-11 22:20 ` [PATCH v7 16/18] gpiolib: acpi: Convert pin_index to be u16 Andy Shevchenko
2020-11-11 22:20 ` [PATCH v7 17/18] gpiolib: acpi: Use BIT() macro to increase readability Andy Shevchenko
2020-11-11 22:20 ` [PATCH v7 18/18] gpiolib: acpi: Make Intel GPIO tree official for GPIO ACPI work Andy Shevchenko
2020-11-12 10:24 ` [PATCH v7 00/18] gpiolib: acpi: pin configuration fixes Andy Shevchenko
2020-11-12 14:16 ` Andy Shevchenko
2020-11-15 16:04 ` Linus Walleij
2020-11-16 9:48 ` Andy Shevchenko
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=20201111222008.39993-14-andriy.shevchenko@linux.intel.com \
--to=andriy.shevchenko@linux.intel.com \
--cc=bgolaszewski@baylibre.com \
--cc=hdegoede@redhat.com \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=mika.westerberg@linux.intel.com \
--cc=vasile-laurentiu.stanimir@windriver.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).