From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Linus Walleij <linus.walleij@linaro.org>,
linux-gpio@vger.kernel.org,
Dmitry Torokhov <dmitry.torokhov@gmail.com>,
Hans de Goede <hdegoede@redhat.com>,
linux-kernel@vger.kernel.org,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
linux-acpi@vger.kernel.org,
Mika Westerberg <mika.westerberg@linux.intel.com>,
Jarkko Nikula <jarkko.nikula@linux.intel.com>,
Jagadish Krishnamoorthy <jagadish.krishnamoorthy@intel.com>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Subject: [PATCH v2 07/12] gpio: acpi: Factor out acpi_gpio_to_gpiod_flags() helper
Date: Tue, 23 May 2017 20:03:22 +0300 [thread overview]
Message-ID: <20170523170327.18055-8-andriy.shevchenko@linux.intel.com> (raw)
In-Reply-To: <20170523170327.18055-1-andriy.shevchenko@linux.intel.com>
The helper function acpi_gpio_to_gpiod_flags() will be used later to configure
pin properly whenever it's requested.
While here, introduce a checking error code returned by gpiod_configure_flags()
and bail out if it's not okay.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Tested-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
---
drivers/gpio/gpiolib-acpi.c | 61 ++++++++++++++++++++++++++-------------------
1 file changed, 36 insertions(+), 25 deletions(-)
diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c
index 740df0e9dcb3..cb61e11558a5 100644
--- a/drivers/gpio/gpiolib-acpi.c
+++ b/drivers/gpio/gpiolib-acpi.c
@@ -423,6 +423,31 @@ static bool acpi_get_driver_gpio_data(struct acpi_device *adev,
return false;
}
+static enum gpiod_flags
+acpi_gpio_to_gpiod_flags(const struct acpi_resource_gpio *agpio)
+{
+ bool pull_up = agpio->pin_config == ACPI_PIN_CONFIG_PULLUP;
+
+ switch (agpio->io_restriction) {
+ case ACPI_IO_RESTRICT_INPUT:
+ return GPIOD_IN;
+ case ACPI_IO_RESTRICT_OUTPUT:
+ /*
+ * 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, otherwise low.
+ */
+ return pull_up ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW;
+ default:
+ /*
+ * Assume that the BIOS has configured the direction and pull
+ * accordingly.
+ */
+ return GPIOD_ASIS;
+ }
+}
+
struct acpi_gpio_lookup {
struct acpi_gpio_info info;
int index;
@@ -740,7 +765,6 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
struct acpi_resource *ares;
int pin_index = (int)address;
acpi_status status;
- bool pull_up;
int length;
int i;
@@ -755,7 +779,6 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
}
agpio = &ares->data.gpio;
- pull_up = agpio->pin_config == ACPI_PIN_CONFIG_PULLUP;
if (WARN_ON(agpio->io_restriction == ACPI_IO_RESTRICT_INPUT &&
function == ACPI_WRITE)) {
@@ -806,35 +829,23 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
}
if (!found) {
- desc = gpiochip_request_own_desc(chip, pin,
- "ACPI:OpRegion");
+ enum gpiod_flags flags = acpi_gpio_to_gpiod_flags(agpio);
+ const char *label = "ACPI:OpRegion";
+ int err;
+
+ desc = gpiochip_request_own_desc(chip, pin, label);
if (IS_ERR(desc)) {
status = AE_ERROR;
mutex_unlock(&achip->conn_lock);
goto out;
}
- switch (agpio->io_restriction) {
- case ACPI_IO_RESTRICT_INPUT:
- gpiod_direction_input(desc);
- break;
- case ACPI_IO_RESTRICT_OUTPUT:
- /*
- * 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, otherwise
- * low.
- */
- gpiod_direction_output(desc, pull_up);
- break;
- default:
- /*
- * Assume that the BIOS has configured the
- * direction and pull accordingly.
- */
- break;
+ err = gpiod_configure_flags(desc, label, 0, flags);
+ if (err < 0) {
+ status = AE_NOT_CONFIGURED;
+ gpiochip_free_own_desc(desc);
+ mutex_unlock(&achip->conn_lock);
+ goto out;
}
conn = kzalloc(sizeof(*conn), GFP_KERNEL);
--
2.11.0
next prev parent reply other threads:[~2017-05-23 17:03 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-23 17:03 [PATCH v2 00/12] gpio: acpi: Make it working Andy Shevchenko
2017-05-23 17:03 ` [PATCH v2 01/12] gpiolib: Export gpiod_configure_flags() to internal users Andy Shevchenko
2017-05-29 9:15 ` Linus Walleij
2017-05-23 17:03 ` [PATCH v2 02/12] gpio: acpi: Align acpi_find_gpio() with DT version Andy Shevchenko
2017-05-29 9:16 ` Linus Walleij
2017-05-23 17:03 ` [PATCH v2 03/12] gpio: acpi: Do sanity check for GpioInt in acpi_find_gpio() Andy Shevchenko
2017-05-29 9:17 ` Linus Walleij
2017-05-23 17:03 ` [PATCH v2 04/12] gpio: acpi: Even more tighten up ACPI GPIO lookups Andy Shevchenko
2017-05-29 9:18 ` Linus Walleij
2017-05-23 17:03 ` [PATCH v2 05/12] gpio: acpi: Synchronize acpi_find_gpio() and acpi_gpio_count() Andy Shevchenko
2017-05-29 9:19 ` Linus Walleij
2017-05-23 17:03 ` [PATCH v2 06/12] gpio: acpi: Explain how to get GPIO descriptors in ACPI case Andy Shevchenko
2017-05-29 9:20 ` Linus Walleij
2017-05-23 17:03 ` Andy Shevchenko [this message]
2017-05-29 9:21 ` [PATCH v2 07/12] gpio: acpi: Factor out acpi_gpio_to_gpiod_flags() helper Linus Walleij
2017-05-23 17:03 ` [PATCH v2 08/12] gpio: acpi: Override GPIO initialization flags Andy Shevchenko
2017-05-29 9:22 ` Linus Walleij
2017-05-23 17:03 ` [PATCH v2 09/12] gpio: acpi: Split out acpi_gpio_get_irq_resource() helper Andy Shevchenko
2017-05-24 11:53 ` Mika Westerberg
2017-05-29 9:23 ` Linus Walleij
2017-05-23 17:03 ` [PATCH v2 10/12] PNP / ACPI: add support for GpioInt resource type Andy Shevchenko
2017-05-24 12:02 ` Mika Westerberg
2017-05-29 9:26 ` Linus Walleij
2017-05-23 17:03 ` [PATCH v2 11/12] PNP / ACPI: join strings back for better maintenance Andy Shevchenko
2017-05-24 12:02 ` Mika Westerberg
2017-05-29 9:28 ` Linus Walleij
2017-05-23 17:03 ` [PATCH v2 12/12] PNP / ACPI: remove FSF address Andy Shevchenko
2017-05-24 12:06 ` Mika Westerberg
2017-05-29 9:29 ` Linus Walleij
2017-05-29 9:31 ` [PATCH v2 00/12] gpio: acpi: Make it working Linus Walleij
2017-05-29 13:09 ` 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=20170523170327.18055-8-andriy.shevchenko@linux.intel.com \
--to=andriy.shevchenko@linux.intel.com \
--cc=dmitry.torokhov@gmail.com \
--cc=hdegoede@redhat.com \
--cc=jagadish.krishnamoorthy@intel.com \
--cc=jarkko.nikula@linux.intel.com \
--cc=linus.walleij@linaro.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mika.westerberg@linux.intel.com \
--cc=rjw@rjwysocki.net \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.